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