OSDN Git Service

2011-12-05 Bob Duff <duff@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / s-tratas-default.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                 GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                 --
4 --                                                                          --
5 --                 S Y S T E M . T R A C E S . T A S K I N G                --
6 --                                                                          --
7 --                                  B o d y                                 --
8 --                                                                          --
9 --           Copyright (C) 2001-2009 Free Software Foundation, Inc.         --
10 --                                                                          --
11 -- GNARL is free software;  you can redistribute it  and/or modify it under --
12 -- terms of the  GNU General Public License as published  by the Free Soft- --
13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
17 --                                                                          --
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
19 -- additional permissions described in the GCC Runtime Library Exception,   --
20 -- version 3.1, as published by the Free Software Foundation.               --
21 --                                                                          --
22 -- You should have received a copy of the GNU General Public License and    --
23 -- a copy of the GCC Runtime Library Exception along with this program;     --
24 -- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
25 -- <http://www.gnu.org/licenses/>.                                          --
26 --                                                                          --
27 -- GNAT was originally developed  by the GNAT team at  New York University. --
28 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
29 --                                                                          --
30 ------------------------------------------------------------------------------
31
32 with System.Tasking;       use System.Tasking;
33 with System.Soft_Links;
34 with System.Parameters;
35 with System.Traces.Format; use System.Traces.Format;
36 with System.Traces;        use System.Traces;
37
38 package body System.Traces.Tasking is
39
40    use System.Traces;
41
42    package SSL renames System.Soft_Links;
43
44    function Extract_Accepts (Task_Name : Task_Id) return String_Trace;
45    --  This function is used to extract data joined with
46    --  W_Select, WT_Select, W_Accept events
47
48    ---------------------
49    -- Send_Trace_Info --
50    ---------------------
51
52    procedure Send_Trace_Info (Id : Trace_T; Task_Name2 : Task_Id) is
53       Task_S  : constant String := SSL.Task_Name.all;
54       Task2_S : constant String :=
55                   Task_Name2.Common.Task_Image
56                     (1 .. Task_Name2.Common.Task_Image_Len);
57       Trace_S : String (1 .. 6 + Task_S'Length + Task2_S'Length);
58
59       L0 : constant Integer := Task_S'Length;
60       L1 : constant Integer := Task2_S'Length;
61
62    begin
63       if Parameters.Runtime_Traces then
64          case Id is
65             when M_RDV_Complete | PO_Done =>
66                Trace_S (1 .. 3)                 := "/N:";
67                Trace_S (4 .. 3 + L0)            := Task_S;
68                Trace_S (4 + L0 .. 6 + L0)       := "/C:";
69                Trace_S (7 + L0 .. Trace_S'Last) := Task2_S;
70                Send_Trace (Id, Trace_S);
71
72             when E_Missed =>
73                Trace_S (1 .. 3)                 := "/N:";
74                Trace_S (4 .. 3 + L0)            := Task_S;
75                Trace_S (4 + L0 .. 6 + L0)       := "/A:";
76                Trace_S (7 + L0 .. Trace_S'Last) := Task2_S;
77                Send_Trace (Id, Trace_S);
78
79             when E_Kill =>
80                Trace_S (1 .. 3)                 := "/N:";
81                Trace_S (4 .. 3 + L1)            := Task2_S;
82                Trace_S (4 + L1 .. Trace_S'Last) := (others => ' ');
83                Send_Trace (Id, Trace_S);
84
85             when T_Create =>
86                Trace_S (1 .. 3)                 := "/N:";
87                Trace_S (4 .. 3 + L1)            := Task2_S;
88                Trace_S (4 + L1 .. Trace_S'Last) := (others => ' ');
89                Send_Trace (Id, Trace_S);
90
91             when others =>
92                null;
93                --  should raise an exception ???
94          end case;
95       end if;
96    end Send_Trace_Info;
97
98    procedure Send_Trace_Info
99      (Id           : Trace_T;
100       Task_Name2   : Task_Id;
101       Entry_Number : Entry_Index)
102    is
103       Task_S  : constant String := SSL.Task_Name.all;
104       Task2_S : constant String :=
105                   Task_Name2.Common.Task_Image
106                     (1 .. Task_Name2.Common.Task_Image_Len);
107       Entry_S   : constant String := Integer'Image (Integer (Entry_Number));
108       Trace_S   : String (1 .. 9 + Task_S'Length
109                                  + Task2_S'Length + Entry_S'Length);
110
111       L0 : constant Integer := Task_S'Length;
112       L1 : constant Integer := Task_S'Length + Entry_S'Length;
113       L2 : constant Integer := Task_S'Length + Task2_S'Length;
114
115    begin
116       if Parameters.Runtime_Traces then
117          case Id is
118             when M_Accept_Complete =>
119                Trace_S (1 .. 3)                  := "/N:";
120                Trace_S (4 .. 3 + L0)             := Task_S;
121                Trace_S (4 + L0 .. 6 + L0)        := "/E:";
122                Trace_S (7 + L0 .. 6 + L1)         := Entry_S;
123                Trace_S (7 + L1 .. 9 + L1)        := "/C:";
124                Trace_S (10 + L1 .. Trace_S'Last) := Task2_S;
125                Send_Trace (Id, Trace_S);
126
127             when W_Call =>
128                Trace_S (1 .. 3)                  := "/N:";
129                Trace_S (4 .. 3 + L0)             := Task_S;
130                Trace_S (4 + L0 .. 6 + L0)        := "/A:";
131                Trace_S (7 + L0 .. 6 + L2)        := Task2_S;
132                Trace_S (7 + L2 .. 9 + L2)        := "/C:";
133                Trace_S (10 + L2 .. Trace_S'Last) := Entry_S;
134                Send_Trace (Id, Trace_S);
135
136             when others =>
137                null;
138                --  should raise an exception ???
139          end case;
140       end if;
141    end Send_Trace_Info;
142
143    procedure Send_Trace_Info
144      (Id           : Trace_T;
145       Task_Name    : Task_Id;
146       Task_Name2   : Task_Id;
147       Entry_Number : Entry_Index)
148    is
149       Task_S  : constant String :=
150                   Task_Name.Common.Task_Image
151                     (1 .. Task_Name.Common.Task_Image_Len);
152       Task2_S : constant String :=
153                   Task_Name2.Common.Task_Image
154                     (1 .. Task_Name2.Common.Task_Image_Len);
155       Entry_S   : constant String := Integer'Image (Integer (Entry_Number));
156       Trace_S   : String (1 .. 9 + Task_S'Length
157                                  + Task2_S'Length + Entry_S'Length);
158
159       L0 : constant Integer := Task_S'Length;
160       L1 : constant Integer := Task_S'Length + Entry_S'Length;
161
162    begin
163       if Parameters.Runtime_Traces then
164          case Id is
165             when PO_Run =>
166                Trace_S (1 .. 3)                  := "/N:";
167                Trace_S (4 .. 3 + L0)             := Task_S;
168                Trace_S (4 + L0 .. 6 + L0)        := "/E:";
169                Trace_S (7 + L0 .. 6 + L1)        := Entry_S;
170                Trace_S (7 + L1 .. 9 + L1)        := "/C:";
171                Trace_S (10 + L1 .. Trace_S'Last) := Task2_S;
172                Send_Trace (Id, Trace_S);
173
174             when others =>
175                null;
176                --  should raise an exception ???
177          end case;
178       end if;
179    end Send_Trace_Info;
180
181    procedure Send_Trace_Info (Id : Trace_T; Entry_Number : Entry_Index) is
182       Task_S  : constant String := SSL.Task_Name.all;
183       Entry_S : constant String := Integer'Image (Integer (Entry_Number));
184       Trace_S : String (1 .. 6 + Task_S'Length + Entry_S'Length);
185
186       L0 : constant Integer := Task_S'Length;
187
188    begin
189       if Parameters.Runtime_Traces then
190          Trace_S (1 .. 3)                 := "/N:";
191          Trace_S (4 .. 3 + L0)            := Task_S;
192          Trace_S (4 + L0 .. 6 + L0)       := "/E:";
193          Trace_S (7 + L0 .. Trace_S'Last) := Entry_S;
194          Send_Trace (Id, Trace_S);
195       end if;
196    end Send_Trace_Info;
197
198    procedure Send_Trace_Info
199      (Id         : Trace_T;
200       Task_Name  : Task_Id;
201       Task_Name2 : Task_Id)
202    is
203       Task_S  : constant String :=
204                   Task_Name.Common.Task_Image
205                     (1 .. Task_Name.Common.Task_Image_Len);
206       Task2_S : constant String :=
207                   Task_Name2.Common.Task_Image
208                     (1 .. Task_Name2.Common.Task_Image_Len);
209       Trace_S : String (1 .. 6 + Task_S'Length + Task2_S'Length);
210
211       L0 : constant Integer := Task2_S'Length;
212
213    begin
214       if Parameters.Runtime_Traces then
215          Trace_S (1 .. 3)                 := "/N:";
216          Trace_S (4 .. 3 + L0)            := Task2_S;
217          Trace_S (4 + L0 .. 6 + L0)       := "/P:";
218          Trace_S (7 + L0 .. Trace_S'Last) := Task_S;
219          Send_Trace (Id, Trace_S);
220       end if;
221    end Send_Trace_Info;
222
223    procedure Send_Trace_Info
224      (Id           : Trace_T;
225       Acceptor     : Task_Id;
226       Entry_Number : Entry_Index;
227       Timeout      : Duration)
228    is
229       Task_S     : constant String := SSL.Task_Name.all;
230       Acceptor_S : constant String :=
231                      Acceptor.Common.Task_Image
232                        (1 .. Acceptor.Common.Task_Image_Len);
233       Entry_S    : constant String := Integer'Image (Integer (Entry_Number));
234       Timeout_S  : constant String := Duration'Image (Timeout);
235       Trace_S    : String (1 .. 12 + Task_S'Length + Acceptor_S'Length
236                                    + Entry_S'Length + Timeout_S'Length);
237
238       L0 : constant Integer := Task_S'Length;
239       L1 : constant Integer := Task_S'Length + Acceptor_S'Length;
240       L2 : constant Integer :=
241              Task_S'Length + Acceptor_S'Length + Entry_S'Length;
242
243    begin
244       if Parameters.Runtime_Traces then
245          Trace_S (1 .. 3)                  := "/N:";
246          Trace_S (4 .. 3 + L0)             := Task_S;
247          Trace_S (4 + L0 .. 6 + L0)        := "/A:";
248          Trace_S (7 + L0 .. 6 + L1)        := Acceptor_S;
249          Trace_S (7 + L1 .. 9 + L1)        := "/E:";
250          Trace_S (10 + L1 .. 9 + L2)       := Entry_S;
251          Trace_S (10 + L2 .. 12 + L2)      := "/T:";
252          Trace_S (13 + L2 .. Trace_S'Last) := Timeout_S;
253          Send_Trace (Id, Trace_S);
254       end if;
255    end Send_Trace_Info;
256
257    procedure Send_Trace_Info
258      (Id           : Trace_T;
259       Entry_Number : Entry_Index;
260       Timeout      : Duration)
261    is
262       Task_S    : constant String := SSL.Task_Name.all;
263       Entry_S   : constant String := Integer'Image (Integer (Entry_Number));
264       Timeout_S : constant String := Duration'Image (Timeout);
265       Trace_S   : String (1 .. 9 + Task_S'Length
266                                  + Entry_S'Length + Timeout_S'Length);
267
268       L0 : constant Integer := Task_S'Length;
269       L1 : constant Integer := Task_S'Length + Entry_S'Length;
270
271    begin
272       if Parameters.Runtime_Traces then
273          Trace_S (1 .. 3)                  := "/N:";
274          Trace_S (4 .. 3 + L0)             := Task_S;
275          Trace_S (4 + L0 .. 6 + L0)        := "/E:";
276          Trace_S (7 + L0 .. 6 + L1)        := Entry_S;
277          Trace_S (7 + L1 .. 9 + L1)        := "/T:";
278          Trace_S (10 + L1 .. Trace_S'Last) := Timeout_S;
279          Send_Trace (Id, Trace_S);
280       end if;
281    end Send_Trace_Info;
282
283    procedure Send_Trace_Info
284      (Id        : Trace_T;
285       Task_Name : Task_Id;
286       Number    : Integer)
287    is
288       Task_S    : constant String := SSL.Task_Name.all;
289       Number_S  : constant String := Integer'Image (Number);
290       Accepts_S : constant String := Extract_Accepts (Task_Name);
291       Trace_S   : String (1 .. 9 + Task_S'Length
292                                  + Number_S'Length + Accepts_S'Length);
293
294       L0 : constant Integer := Task_S'Length;
295       L1 : constant Integer := Task_S'Length + Number_S'Length;
296
297    begin
298       if Parameters.Runtime_Traces then
299          Trace_S (1 .. 3)                  := "/N:";
300          Trace_S (4 .. 3 + L0)             := Task_S;
301          Trace_S (4 + L0 .. 6 + L0)        := "/#:";
302          Trace_S (7 + L0 .. 6 + L1)        := Number_S;
303          Trace_S (7 + L1 .. 9 + L1)        := "/E:";
304          Trace_S (10 + L1 .. Trace_S'Last) := Accepts_S;
305          Send_Trace (Id, Trace_S);
306       end if;
307    end Send_Trace_Info;
308
309    procedure Send_Trace_Info
310      (Id        : Trace_T;
311       Task_Name : Task_Id;
312       Number    : Integer;
313       Timeout   : Duration)
314    is
315       Task_S    : constant String := SSL.Task_Name.all;
316       Timeout_S : constant String := Duration'Image (Timeout);
317       Number_S  : constant String := Integer'Image (Number);
318       Accepts_S : constant String := Extract_Accepts (Task_Name);
319       Trace_S   : String (1 .. 12 + Task_S'Length + Timeout_S'Length
320                                   + Number_S'Length + Accepts_S'Length);
321
322       L0 : constant Integer := Task_S'Length;
323       L1 : constant Integer := Task_S'Length + Timeout_S'Length;
324       L2 : constant Integer :=
325              Task_S'Length + Timeout_S'Length + Number_S'Length;
326
327    begin
328       if Parameters.Runtime_Traces then
329          Trace_S (1 .. 3)                  := "/N:";
330          Trace_S (4 .. 3 + L0)             := Task_S;
331          Trace_S (4 + L0 .. 6 + L0)        := "/T:";
332          Trace_S (7 + L0 .. 6 + L1)        := Timeout_S;
333          Trace_S (7 + L1 .. 9 + L1)        := "/#:";
334          Trace_S (10 + L1 .. 9 + L2)       := Number_S;
335          Trace_S (10 + L2 .. 12 + L2)      := "/E:";
336          Trace_S (13 + L2 .. Trace_S'Last) := Accepts_S;
337          Send_Trace (Id, Trace_S);
338       end if;
339    end Send_Trace_Info;
340
341    ---------------------
342    -- Extract_Accepts --
343    ---------------------
344
345    --  This function returns a string in which all opened
346    --  Accepts or Selects are given, separated by semi-colons.
347
348    function Extract_Accepts (Task_Name : Task_Id) return String_Trace is
349       Info_Annex : String_Trace := (ASCII.NUL, others => ' ');
350
351    begin
352       for J in Task_Name.Open_Accepts'First ..
353         Task_Name.Open_Accepts'Last - 1
354       loop
355          Info_Annex := Append (Info_Annex, Integer'Image
356                                (Integer (Task_Name.Open_Accepts (J).S)) & ",");
357       end loop;
358
359       Info_Annex := Append (Info_Annex,
360                             Integer'Image (Integer
361                                            (Task_Name.Open_Accepts
362                                             (Task_Name.Open_Accepts'Last).S)));
363       return Info_Annex;
364    end Extract_Accepts;
365 end System.Traces.Tasking;