static int find_new_threads_callback (const td_thrhandle_t *th_p, void *data) { td_thrinfo_t ti; td_err_e err; err = td_thr_get_info (th_p, &ti); if (err != TD_OK) error ("Cannot get thread info: %s", thread_db_err_str (err)); /* Check for zombies. */ if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE) return 0; maybe_attach_thread (th_p, &ti); return 0; }
static int find_new_threads_callback (const td_thrhandle_t *th_p, void *data) { td_thrinfo_t ti; td_err_e err; struct thread_db *thread_db = current_process ()->priv->thread_db; err = thread_db->td_thr_get_info_p (th_p, &ti); if (err != TD_OK) error ("Cannot get thread info: %s", thread_db_err_str (err)); if (ti.ti_lid == -1) { /* A thread with kernel thread ID -1 is either a thread that exited and was joined, or a thread that is being created but hasn't started yet, and that is reusing the tcb/stack of a thread that previously exited and was joined. (glibc marks terminated and joined threads with kernel thread ID -1. See glibc PR17707. */ if (debug_threads) debug_printf ("thread_db: skipping exited and " "joined thread (0x%lx)\n", (unsigned long) ti.ti_tid); return 0; } /* Check for zombies. */ if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE) return 0; if (!maybe_attach_thread (th_p, &ti, (int *) data)) { /* Terminate iteration early: we might be looking at stale data in the inferior. The thread_db_find_new_threads will retry. */ return 1; } return 0; }