Changeset fea0ce6 in mainline for kernel/generic/src/udebug/udebug_ops.c
- Timestamp:
- 2010-01-23T20:20:54Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- e095644
- Parents:
- 9d3133d (diff), bc310a05 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/udebug/udebug_ops.c
r9d3133d rfea0ce6 209 209 210 210 mutex_lock(&t->udebug.lock); 211 if ((t->flags & THREAD_FLAG_USPACE) != 0) 211 if ((t->flags & THREAD_FLAG_USPACE) != 0) { 212 212 t->udebug.active = true; 213 mutex_unlock(&t->udebug.lock); 213 mutex_unlock(&t->udebug.lock); 214 condvar_broadcast(&t->udebug.active_cv); 215 } else { 216 mutex_unlock(&t->udebug.lock); 217 } 214 218 } 215 219 … … 355 359 * 356 360 * 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. 361 * as can fit are copied. The number of bytes copied is stored in @a stored. 362 * The total number of thread bytes that could have been saved had there been 363 * enough space is stored in @a needed. 359 364 * 360 365 * The rationale for having @a buf_size is that this function is only … … 364 369 * @param buffer The buffer for storing thread hashes. 365 370 * @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) 371 * @param stored The actual number of bytes copied will be stored here. 372 * @param needed Total number of hashes that could have been saved. 373 */ 374 int udebug_thread_read(void **buffer, size_t buf_size, size_t *stored, 375 size_t *needed) 369 376 { 370 377 thread_t *t; 371 378 link_t *cur; 372 379 unative_t tid; 373 unsigned copied_ids; 380 size_t copied_ids; 381 size_t extra_ids; 374 382 ipl_t ipl; 375 383 unative_t *id_buffer; … … 380 388 381 389 /* Allocate a buffer to hold thread IDs */ 382 id_buffer = malloc(buf_size , 0);390 id_buffer = malloc(buf_size + 1, 0); 383 391 384 392 mutex_lock(&TASK->udebug.lock); … … 396 404 max_ids = buf_size / sizeof(unative_t); 397 405 copied_ids = 0; 406 extra_ids = 0; 398 407 399 408 /* FIXME: make sure the thread isn't past debug shutdown... */ 400 409 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 410 t = list_get_instance(cur, thread_t, th_link); 405 411 … … 409 415 410 416 /* Not interested in kernel threads. */ 411 if ((flags & THREAD_FLAG_USPACE) != 0) { 417 if ((flags & THREAD_FLAG_USPACE) == 0) 418 continue; 419 420 if (copied_ids < max_ids) { 412 421 /* Using thread struct pointer as identification hash */ 413 422 tid = (unative_t) t; 414 423 id_buffer[copied_ids++] = tid; 424 } else { 425 extra_ids++; 415 426 } 416 427 } … … 422 433 423 434 *buffer = id_buffer; 424 *n = copied_ids * sizeof(unative_t); 435 *stored = copied_ids * sizeof(unative_t); 436 *needed = (copied_ids + extra_ids) * sizeof(unative_t); 425 437 426 438 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.