]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/ada-tasks.c
[Ada/tasks] Optimize ATCB lookups
[thirdparty/binutils-gdb.git] / gdb / ada-tasks.c
1 /* Copyright (C) 1992, 1993, 1994, 1997, 1998, 1999, 2000, 2003, 2004, 2005,
2 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
18
19 #include "defs.h"
20 #include "observer.h"
21 #include "gdbcmd.h"
22 #include "target.h"
23 #include "ada-lang.h"
24 #include "gdbcore.h"
25 #include "inferior.h"
26 #include "gdbthread.h"
27
28 /* The name of the array in the GNAT runtime where the Ada Task Control
29 Block of each task is stored. */
30 #define KNOWN_TASKS_NAME "system__tasking__debug__known_tasks"
31
32 /* The maximum number of tasks known to the Ada runtime */
33 static const int MAX_NUMBER_OF_KNOWN_TASKS = 1000;
34
35 enum task_states
36 {
37 Unactivated,
38 Runnable,
39 Terminated,
40 Activator_Sleep,
41 Acceptor_Sleep,
42 Entry_Caller_Sleep,
43 Async_Select_Sleep,
44 Delay_Sleep,
45 Master_Completion_Sleep,
46 Master_Phase_2_Sleep,
47 Interrupt_Server_Idle_Sleep,
48 Interrupt_Server_Blocked_Interrupt_Sleep,
49 Timer_Server_Sleep,
50 AST_Server_Sleep,
51 Asynchronous_Hold,
52 Interrupt_Server_Blocked_On_Event_Flag,
53 Activating,
54 Acceptor_Delay_Sleep
55 };
56
57 /* A short description corresponding to each possible task state. */
58 static const char *task_states[] = {
59 N_("Unactivated"),
60 N_("Runnable"),
61 N_("Terminated"),
62 N_("Child Activation Wait"),
63 N_("Accept or Select Term"),
64 N_("Waiting on entry call"),
65 N_("Async Select Wait"),
66 N_("Delay Sleep"),
67 N_("Child Termination Wait"),
68 N_("Wait Child in Term Alt"),
69 "",
70 "",
71 "",
72 "",
73 N_("Asynchronous Hold"),
74 "",
75 N_("Activating"),
76 N_("Selective Wait")
77 };
78
79 /* A longer description corresponding to each possible task state. */
80 static const char *long_task_states[] = {
81 N_("Unactivated"),
82 N_("Runnable"),
83 N_("Terminated"),
84 N_("Waiting for child activation"),
85 N_("Blocked in accept or select with terminate"),
86 N_("Waiting on entry call"),
87 N_("Asynchronous Selective Wait"),
88 N_("Delay Sleep"),
89 N_("Waiting for children termination"),
90 N_("Waiting for children in terminate alternative"),
91 "",
92 "",
93 "",
94 "",
95 N_("Asynchronous Hold"),
96 "",
97 N_("Activating"),
98 N_("Blocked in selective wait statement")
99 };
100
101 /* The index of certain important fields in the Ada Task Control Block
102 record and sub-records. */
103
104 struct tcb_fieldnos
105 {
106 /* Fields in record Ada_Task_Control_Block. */
107 int common;
108 int entry_calls;
109 int atc_nesting_level;
110
111 /* Fields in record Common_ATCB. */
112 int state;
113 int parent;
114 int priority;
115 int image;
116 int image_len; /* This field may be missing. */
117 int call;
118 int ll;
119
120 /* Fields in Task_Primitives.Private_Data. */
121 int ll_thread;
122 int ll_lwp; /* This field may be missing. */
123
124 /* Fields in Common_ATCB.Call.all. */
125 int call_self;
126 };
127
128 /* The type description for the ATCB record and subrecords, and
129 the associated tcb_fieldnos. For efficiency reasons, these are made
130 static globals so that we can compute them only once the first time
131 and reuse them later. Set to NULL if the types haven't been computed
132 yet, or if they may be obsolete (for instance after having loaded
133 a new binary). */
134
135 static struct type *atcb_type = NULL;
136 static struct type *atcb_common_type = NULL;
137 static struct type *atcb_ll_type = NULL;
138 static struct type *atcb_call_type = NULL;
139 static struct tcb_fieldnos fieldno;
140
141 /* Set to 1 when the cached address of System.Tasking.Debug.Known_Tasks
142 might be stale and so needs to be recomputed. */
143 static int ada_tasks_check_symbol_table = 1;
144
145 /* The list of Ada tasks.
146
147 Note: To each task we associate a number that the user can use to
148 reference it - this number is printed beside each task in the tasks
149 info listing displayed by "info tasks". This number is equal to
150 its index in the vector + 1. Reciprocally, to compute the index
151 of a task in the vector, we need to substract 1 from its number. */
152 typedef struct ada_task_info ada_task_info_s;
153 DEF_VEC_O(ada_task_info_s);
154 static VEC(ada_task_info_s) *task_list = NULL;
155
156 /* When non-zero, this flag indicates that the current task_list
157 is obsolete, and should be recomputed before it is accessed. */
158 static int stale_task_list_p = 1;
159
160 /* Return the task number of the task whose ptid is PTID, or zero
161 if the task could not be found. */
162
163 int
164 ada_get_task_number (ptid_t ptid)
165 {
166 int i;
167
168 for (i=0; i < VEC_length (ada_task_info_s, task_list); i++)
169 if (ptid_equal (VEC_index (ada_task_info_s, task_list, i)->ptid, ptid))
170 return i + 1;
171
172 return 0; /* No matching task found. */
173 }
174
175 /* Return the task number of the task that matches TASK_ID, or zero
176 if the task could not be found. */
177
178 static int
179 get_task_number_from_id (CORE_ADDR task_id)
180 {
181 int i;
182
183 for (i = 0; i < VEC_length (ada_task_info_s, task_list); i++)
184 {
185 struct ada_task_info *task_info =
186 VEC_index (ada_task_info_s, task_list, i);
187
188 if (task_info->task_id == task_id)
189 return i + 1;
190 }
191
192 /* Task not found. Return 0. */
193 return 0;
194 }
195
196 /* Return non-zero if TASK_NUM is a valid task number. */
197
198 int
199 valid_task_id (int task_num)
200 {
201 ada_build_task_list (0);
202 return (task_num > 0
203 && task_num <= VEC_length (ada_task_info_s, task_list));
204 }
205
206 /* Return non-zero iff the task STATE corresponds to a non-terminated
207 task state. */
208
209 static int
210 ada_task_is_alive (struct ada_task_info *task_info)
211 {
212 return (task_info->state != Terminated);
213 }
214
215 /* Call the ITERATOR function once for each Ada task that hasn't been
216 terminated yet. */
217
218 void
219 iterate_over_live_ada_tasks (ada_task_list_iterator_ftype *iterator)
220 {
221 int i, nb_tasks;
222 struct ada_task_info *task;
223
224 ada_build_task_list (0);
225 nb_tasks = VEC_length (ada_task_info_s, task_list);
226
227 for (i = 0; i < nb_tasks; i++)
228 {
229 task = VEC_index (ada_task_info_s, task_list, i);
230 if (!ada_task_is_alive (task))
231 continue;
232 iterator (task);
233 }
234 }
235
236 /* Extract the contents of the value as a string whose length is LENGTH,
237 and store the result in DEST. */
238
239 static void
240 value_as_string (char *dest, struct value *val, int length)
241 {
242 memcpy (dest, value_contents (val), length);
243 dest[length] = '\0';
244 }
245
246 /* Extract the string image from the fat string corresponding to VAL,
247 and store it in DEST. If the string length is greater than MAX_LEN,
248 then truncate the result to the first MAX_LEN characters of the fat
249 string. */
250
251 static void
252 read_fat_string_value (char *dest, struct value *val, int max_len)
253 {
254 struct value *array_val;
255 struct value *bounds_val;
256 int len;
257
258 /* The following variables are made static to avoid recomputing them
259 each time this function is called. */
260 static int initialize_fieldnos = 1;
261 static int array_fieldno;
262 static int bounds_fieldno;
263 static int upper_bound_fieldno;
264
265 /* Get the index of the fields that we will need to read in order
266 to extract the string from the fat string. */
267 if (initialize_fieldnos)
268 {
269 struct type *type = value_type (val);
270 struct type *bounds_type;
271
272 array_fieldno = ada_get_field_index (type, "P_ARRAY", 0);
273 bounds_fieldno = ada_get_field_index (type, "P_BOUNDS", 0);
274
275 bounds_type = TYPE_FIELD_TYPE (type, bounds_fieldno);
276 if (TYPE_CODE (bounds_type) == TYPE_CODE_PTR)
277 bounds_type = TYPE_TARGET_TYPE (bounds_type);
278 if (TYPE_CODE (bounds_type) != TYPE_CODE_STRUCT)
279 error (_("Unknown task name format. Aborting"));
280 upper_bound_fieldno = ada_get_field_index (bounds_type, "UB0", 0);
281
282 initialize_fieldnos = 0;
283 }
284
285 /* Get the size of the task image by checking the value of the bounds.
286 The lower bound is always 1, so we only need to read the upper bound. */
287 bounds_val = value_ind (value_field (val, bounds_fieldno));
288 len = value_as_long (value_field (bounds_val, upper_bound_fieldno));
289
290 /* Make sure that we do not read more than max_len characters... */
291 if (len > max_len)
292 len = max_len;
293
294 /* Extract LEN characters from the fat string. */
295 array_val = value_ind (value_field (val, array_fieldno));
296 read_memory (value_address (array_val), dest, len);
297
298 /* Add the NUL character to close the string. */
299 dest[len] = '\0';
300 }
301
302 /* Return the address of the Known_Tasks array maintained in
303 the Ada Runtime. Return NULL if the array could not be found,
304 meaning that the inferior program probably does not use tasking.
305
306 In order to provide a fast response time, this function caches
307 the Known_Tasks array address after the lookup during the first
308 call. Subsequent calls will simply return this cached address. */
309
310 static CORE_ADDR
311 get_known_tasks_addr (void)
312 {
313 static CORE_ADDR known_tasks_addr = 0;
314
315 if (ada_tasks_check_symbol_table)
316 {
317 struct minimal_symbol *msym;
318
319 msym = lookup_minimal_symbol (KNOWN_TASKS_NAME, NULL, NULL);
320 if (msym != NULL)
321 known_tasks_addr = SYMBOL_VALUE_ADDRESS (msym);
322 else
323 {
324 if (target_lookup_symbol (KNOWN_TASKS_NAME, &known_tasks_addr) != 0)
325 return 0;
326 }
327
328 /* FIXME: brobecker 2003-03-05: Here would be a much better place
329 to attach the ada-tasks observers, instead of doing this
330 unconditionaly in _initialize_tasks. This would avoid an
331 unecessary notification when the inferior does not use tasking
332 or as long as the user does not use the ada-tasks commands.
333 Unfortunately, this is not possible for the moment: the current
334 code resets ada__tasks_check_symbol_table back to 1 whenever
335 symbols for a new program are being loaded. If we place the
336 observers intialization here, we will end up adding new observers
337 everytime we do the check for Ada tasking-related symbols
338 above. This would currently have benign effects, but is still
339 undesirable. The cleanest approach is probably to create a new
340 observer to notify us when the user is debugging a new program.
341 We would then reset ada__tasks_check_symbol_table back to 1
342 during the notification, but also detach all observers.
343 BTW: observers are probably not reentrant, so detaching during
344 a notification may not be the safest thing to do... Sigh...
345 But creating the new observer would be a good idea in any case,
346 since this allow us to make ada__tasks_check_symbol_table
347 static, which is a good bonus. */
348 ada_tasks_check_symbol_table = 0;
349 }
350
351 return known_tasks_addr;
352 }
353
354 /* Get from the debugging information the type description of all types
355 related to the Ada Task Control Block that will be needed in order to
356 read the list of known tasks in the Ada runtime. Also return the
357 associated ATCB_FIELDNOS.
358
359 Error handling: Any data missing from the debugging info will cause
360 an error to be raised, and none of the return values to be set.
361 Users of this function can depend on the fact that all or none of the
362 return values will be set. */
363
364 static void
365 get_tcb_types_info (struct type **atcb_type,
366 struct type **atcb_common_type,
367 struct type **atcb_ll_type,
368 struct type **atcb_call_type,
369 struct tcb_fieldnos *atcb_fieldnos)
370 {
371 struct type *type;
372 struct type *common_type;
373 struct type *ll_type;
374 struct type *call_type;
375 struct tcb_fieldnos fieldnos;
376
377 const char *atcb_name = "system__tasking__ada_task_control_block___XVE";
378 const char *atcb_name_fixed = "system__tasking__ada_task_control_block";
379 const char *common_atcb_name = "system__tasking__common_atcb";
380 const char *private_data_name = "system__task_primitives__private_data";
381 const char *entry_call_record_name = "system__tasking__entry_call_record";
382
383 /* ATCB symbols may be found in several compilation units. As we
384 are only interested in one instance, use standard (literal,
385 C-like) lookups to get the first match. */
386
387 struct symbol *atcb_sym =
388 lookup_symbol_in_language (atcb_name, NULL, VAR_DOMAIN,
389 language_c, NULL);
390 const struct symbol *common_atcb_sym =
391 lookup_symbol_in_language (common_atcb_name, NULL, VAR_DOMAIN,
392 language_c, NULL);
393 const struct symbol *private_data_sym =
394 lookup_symbol_in_language (private_data_name, NULL, VAR_DOMAIN,
395 language_c, NULL);
396 const struct symbol *entry_call_record_sym =
397 lookup_symbol_in_language (entry_call_record_name, NULL, VAR_DOMAIN,
398 language_c, NULL);
399
400 if (atcb_sym == NULL || atcb_sym->type == NULL)
401 {
402 /* In Ravenscar run-time libs, the ATCB does not have a dynamic
403 size, so the symbol name differs. */
404 atcb_sym = lookup_symbol_in_language (atcb_name_fixed, NULL, VAR_DOMAIN,
405 language_c, NULL);
406
407 if (atcb_sym == NULL || atcb_sym->type == NULL)
408 error (_("Cannot find Ada_Task_Control_Block type. Aborting"));
409
410 type = atcb_sym->type;
411 }
412 else
413 {
414 /* Get a static representation of the type record
415 Ada_Task_Control_Block. */
416 type = atcb_sym->type;
417 type = ada_template_to_fixed_record_type_1 (type, NULL, 0, NULL, 0);
418 }
419
420 if (common_atcb_sym == NULL || common_atcb_sym->type == NULL)
421 error (_("Cannot find Common_ATCB type. Aborting"));
422 if (private_data_sym == NULL || private_data_sym->type == NULL)
423 error (_("Cannot find Private_Data type. Aborting"));
424 if (entry_call_record_sym == NULL || entry_call_record_sym->type == NULL)
425 error (_("Cannot find Entry_Call_Record type. Aborting"));
426
427 /* Get the type for Ada_Task_Control_Block.Common. */
428 common_type = common_atcb_sym->type;
429
430 /* Get the type for Ada_Task_Control_Bloc.Common.Call.LL. */
431 ll_type = private_data_sym->type;
432
433 /* Get the type for Common_ATCB.Call.all. */
434 call_type = entry_call_record_sym->type;
435
436 /* Get the field indices. */
437 fieldnos.common = ada_get_field_index (type, "common", 0);
438 fieldnos.entry_calls = ada_get_field_index (type, "entry_calls", 1);
439 fieldnos.atc_nesting_level =
440 ada_get_field_index (type, "atc_nesting_level", 1);
441 fieldnos.state = ada_get_field_index (common_type, "state", 0);
442 fieldnos.parent = ada_get_field_index (common_type, "parent", 1);
443 fieldnos.priority = ada_get_field_index (common_type, "base_priority", 0);
444 fieldnos.image = ada_get_field_index (common_type, "task_image", 1);
445 fieldnos.image_len = ada_get_field_index (common_type, "task_image_len", 1);
446 fieldnos.call = ada_get_field_index (common_type, "call", 1);
447 fieldnos.ll = ada_get_field_index (common_type, "ll", 0);
448 fieldnos.ll_thread = ada_get_field_index (ll_type, "thread", 0);
449 fieldnos.ll_lwp = ada_get_field_index (ll_type, "lwp", 1);
450 fieldnos.call_self = ada_get_field_index (call_type, "self", 0);
451
452 /* On certain platforms such as x86-windows, the "lwp" field has been
453 named "thread_id". This field will likely be renamed in the future,
454 but we need to support both possibilities to avoid an unnecessary
455 dependency on a recent compiler. We therefore try locating the
456 "thread_id" field in place of the "lwp" field if we did not find
457 the latter. */
458 if (fieldnos.ll_lwp < 0)
459 fieldnos.ll_lwp = ada_get_field_index (ll_type, "thread_id", 1);
460
461 /* Set all the out parameters all at once, now that we are certain
462 that there are no potential error() anymore. */
463 *atcb_type = type;
464 *atcb_common_type = common_type;
465 *atcb_ll_type = ll_type;
466 *atcb_call_type = call_type;
467 *atcb_fieldnos = fieldnos;
468 }
469
470 /* Build the PTID of the task from its COMMON_VALUE, which is the "Common"
471 component of its ATCB record. This PTID needs to match the PTID used
472 by the thread layer. */
473
474 static ptid_t
475 ptid_from_atcb_common (struct value *common_value)
476 {
477 long thread = 0;
478 CORE_ADDR lwp = 0;
479 struct value *ll_value;
480 ptid_t ptid;
481
482 ll_value = value_field (common_value, fieldno.ll);
483
484 if (fieldno.ll_lwp >= 0)
485 lwp = value_as_address (value_field (ll_value, fieldno.ll_lwp));
486 thread = value_as_long (value_field (ll_value, fieldno.ll_thread));
487
488 ptid = target_get_ada_task_ptid (lwp, thread);
489
490 return ptid;
491 }
492
493 /* Read the ATCB data of a given task given its TASK_ID (which is in practice
494 the address of its assocated ATCB record), and store the result inside
495 TASK_INFO. */
496
497 static void
498 read_atcb (CORE_ADDR task_id, struct ada_task_info *task_info)
499 {
500 struct value *tcb_value;
501 struct value *common_value;
502 struct value *atc_nesting_level_value;
503 struct value *entry_calls_value;
504 struct value *entry_calls_value_element;
505 int called_task_fieldno = -1;
506 const char ravenscar_task_name[] = "Ravenscar task";
507
508 if (atcb_type == NULL)
509 get_tcb_types_info (&atcb_type, &atcb_common_type, &atcb_ll_type,
510 &atcb_call_type, &fieldno);
511
512 tcb_value = value_from_contents_and_address (atcb_type, NULL, task_id);
513 common_value = value_field (tcb_value, fieldno.common);
514
515 /* Fill in the task_id. */
516
517 task_info->task_id = task_id;
518
519 /* Compute the name of the task.
520
521 Depending on the GNAT version used, the task image is either a fat
522 string, or a thin array of characters. Older versions of GNAT used
523 to use fat strings, and therefore did not need an extra field in
524 the ATCB to store the string length. For efficiency reasons, newer
525 versions of GNAT replaced the fat string by a static buffer, but this
526 also required the addition of a new field named "Image_Len" containing
527 the length of the task name. The method used to extract the task name
528 is selected depending on the existence of this field.
529
530 In some run-time libs (e.g. Ravenscar), the name is not in the ATCB;
531 we may want to get it from the first user frame of the stack. For now,
532 we just give a dummy name. */
533
534 if (fieldno.image_len == -1)
535 {
536 if (fieldno.image >= 0)
537 read_fat_string_value (task_info->name,
538 value_field (common_value, fieldno.image),
539 sizeof (task_info->name) - 1);
540 else
541 strcpy (task_info->name, ravenscar_task_name);
542 }
543 else
544 {
545 int len = value_as_long (value_field (common_value, fieldno.image_len));
546
547 value_as_string (task_info->name,
548 value_field (common_value, fieldno.image), len);
549 }
550
551 /* Compute the task state and priority. */
552
553 task_info->state = value_as_long (value_field (common_value, fieldno.state));
554 task_info->priority =
555 value_as_long (value_field (common_value, fieldno.priority));
556
557 /* If the ATCB contains some information about the parent task,
558 then compute it as well. Otherwise, zero. */
559
560 if (fieldno.parent >= 0)
561 task_info->parent =
562 value_as_address (value_field (common_value, fieldno.parent));
563 else
564 task_info->parent = 0;
565
566
567 /* If the ATCB contains some information about entry calls, then
568 compute the "called_task" as well. Otherwise, zero. */
569
570 if (fieldno.atc_nesting_level > 0 && fieldno.entry_calls > 0)
571 {
572 /* Let My_ATCB be the Ada task control block of a task calling the
573 entry of another task; then the Task_Id of the called task is
574 in My_ATCB.Entry_Calls (My_ATCB.ATC_Nesting_Level).Called_Task. */
575 atc_nesting_level_value = value_field (tcb_value,
576 fieldno.atc_nesting_level);
577 entry_calls_value =
578 ada_coerce_to_simple_array_ptr (value_field (tcb_value,
579 fieldno.entry_calls));
580 entry_calls_value_element =
581 value_subscript (entry_calls_value,
582 value_as_long (atc_nesting_level_value));
583 called_task_fieldno =
584 ada_get_field_index (value_type (entry_calls_value_element),
585 "called_task", 0);
586 task_info->called_task =
587 value_as_address (value_field (entry_calls_value_element,
588 called_task_fieldno));
589 }
590 else
591 {
592 task_info->called_task = 0;
593 }
594
595 /* If the ATCB cotnains some information about RV callers,
596 then compute the "caller_task". Otherwise, zero. */
597
598 task_info->caller_task = 0;
599 if (fieldno.call >= 0)
600 {
601 /* Get the ID of the caller task from Common_ATCB.Call.all.Self.
602 If Common_ATCB.Call is null, then there is no caller. */
603 const CORE_ADDR call =
604 value_as_address (value_field (common_value, fieldno.call));
605 struct value *call_val;
606
607 if (call != 0)
608 {
609 call_val =
610 value_from_contents_and_address (atcb_call_type, NULL, call);
611 task_info->caller_task =
612 value_as_address (value_field (call_val, fieldno.call_self));
613 }
614 }
615
616 /* And finally, compute the task ptid. Note that there are situations
617 where this cannot be determined:
618 - The task is no longer alive - the ptid is irrelevant;
619 - We are debugging a core file - the thread is not always
620 completely preserved for us to link back a task to its
621 underlying thread. Since we do not support task switching
622 when debugging core files anyway, we don't need to compute
623 that task ptid.
624 In either case, we don't need that ptid, and it is just good enough
625 to set it to null_ptid. */
626
627 if (target_has_execution && ada_task_is_alive (task_info))
628 task_info->ptid = ptid_from_atcb_common (common_value);
629 else
630 task_info->ptid = null_ptid;
631 }
632
633 /* Read the ATCB info of the given task (identified by TASK_ID), and
634 add the result to the TASK_LIST. */
635
636 static void
637 add_ada_task (CORE_ADDR task_id)
638 {
639 struct ada_task_info task_info;
640
641 read_atcb (task_id, &task_info);
642 VEC_safe_push (ada_task_info_s, task_list, &task_info);
643 }
644
645 /* Read the Known_Tasks array from the inferior memory, and store
646 it in TASK_LIST. Return non-zero upon success. */
647
648 static int
649 read_known_tasks_array (void)
650 {
651 const int target_ptr_byte =
652 gdbarch_ptr_bit (target_gdbarch) / TARGET_CHAR_BIT;
653 const CORE_ADDR known_tasks_addr = get_known_tasks_addr ();
654 const int known_tasks_size = target_ptr_byte * MAX_NUMBER_OF_KNOWN_TASKS;
655 gdb_byte *known_tasks = alloca (known_tasks_size);
656 int i;
657
658 /* Step 1: Clear the current list, if necessary. */
659 VEC_truncate (ada_task_info_s, task_list, 0);
660
661 /* If the application does not use task, then no more needs to be done.
662 It is important to have the task list cleared (see above) before we
663 return, as we don't want a stale task list to be used... This can
664 happen for instance when debugging a non-multitasking program after
665 having debugged a multitasking one. */
666 if (known_tasks_addr == 0)
667 return 0;
668
669 /* Step 2: Build a new list by reading the ATCBs from the Known_Tasks
670 array in the Ada runtime. */
671 read_memory (known_tasks_addr, known_tasks, known_tasks_size);
672 for (i = 0; i < MAX_NUMBER_OF_KNOWN_TASKS; i++)
673 {
674 struct type *data_ptr_type =
675 builtin_type (target_gdbarch)->builtin_data_ptr;
676 CORE_ADDR task_id =
677 extract_typed_address (known_tasks + i * target_ptr_byte,
678 data_ptr_type);
679
680 if (task_id != 0)
681 add_ada_task (task_id);
682 }
683
684 /* Step 3: Unset stale_task_list_p, to avoid re-reading the Known_Tasks
685 array unless needed. Then report a success. */
686 stale_task_list_p = 0;
687
688 return 1;
689 }
690
691 /* Builds the task_list by reading the Known_Tasks array from
692 the inferior. Prints an appropriate message and returns non-zero
693 if it failed to build this list. */
694
695 int
696 ada_build_task_list (int warn_if_null)
697 {
698 if (!target_has_stack)
699 error (_("Cannot inspect Ada tasks when program is not running"));
700
701 if (stale_task_list_p)
702 read_known_tasks_array ();
703
704 if (task_list == NULL)
705 {
706 if (warn_if_null)
707 printf_filtered (_("Your application does not use any Ada tasks.\n"));
708 return 0;
709 }
710
711 return 1;
712 }
713
714 /* Print a one-line description of the task whose number is TASKNO.
715 The formatting should fit the "info tasks" array. */
716
717 static void
718 short_task_info (int taskno)
719 {
720 const struct ada_task_info *const task_info =
721 VEC_index (ada_task_info_s, task_list, taskno - 1);
722 int active_task_p;
723
724 gdb_assert (task_info != NULL);
725
726 /* Print a star if this task is the current task (or the task currently
727 selected). */
728
729 active_task_p = ptid_equal (task_info->ptid, inferior_ptid);
730 if (active_task_p)
731 printf_filtered ("*");
732 else
733 printf_filtered (" ");
734
735 /* Print the task number. */
736 printf_filtered ("%3d", taskno);
737
738 /* Print the Task ID. */
739 printf_filtered (" %9lx", (long) task_info->task_id);
740
741 /* Print the Task ID of the task parent. */
742 printf_filtered (" %4d", get_task_number_from_id (task_info->parent));
743
744 /* Print the base priority of the task. */
745 printf_filtered (" %3d", task_info->priority);
746
747 /* Print the task current state. */
748 if (task_info->caller_task)
749 printf_filtered (_(" Accepting RV with %-4d"),
750 get_task_number_from_id (task_info->caller_task));
751 else if (task_info->state == Entry_Caller_Sleep && task_info->called_task)
752 printf_filtered (_(" Waiting on RV with %-3d"),
753 get_task_number_from_id (task_info->called_task));
754 else
755 printf_filtered (" %-22s", _(task_states[task_info->state]));
756
757 /* Finally, print the task name. */
758 if (task_info->name[0] != '\0')
759 printf_filtered (" %s\n", task_info->name);
760 else
761 printf_filtered (_(" <no name>\n"));
762 }
763
764 /* Print a list containing a short description of all Ada tasks. */
765 /* FIXME: Shouldn't we be using ui_out??? */
766
767 static void
768 info_tasks (int from_tty)
769 {
770 int taskno;
771 const int nb_tasks = VEC_length (ada_task_info_s, task_list);
772
773 printf_filtered (_(" ID TID P-ID Pri State Name\n"));
774
775 for (taskno = 1; taskno <= nb_tasks; taskno++)
776 short_task_info (taskno);
777 }
778
779 /* Print a detailed description of the Ada task whose ID is TASKNO_STR. */
780
781 static void
782 info_task (char *taskno_str, int from_tty)
783 {
784 const int taskno = value_as_long (parse_and_eval (taskno_str));
785 struct ada_task_info *task_info;
786 int parent_taskno = 0;
787
788 if (taskno <= 0 || taskno > VEC_length (ada_task_info_s, task_list))
789 error (_("Task ID %d not known. Use the \"info tasks\" command to\n"
790 "see the IDs of currently known tasks"), taskno);
791 task_info = VEC_index (ada_task_info_s, task_list, taskno - 1);
792
793 /* Print the Ada task ID. */
794 printf_filtered (_("Ada Task: %s\n"),
795 paddress (target_gdbarch, task_info->task_id));
796
797 /* Print the name of the task. */
798 if (task_info->name[0] != '\0')
799 printf_filtered (_("Name: %s\n"), task_info->name);
800 else
801 printf_filtered (_("<no name>\n"));
802
803 /* Print the TID and LWP. */
804 printf_filtered (_("Thread: %#lx\n"), ptid_get_tid (task_info->ptid));
805 printf_filtered (_("LWP: %#lx\n"), ptid_get_lwp (task_info->ptid));
806
807 /* Print who is the parent (if any). */
808 if (task_info->parent != 0)
809 parent_taskno = get_task_number_from_id (task_info->parent);
810 if (parent_taskno)
811 {
812 struct ada_task_info *parent =
813 VEC_index (ada_task_info_s, task_list, parent_taskno - 1);
814
815 printf_filtered (_("Parent: %d"), parent_taskno);
816 if (parent->name[0] != '\0')
817 printf_filtered (" (%s)", parent->name);
818 printf_filtered ("\n");
819 }
820 else
821 printf_filtered (_("No parent\n"));
822
823 /* Print the base priority. */
824 printf_filtered (_("Base Priority: %d\n"), task_info->priority);
825
826 /* print the task current state. */
827 {
828 int target_taskno = 0;
829
830 if (task_info->caller_task)
831 {
832 target_taskno = get_task_number_from_id (task_info->caller_task);
833 printf_filtered (_("State: Accepting rendezvous with %d"),
834 target_taskno);
835 }
836 else if (task_info->state == Entry_Caller_Sleep && task_info->called_task)
837 {
838 target_taskno = get_task_number_from_id (task_info->called_task);
839 printf_filtered (_("State: Waiting on task %d's entry"),
840 target_taskno);
841 }
842 else
843 printf_filtered (_("State: %s"), _(long_task_states[task_info->state]));
844
845 if (target_taskno)
846 {
847 struct ada_task_info *target_task_info =
848 VEC_index (ada_task_info_s, task_list, target_taskno - 1);
849
850 if (target_task_info->name[0] != '\0')
851 printf_filtered (" (%s)", target_task_info->name);
852 }
853
854 printf_filtered ("\n");
855 }
856 }
857
858 /* If ARG is empty or null, then print a list of all Ada tasks.
859 Otherwise, print detailed information about the task whose ID
860 is ARG.
861
862 Does nothing if the program doesn't use Ada tasking. */
863
864 static void
865 info_tasks_command (char *arg, int from_tty)
866 {
867 const int task_list_built = ada_build_task_list (1);
868
869 if (!task_list_built)
870 return;
871
872 if (arg == NULL || *arg == '\0')
873 info_tasks (from_tty);
874 else
875 info_task (arg, from_tty);
876 }
877
878 /* Print a message telling the user id of the current task.
879 This function assumes that tasking is in use in the inferior. */
880
881 static void
882 display_current_task_id (void)
883 {
884 const int current_task = ada_get_task_number (inferior_ptid);
885
886 if (current_task == 0)
887 printf_filtered (_("[Current task is unknown]\n"));
888 else
889 printf_filtered (_("[Current task is %d]\n"), current_task);
890 }
891
892 /* Parse and evaluate TIDSTR into a task id, and try to switch to
893 that task. Print an error message if the task switch failed. */
894
895 static void
896 task_command_1 (char *taskno_str, int from_tty)
897 {
898 const int taskno = value_as_long (parse_and_eval (taskno_str));
899 struct ada_task_info *task_info;
900
901 if (taskno <= 0 || taskno > VEC_length (ada_task_info_s, task_list))
902 error (_("Task ID %d not known. Use the \"info tasks\" command to\n"
903 "see the IDs of currently known tasks"), taskno);
904 task_info = VEC_index (ada_task_info_s, task_list, taskno - 1);
905
906 if (!ada_task_is_alive (task_info))
907 error (_("Cannot switch to task %d: Task is no longer running"), taskno);
908
909 /* On some platforms, the thread list is not updated until the user
910 performs a thread-related operation (by using the "info threads"
911 command, for instance). So this thread list may not be up to date
912 when the user attempts this task switch. Since we cannot switch
913 to the thread associated to our task if GDB does not know about
914 that thread, we need to make sure that any new threads gets added
915 to the thread list. */
916 target_find_new_threads ();
917
918 /* Verify that the ptid of the task we want to switch to is valid
919 (in other words, a ptid that GDB knows about). Otherwise, we will
920 cause an assertion failure later on, when we try to determine
921 the ptid associated thread_info data. We should normally never
922 encounter such an error, but the wrong ptid can actually easily be
923 computed if target_get_ada_task_ptid has not been implemented for
924 our target (yet). Rather than cause an assertion error in that case,
925 it's nicer for the user to just refuse to perform the task switch. */
926 if (!find_thread_ptid (task_info->ptid))
927 error (_("Unable to compute thread ID for task %d.\n"
928 "Cannot switch to this task."),
929 taskno);
930
931 switch_to_thread (task_info->ptid);
932 ada_find_printable_frame (get_selected_frame (NULL));
933 printf_filtered (_("[Switching to task %d]\n"), taskno);
934 print_stack_frame (get_selected_frame (NULL),
935 frame_relative_level (get_selected_frame (NULL)), 1);
936 }
937
938
939 /* Print the ID of the current task if TASKNO_STR is empty or NULL.
940 Otherwise, switch to the task indicated by TASKNO_STR. */
941
942 static void
943 task_command (char *taskno_str, int from_tty)
944 {
945 const int task_list_built = ada_build_task_list (1);
946
947 if (!task_list_built)
948 return;
949
950 if (taskno_str == NULL || taskno_str[0] == '\0')
951 display_current_task_id ();
952 else
953 {
954 /* Task switching in core files doesn't work, either because:
955 1. Thread support is not implemented with core files
956 2. Thread support is implemented, but the thread IDs created
957 after having read the core file are not the same as the ones
958 that were used during the program life, before the crash.
959 As a consequence, there is no longer a way for the debugger
960 to find the associated thead ID of any given Ada task.
961 So, instead of attempting a task switch without giving the user
962 any clue as to what might have happened, just error-out with
963 a message explaining that this feature is not supported. */
964 if (!target_has_execution)
965 error (_("\
966 Task switching not supported when debugging from core files\n\
967 (use thread support instead)"));
968 task_command_1 (taskno_str, from_tty);
969 }
970 }
971
972 /* Indicate that the task list may have changed, so invalidate the cache. */
973
974 static void
975 ada_task_list_changed (void)
976 {
977 stale_task_list_p = 1;
978 }
979
980 /* The 'normal_stop' observer notification callback. */
981
982 static void
983 ada_normal_stop_observer (struct bpstats *unused_args, int unused_args2)
984 {
985 /* The inferior has been resumed, and just stopped. This means that
986 our task_list needs to be recomputed before it can be used again. */
987 ada_task_list_changed ();
988 }
989
990 /* A routine to be called when the objfiles have changed. */
991
992 static void
993 ada_new_objfile_observer (struct objfile *objfile)
994 {
995 /* Invalidate all cached data that were extracted from an objfile. */
996
997 atcb_type = NULL;
998 atcb_common_type = NULL;
999 atcb_ll_type = NULL;
1000 atcb_call_type = NULL;
1001
1002 ada_tasks_check_symbol_table = 1;
1003 }
1004
1005 /* Provide a prototype to silence -Wmissing-prototypes. */
1006 extern initialize_file_ftype _initialize_tasks;
1007
1008 void
1009 _initialize_tasks (void)
1010 {
1011 /* Attach various observers. */
1012 observer_attach_normal_stop (ada_normal_stop_observer);
1013 observer_attach_new_objfile (ada_new_objfile_observer);
1014
1015 /* Some new commands provided by this module. */
1016 add_info ("tasks", info_tasks_command,
1017 _("Provide information about all known Ada tasks"));
1018 add_cmd ("task", class_run, task_command,
1019 _("Use this command to switch between Ada tasks.\n\
1020 Without argument, this command simply prints the current task ID"),
1021 &cmdlist);
1022 }
1023