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