Subversion Repositories HelenOS

Rev

Rev 2936 | Rev 2938 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2936 Rev 2937
Line 58... Line 58...
58
int cmd_argc;
58
int cmd_argc;
59
char *cmd_argv[MAX_ARGC + 1];   /* need one spare field for cmd_split() */
59
char *cmd_argv[MAX_ARGC + 1];   /* need one spare field for cmd_split() */
60
 
60
 
61
#define THBUF_SIZE 64
61
#define THBUF_SIZE 64
62
thash_t thread_hash_buf[THBUF_SIZE];
62
thash_t thread_hash_buf[THBUF_SIZE];
-
 
63
 
-
 
64
#define MAX_THREADS 64
-
 
65
thash_t thread_hash[MAX_THREADS];
-
 
66
int thread_id[MAX_THREADS];
63
unsigned n_threads;
67
unsigned n_threads;
-
 
68
int cwt; /* index into thread_hash/thread_id */
64
 
69
 
65
int next_thread_id;
70
int next_thread_id;
66
 
71
 
67
int app_phone;
72
int app_phone;
68
volatile bool abort_debug;
73
volatile bool abort_debug;
Line 185... Line 190...
185
{
190
{
186
    int rc;
191
    int rc;
187
    int tb_copied;
192
    int tb_copied;
188
    int tb_needed;
193
    int tb_needed;
189
    int i;
194
    int i;
-
 
195
    int n;
190
 
196
 
191
    cons_printf("send IPC_M_DEBUG_THREAD_READ message\n");
197
    cons_printf("send IPC_M_DEBUG_THREAD_READ message\n");
192
    rc = udebug_thread_read(app_phone, (unsigned)thread_hash_buf,
198
    rc = udebug_thread_read(app_phone, (unsigned)thread_hash_buf,
193
        THBUF_SIZE*sizeof(unsigned), &tb_copied, &tb_needed);
199
        THBUF_SIZE*sizeof(unsigned), &tb_copied, &tb_needed);
194
    cons_printf("-> %d\n", rc);
200
    cons_printf("-> %d\n", rc);
195
    if (rc < 0) return rc;
201
    if (rc < 0) return rc;
196
 
202
 
197
    n_threads = tb_copied / sizeof(unsigned);
203
    n = tb_copied / sizeof(unsigned);
198
 
204
 
199
    cons_printf("thread IDs:");
205
    cons_printf("thread IDs:");
200
    for (i=0; i<n_threads; i++) {
206
    for (i=0; i<n; i++) {
201
        cons_printf(" %u", thread_hash_buf[i]);
207
        cons_printf(" %u", thread_hash_buf[i]);
202
    }
208
    }
203
    cons_printf("\ntotal of %u threads\n", tb_needed/sizeof(unsigned));
209
    cons_printf("\ntotal of %u threads\n", tb_needed/sizeof(unsigned));
204
 
210
 
205
    return 0;
211
    return n;
206
}
212
}
207
 
213
 
208
void event_thread_b(unsigned hash)
214
void event_thread_b(unsigned hash)
209
{
215
{
210
    async_serialize_start();
216
    async_serialize_start();
Line 246... Line 252...
246
        cons_printf("unknown event type %d\n", ev_type);
252
        cons_printf("unknown event type %d\n", ev_type);
247
        break;
253
        break;
248
    }
254
    }
249
}
255
}
250
 
256
 
251
void debug_loop(void *thread_hash_arg)
257
void debug_loop(void *thread_buf_idx_arg)
252
{
258
{
253
    int rc;
259
    int rc;
254
    udebug_event_t ev_type;
260
    udebug_event_t ev_type;
255
    unsigned thread_hash;
261
    unsigned thread_buf_idx;
256
    unsigned thread_id;
262
    thash_t thash;
-
 
263
    int tid;
257
    unsigned val0, val1;
264
    unsigned val0, val1;
258
 
265
 
259
    thread_hash = (unsigned)thread_hash_arg;
266
    thread_buf_idx = (unsigned)thread_buf_idx_arg;
-
 
267
 
-
 
268
    thash = thread_hash[thread_buf_idx];
260
    thread_id = next_thread_id++;
269
    tid = thread_id[thread_buf_idx];
261
 
270
 
262
    cons_printf("debug_loop(%d)\n", thread_id);
271
    cons_printf("debug_loop(%d)\n", tid);
263
 
272
 
264
    while (!abort_debug) {
273
    while (!abort_debug) {
265
 
274
 
266
        /* Run thread until an event occurs */
275
        /* Run thread until an event occurs */
267
        rc = udebug_go(app_phone, thread_hash,
276
        rc = udebug_go(app_phone, thash,
268
            &ev_type, &val0, &val1);
277
            &ev_type, &val0, &val1);
269
 
278
 
270
        if (ev_type == UDEBUG_EVENT_FINISHED) {
279
        if (ev_type == UDEBUG_EVENT_FINISHED) {
271
            cons_printf("thread %u debugging finished\n", thread_id);
280
            cons_printf("thread %u debugging finished\n", tid);
272
            break;
281
            break;
273
        }
282
        }
274
        if (rc >= 0) debug_event(thread_hash, ev_type, val0);
283
        if (rc >= 0) debug_event(thash, ev_type, val0);
275
    }
284
    }
276
 
285
 
277
    cons_printf("debug_loop(%d) exiting\n", thread_id);
286
    cons_printf("debug_loop(%d) exiting\n", thread_id);
278
}
287
}
279
 
288
 
280
void thread_debug_start(unsigned thread_hash)
289
void thread_debug_start(unsigned thash)
281
{
290
{
282
    fid_t fid;
291
    fid_t fid;
283
 
292
 
284
    thash = thread_hash;
293
    thread_hash[n_threads] = thash;
-
 
294
    thread_id[n_threads] = next_thread_id++;
285
 
295
 
286
    fid = fibril_create(debug_loop, (void *)thread_hash);
296
    fid = fibril_create(debug_loop, (void *)n_threads++);
287
    if (fid == 0) {
297
    if (fid == 0) {
288
        cons_printf("Warning: Failed creating fibril\n");
298
        cons_printf("Warning: Failed creating fibril\n");
289
    }
299
    }
290
    fibril_add_ready(fid);
300
    fibril_add_ready(fid);
291
}
301
}
Line 317... Line 327...
317
        return;
327
        return;
318
    }
328
    }
319
 
329
 
320
    abort_debug = false;
330
    abort_debug = false;
321
 
331
 
322
    for (i = 0; i < n_threads; i++) {
332
    for (i = 0; i < rc; i++) {
323
        thread_debug_start(thread_hash_buf[i]);
333
        thread_debug_start(thread_hash_buf[i]);
324
    }
334
    }
325
 
335
 
326
    while (!quit) {
336
    while (!quit) {
327
        cons_read_line(in_buf, IN_BUF_SIZE);
337
        cons_read_line(in_buf, IN_BUF_SIZE);