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 would fail
|
---|
9 | -- we should provide thread safe allocation routines for the Z_Stream.
|
---|
10 | --
|
---|
11 | -- $Id: mtest.adb,v 1.4 2004/07/23 07:49:54 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 | Dummy : Character;
|
---|
152 |
|
---|
153 | begin
|
---|
154 | Ada.Text_IO.Get_Immediate (Dummy);
|
---|
155 | Stop := True;
|
---|
156 | end MTest;
|
---|