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