[1049] | 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;
|
---|