Changeset 336db295 in mainline for kernel/generic/src/udebug/udebug_ops.c
- Timestamp:
- 2010-01-23T14:25:32Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- a074b4f
- Parents:
- 9d3133d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/udebug/udebug_ops.c
r9d3133d r336db295 355 355 * 356 356 * If the sequence is longer than @a buf_size bytes, only as much hashes 357 * as can fit are copied. The number of thread hashes copied is stored 358 * in @a n. 357 * as can fit are copied. The number of bytes copied is stored in @a stored. 358 * The total number of thread bytes that could have been saved had there been 359 * enough space is stored in @a needed. 359 360 * 360 361 * The rationale for having @a buf_size is that this function is only … … 364 365 * @param buffer The buffer for storing thread hashes. 365 366 * @param buf_size Buffer size in bytes. 366 * @param n The actual number of hashes copied will be stored here. 367 */ 368 int udebug_thread_read(void **buffer, size_t buf_size, size_t *n) 367 * @param stored The actual number of bytes copied will be stored here. 368 * @param needed Total number of hashes that could have been saved. 369 */ 370 int udebug_thread_read(void **buffer, size_t buf_size, size_t *stored, 371 size_t *needed) 369 372 { 370 373 thread_t *t; 371 374 link_t *cur; 372 375 unative_t tid; 373 unsigned copied_ids; 376 size_t copied_ids; 377 size_t extra_ids; 374 378 ipl_t ipl; 375 379 unative_t *id_buffer; … … 380 384 381 385 /* Allocate a buffer to hold thread IDs */ 382 id_buffer = malloc(buf_size , 0);386 id_buffer = malloc(buf_size + 1, 0); 383 387 384 388 mutex_lock(&TASK->udebug.lock); … … 396 400 max_ids = buf_size / sizeof(unative_t); 397 401 copied_ids = 0; 402 extra_ids = 0; 398 403 399 404 /* FIXME: make sure the thread isn't past debug shutdown... */ 400 405 for (cur = TASK->th_head.next; cur != &TASK->th_head; cur = cur->next) { 401 /* Do not write past end of buffer */402 if (copied_ids >= max_ids) break;403 404 406 t = list_get_instance(cur, thread_t, th_link); 405 407 … … 409 411 410 412 /* Not interested in kernel threads. */ 411 if ((flags & THREAD_FLAG_USPACE) != 0) { 413 if ((flags & THREAD_FLAG_USPACE) == 0) 414 continue; 415 416 if (copied_ids < max_ids) { 412 417 /* Using thread struct pointer as identification hash */ 413 418 tid = (unative_t) t; 414 419 id_buffer[copied_ids++] = tid; 420 } else { 421 extra_ids++; 415 422 } 416 423 } … … 422 429 423 430 *buffer = id_buffer; 424 *n = copied_ids * sizeof(unative_t); 431 *stored = copied_ids * sizeof(unative_t); 432 *needed = (copied_ids + extra_ids) * sizeof(unative_t); 425 433 426 434 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.