aboutsummaryrefslogtreecommitdiff
blob: f0a9c34167068d4867107f339ede03ec42a4b0bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/* 
 * (c) Copyright 1990-1996 OPEN SOFTWARE FOUNDATION, INC.
 * (c) Copyright 1990-1996 HEWLETT-PACKARD COMPANY
 * (c) Copyright 1990-1996 DIGITAL EQUIPMENT CORPORATION
 * (c) Copyright 1991, 1992 Siemens-Nixdorf Information Systems
 * To anyone who acknowledges that this file is provided "AS IS" without
 * any express or implied warranty: permission to use, copy, modify, and
 * distribute this file for any purpose is hereby granted without fee,
 * provided that the above copyright notices and this notice appears in
 * all source code copies, and that none of the names listed above be used
 * in advertising or publicity pertaining to distribution of the software
 * without specific, written prior permission.  None of these organizations
 * makes any representations about the suitability of this software for
 * any purpose.
 */
/*
 *	This file defines the internal interface to the core of CMA 
 * 	debugging services. (The client interface to debugging services
 *	is provided by cma_debug_client.h).
 */

#ifndef CMA_DEB_CORE
#define CMA_DEB_CORE

/*
 *  INCLUDE FILES
 */
#include <cma.h>
#include <cma_mutex.h>
#include <cma_queue.h>
#include <cma_tcb_defs.h>
#include <cma_util.h>

/*
 * CONSTANTS AND MACROS
 */


/*
 * TYPEDEFS
 */

/*FIX-ME* Need to use sizes that are platform specific */
typedef long int cma___t_debug_ctx[17];

/*
 * Type defing the format of known object lists
 */
typedef struct CMA__T_KNOWN_OBJECT {
    cma__t_queue	queue;		/* Queue header for known objects */
    cma__t_int_mutex	*mutex;		/* Mutex to control access to queue */
    } cma__t_known_object;


/*
 * Type defining the registration for one debug client (e.g. Ada)
 */
typedef struct CMA__T_DEB_REGISTRY {
    cma_t_address	entry;		/* Client's debug entry point */
    cma_t_key		key;		/* Client's context key */
    cma_t_integer	fac;		/* Client's debug facility number */
    cma_t_boolean 	has_prolog;	/* Client's TCBs have std prolog */
    } cma__t_deb_registry;

#define cma__c_deb_max_clients	10

/* 
 * Type defining the global debugging state for all threads.
 */
typedef struct CMA__T_DEBUG_STATE {
    /* 
     * The following flag is set if changes were made while in the
     * debugger that may make the ready lists inconsistent.  For 
     * example, if a thread priority is changed in the debugger, the
     * thread is not moved between queues.  Making things consistent
     * is deferred to when the dispatcher is next invoked -- which we
     * try to make very soon.
     */
    cma_t_boolean 	is_inconsistency;   /* Ready lists are inconsistent */


    cma_t_boolean 	events_enabled;	    /* Set if _any_ event is enabled */
    cma_t_boolean	flags[cma__c_debevt__dim]; 	
					    /* Which events are enabled */
    cma__t_int_tcb	*next_to_run;	    /* TCB of thread to run next */ 

    cma__t_int_mutex	*mutex;		    /* Mutex for registering clients */
    cma_t_integer	client_count;	    /* Count of debug clients */
    cma__t_deb_registry	clients[cma__c_deb_max_clients+1];
					    /* Array of current debug clients */
    } cma__t_debug_state;


/* 
 * Routine that will symbolize and address and print it.
 */
typedef void	(*cma__t_print_symbol) (cma_t_address);


/*
 *  GLOBAL DATA
 */

/* 
 * Variable holding the global debugging state 
 *
 * (This is primarily written by the debugger interface and read
 * by the thread dispatcher).
 */
extern cma__t_debug_state	cma__g_debug_state;

/* 
 * Known object queues
 */
extern cma__t_known_object	cma__g_known_atts;
extern cma__t_known_object	cma__g_known_cvs;
extern cma__t_known_object	cma__g_known_mutexes;
extern cma__t_known_object	cma__g_known_threads;

/*
 * INTERNAL INTERFACES
 */

/* Get information while in debugger context */
extern void cma__deb_get 
           (cma__t_int_tcb *,cma_t_debug_get,cma_t_address,cma_t_integer,cma_t_integer);

/* Set information while in debugger context */
extern void cma__deb_set (cma__t_int_tcb *,cma_t_debug_set,cma_t_address,cma_t_integer);

extern void cma__init_debug (void);

extern void cma__reinit_debug (cma_t_integer);

extern void cma__deb_anytcb_to_tcb (cma_t_tcb_header *,cma__t_int_tcb **);

extern void cma__deb_fac_to_client (cma_t_integer,cma_t_key *);

extern void cma__deb_get_client_info (cma_t_key,cma_t_address *,cma_t_boolean *);

extern void cma__deb_get_context (cma__t_int_tcb *,cma_t_key,cma_t_address *);

extern cma__t_int_tcb *cma__deb_get_self_tcb (void);

extern void cma__deb_get_time_slice (cma_t_interval *);

extern cma__t_int_tcb *cma__deb_next_tcb 
            (cma__t_int_tcb *,cma_t_integer *,cma_t_integer *,cma_t_boolean *);

extern cma_t_boolean cma__deb_set_alert (cma__t_int_tcb *);

extern void cma__deb_set_next_thread (cma__t_int_tcb *);
	
extern void cma__deb_set_force_dispatch (cma_t_address );

extern void cma__deb_set_time_slice (cma_t_interval);

extern void cma__deb_show_thread 
     (cma__t_int_tcb *,cma_t_boolean,cma_t_boolean,cma___t_debug_ctx,cma__t_eol_routine,
                cma__t_eol_routine,cma__t_print_symbol);

extern void
cma__deb_show_stats (cma__t_int_tcb *,cma_t_boolean,cma_t_boolean,cma__t_eol_routine,cma__t_eol_routine,cma__t_print_symbol);
#endif