1*44bedb31SLionel Sambuc---------------------------------------------------------------- 2*44bedb31SLionel Sambuc-- ZLib for Ada thick binding. -- 3*44bedb31SLionel Sambuc-- -- 4*44bedb31SLionel Sambuc-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- 5*44bedb31SLionel Sambuc-- -- 6*44bedb31SLionel Sambuc-- Open source license information is in the zlib.ads file. -- 7*44bedb31SLionel Sambuc---------------------------------------------------------------- 8*44bedb31SLionel Sambuc-- Continuous test for ZLib multithreading. If the test would fail 9*44bedb31SLionel Sambuc-- we should provide thread safe allocation routines for the Z_Stream. 10*44bedb31SLionel Sambuc-- 11*44bedb31SLionel Sambuc-- Id: mtest.adb,v 1.4 2004/07/23 07:49:54 vagul Exp 12*44bedb31SLionel Sambuc 13*44bedb31SLionel Sambucwith ZLib; 14*44bedb31SLionel Sambucwith Ada.Streams; 15*44bedb31SLionel Sambucwith Ada.Numerics.Discrete_Random; 16*44bedb31SLionel Sambucwith Ada.Text_IO; 17*44bedb31SLionel Sambucwith Ada.Exceptions; 18*44bedb31SLionel Sambucwith Ada.Task_Identification; 19*44bedb31SLionel Sambuc 20*44bedb31SLionel Sambucprocedure MTest is 21*44bedb31SLionel Sambuc use Ada.Streams; 22*44bedb31SLionel Sambuc use ZLib; 23*44bedb31SLionel Sambuc 24*44bedb31SLionel Sambuc Stop : Boolean := False; 25*44bedb31SLionel Sambuc 26*44bedb31SLionel Sambuc pragma Atomic (Stop); 27*44bedb31SLionel Sambuc 28*44bedb31SLionel Sambuc subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#; 29*44bedb31SLionel Sambuc 30*44bedb31SLionel Sambuc package Random_Elements is 31*44bedb31SLionel Sambuc new Ada.Numerics.Discrete_Random (Visible_Symbols); 32*44bedb31SLionel Sambuc 33*44bedb31SLionel Sambuc task type Test_Task; 34*44bedb31SLionel Sambuc 35*44bedb31SLionel Sambuc task body Test_Task is 36*44bedb31SLionel Sambuc Buffer : Stream_Element_Array (1 .. 100_000); 37*44bedb31SLionel Sambuc Gen : Random_Elements.Generator; 38*44bedb31SLionel Sambuc 39*44bedb31SLionel Sambuc Buffer_First : Stream_Element_Offset; 40*44bedb31SLionel Sambuc Compare_First : Stream_Element_Offset; 41*44bedb31SLionel Sambuc 42*44bedb31SLionel Sambuc Deflate : Filter_Type; 43*44bedb31SLionel Sambuc Inflate : Filter_Type; 44*44bedb31SLionel Sambuc 45*44bedb31SLionel Sambuc procedure Further (Item : in Stream_Element_Array); 46*44bedb31SLionel Sambuc 47*44bedb31SLionel Sambuc procedure Read_Buffer 48*44bedb31SLionel Sambuc (Item : out Ada.Streams.Stream_Element_Array; 49*44bedb31SLionel Sambuc Last : out Ada.Streams.Stream_Element_Offset); 50*44bedb31SLionel Sambuc 51*44bedb31SLionel Sambuc ------------- 52*44bedb31SLionel Sambuc -- Further -- 53*44bedb31SLionel Sambuc ------------- 54*44bedb31SLionel Sambuc 55*44bedb31SLionel Sambuc procedure Further (Item : in Stream_Element_Array) is 56*44bedb31SLionel Sambuc 57*44bedb31SLionel Sambuc procedure Compare (Item : in Stream_Element_Array); 58*44bedb31SLionel Sambuc 59*44bedb31SLionel Sambuc ------------- 60*44bedb31SLionel Sambuc -- Compare -- 61*44bedb31SLionel Sambuc ------------- 62*44bedb31SLionel Sambuc 63*44bedb31SLionel Sambuc procedure Compare (Item : in Stream_Element_Array) is 64*44bedb31SLionel Sambuc Next_First : Stream_Element_Offset := Compare_First + Item'Length; 65*44bedb31SLionel Sambuc begin 66*44bedb31SLionel Sambuc if Buffer (Compare_First .. Next_First - 1) /= Item then 67*44bedb31SLionel Sambuc raise Program_Error; 68*44bedb31SLionel Sambuc end if; 69*44bedb31SLionel Sambuc 70*44bedb31SLionel Sambuc Compare_First := Next_First; 71*44bedb31SLionel Sambuc end Compare; 72*44bedb31SLionel Sambuc 73*44bedb31SLionel Sambuc procedure Compare_Write is new ZLib.Write (Write => Compare); 74*44bedb31SLionel Sambuc begin 75*44bedb31SLionel Sambuc Compare_Write (Inflate, Item, No_Flush); 76*44bedb31SLionel Sambuc end Further; 77*44bedb31SLionel Sambuc 78*44bedb31SLionel Sambuc ----------------- 79*44bedb31SLionel Sambuc -- Read_Buffer -- 80*44bedb31SLionel Sambuc ----------------- 81*44bedb31SLionel Sambuc 82*44bedb31SLionel Sambuc procedure Read_Buffer 83*44bedb31SLionel Sambuc (Item : out Ada.Streams.Stream_Element_Array; 84*44bedb31SLionel Sambuc Last : out Ada.Streams.Stream_Element_Offset) 85*44bedb31SLionel Sambuc is 86*44bedb31SLionel Sambuc Buff_Diff : Stream_Element_Offset := Buffer'Last - Buffer_First; 87*44bedb31SLionel Sambuc Next_First : Stream_Element_Offset; 88*44bedb31SLionel Sambuc begin 89*44bedb31SLionel Sambuc if Item'Length <= Buff_Diff then 90*44bedb31SLionel Sambuc Last := Item'Last; 91*44bedb31SLionel Sambuc 92*44bedb31SLionel Sambuc Next_First := Buffer_First + Item'Length; 93*44bedb31SLionel Sambuc 94*44bedb31SLionel Sambuc Item := Buffer (Buffer_First .. Next_First - 1); 95*44bedb31SLionel Sambuc 96*44bedb31SLionel Sambuc Buffer_First := Next_First; 97*44bedb31SLionel Sambuc else 98*44bedb31SLionel Sambuc Last := Item'First + Buff_Diff; 99*44bedb31SLionel Sambuc Item (Item'First .. Last) := Buffer (Buffer_First .. Buffer'Last); 100*44bedb31SLionel Sambuc Buffer_First := Buffer'Last + 1; 101*44bedb31SLionel Sambuc end if; 102*44bedb31SLionel Sambuc end Read_Buffer; 103*44bedb31SLionel Sambuc 104*44bedb31SLionel Sambuc procedure Translate is new Generic_Translate 105*44bedb31SLionel Sambuc (Data_In => Read_Buffer, 106*44bedb31SLionel Sambuc Data_Out => Further); 107*44bedb31SLionel Sambuc 108*44bedb31SLionel Sambuc begin 109*44bedb31SLionel Sambuc Random_Elements.Reset (Gen); 110*44bedb31SLionel Sambuc 111*44bedb31SLionel Sambuc Buffer := (others => 20); 112*44bedb31SLionel Sambuc 113*44bedb31SLionel Sambuc Main : loop 114*44bedb31SLionel Sambuc for J in Buffer'Range loop 115*44bedb31SLionel Sambuc Buffer (J) := Random_Elements.Random (Gen); 116*44bedb31SLionel Sambuc 117*44bedb31SLionel Sambuc Deflate_Init (Deflate); 118*44bedb31SLionel Sambuc Inflate_Init (Inflate); 119*44bedb31SLionel Sambuc 120*44bedb31SLionel Sambuc Buffer_First := Buffer'First; 121*44bedb31SLionel Sambuc Compare_First := Buffer'First; 122*44bedb31SLionel Sambuc 123*44bedb31SLionel Sambuc Translate (Deflate); 124*44bedb31SLionel Sambuc 125*44bedb31SLionel Sambuc if Compare_First /= Buffer'Last + 1 then 126*44bedb31SLionel Sambuc raise Program_Error; 127*44bedb31SLionel Sambuc end if; 128*44bedb31SLionel Sambuc 129*44bedb31SLionel Sambuc Ada.Text_IO.Put_Line 130*44bedb31SLionel Sambuc (Ada.Task_Identification.Image 131*44bedb31SLionel Sambuc (Ada.Task_Identification.Current_Task) 132*44bedb31SLionel Sambuc & Stream_Element_Offset'Image (J) 133*44bedb31SLionel Sambuc & ZLib.Count'Image (Total_Out (Deflate))); 134*44bedb31SLionel Sambuc 135*44bedb31SLionel Sambuc Close (Deflate); 136*44bedb31SLionel Sambuc Close (Inflate); 137*44bedb31SLionel Sambuc 138*44bedb31SLionel Sambuc exit Main when Stop; 139*44bedb31SLionel Sambuc end loop; 140*44bedb31SLionel Sambuc end loop Main; 141*44bedb31SLionel Sambuc exception 142*44bedb31SLionel Sambuc when E : others => 143*44bedb31SLionel Sambuc Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E)); 144*44bedb31SLionel Sambuc Stop := True; 145*44bedb31SLionel Sambuc end Test_Task; 146*44bedb31SLionel Sambuc 147*44bedb31SLionel Sambuc Test : array (1 .. 4) of Test_Task; 148*44bedb31SLionel Sambuc 149*44bedb31SLionel Sambuc pragma Unreferenced (Test); 150*44bedb31SLionel Sambuc 151*44bedb31SLionel Sambuc Dummy : Character; 152*44bedb31SLionel Sambuc 153*44bedb31SLionel Sambucbegin 154*44bedb31SLionel Sambuc Ada.Text_IO.Get_Immediate (Dummy); 155*44bedb31SLionel Sambuc Stop := True; 156*44bedb31SLionel Sambucend MTest; 157