Chris@43: ---------------------------------------------------------------- Chris@43: -- ZLib for Ada thick binding. -- Chris@43: -- -- Chris@43: -- Copyright (C) 2002-2003 Dmitriy Anisimkov -- Chris@43: -- -- Chris@43: -- Open source license information is in the zlib.ads file. -- Chris@43: ---------------------------------------------------------------- Chris@43: -- Continuous test for ZLib multithreading. If the test would fail Chris@43: -- we should provide thread safe allocation routines for the Z_Stream. Chris@43: -- Chris@43: -- $Id: mtest.adb,v 1.4 2004/07/23 07:49:54 vagul Exp $ Chris@43: Chris@43: with ZLib; Chris@43: with Ada.Streams; Chris@43: with Ada.Numerics.Discrete_Random; Chris@43: with Ada.Text_IO; Chris@43: with Ada.Exceptions; Chris@43: with Ada.Task_Identification; Chris@43: Chris@43: procedure MTest is Chris@43: use Ada.Streams; Chris@43: use ZLib; Chris@43: Chris@43: Stop : Boolean := False; Chris@43: Chris@43: pragma Atomic (Stop); Chris@43: Chris@43: subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#; Chris@43: Chris@43: package Random_Elements is Chris@43: new Ada.Numerics.Discrete_Random (Visible_Symbols); Chris@43: Chris@43: task type Test_Task; Chris@43: Chris@43: task body Test_Task is Chris@43: Buffer : Stream_Element_Array (1 .. 100_000); Chris@43: Gen : Random_Elements.Generator; Chris@43: Chris@43: Buffer_First : Stream_Element_Offset; Chris@43: Compare_First : Stream_Element_Offset; Chris@43: Chris@43: Deflate : Filter_Type; Chris@43: Inflate : Filter_Type; Chris@43: Chris@43: procedure Further (Item : in Stream_Element_Array); Chris@43: Chris@43: procedure Read_Buffer Chris@43: (Item : out Ada.Streams.Stream_Element_Array; Chris@43: Last : out Ada.Streams.Stream_Element_Offset); Chris@43: Chris@43: ------------- Chris@43: -- Further -- Chris@43: ------------- Chris@43: Chris@43: procedure Further (Item : in Stream_Element_Array) is Chris@43: Chris@43: procedure Compare (Item : in Stream_Element_Array); Chris@43: Chris@43: ------------- Chris@43: -- Compare -- Chris@43: ------------- Chris@43: Chris@43: procedure Compare (Item : in Stream_Element_Array) is Chris@43: Next_First : Stream_Element_Offset := Compare_First + Item'Length; Chris@43: begin Chris@43: if Buffer (Compare_First .. Next_First - 1) /= Item then Chris@43: raise Program_Error; Chris@43: end if; Chris@43: Chris@43: Compare_First := Next_First; Chris@43: end Compare; Chris@43: Chris@43: procedure Compare_Write is new ZLib.Write (Write => Compare); Chris@43: begin Chris@43: Compare_Write (Inflate, Item, No_Flush); Chris@43: end Further; Chris@43: Chris@43: ----------------- Chris@43: -- Read_Buffer -- Chris@43: ----------------- Chris@43: Chris@43: procedure Read_Buffer Chris@43: (Item : out Ada.Streams.Stream_Element_Array; Chris@43: Last : out Ada.Streams.Stream_Element_Offset) Chris@43: is Chris@43: Buff_Diff : Stream_Element_Offset := Buffer'Last - Buffer_First; Chris@43: Next_First : Stream_Element_Offset; Chris@43: begin Chris@43: if Item'Length <= Buff_Diff then Chris@43: Last := Item'Last; Chris@43: Chris@43: Next_First := Buffer_First + Item'Length; Chris@43: Chris@43: Item := Buffer (Buffer_First .. Next_First - 1); Chris@43: Chris@43: Buffer_First := Next_First; Chris@43: else Chris@43: Last := Item'First + Buff_Diff; Chris@43: Item (Item'First .. Last) := Buffer (Buffer_First .. Buffer'Last); Chris@43: Buffer_First := Buffer'Last + 1; Chris@43: end if; Chris@43: end Read_Buffer; Chris@43: Chris@43: procedure Translate is new Generic_Translate Chris@43: (Data_In => Read_Buffer, Chris@43: Data_Out => Further); Chris@43: Chris@43: begin Chris@43: Random_Elements.Reset (Gen); Chris@43: Chris@43: Buffer := (others => 20); Chris@43: Chris@43: Main : loop Chris@43: for J in Buffer'Range loop Chris@43: Buffer (J) := Random_Elements.Random (Gen); Chris@43: Chris@43: Deflate_Init (Deflate); Chris@43: Inflate_Init (Inflate); Chris@43: Chris@43: Buffer_First := Buffer'First; Chris@43: Compare_First := Buffer'First; Chris@43: Chris@43: Translate (Deflate); Chris@43: Chris@43: if Compare_First /= Buffer'Last + 1 then Chris@43: raise Program_Error; Chris@43: end if; Chris@43: Chris@43: Ada.Text_IO.Put_Line Chris@43: (Ada.Task_Identification.Image Chris@43: (Ada.Task_Identification.Current_Task) Chris@43: & Stream_Element_Offset'Image (J) Chris@43: & ZLib.Count'Image (Total_Out (Deflate))); Chris@43: Chris@43: Close (Deflate); Chris@43: Close (Inflate); Chris@43: Chris@43: exit Main when Stop; Chris@43: end loop; Chris@43: end loop Main; Chris@43: exception Chris@43: when E : others => Chris@43: Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E)); Chris@43: Stop := True; Chris@43: end Test_Task; Chris@43: Chris@43: Test : array (1 .. 4) of Test_Task; Chris@43: Chris@43: pragma Unreferenced (Test); Chris@43: Chris@43: Dummy : Character; Chris@43: Chris@43: begin Chris@43: Ada.Text_IO.Get_Immediate (Dummy); Chris@43: Stop := True; Chris@43: end MTest;