You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
4.4 KiB
156 lines
4.4 KiB
---------------------------------------------------------------- |
|
-- 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;
|
|
|