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