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