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