static void thread_db_create_event (CORE_ADDR where) { td_event_msg_t msg; td_err_e err; struct inferior_linux_data *tdata; if (debug_threads) fprintf (stderr, "Thread creation event.\n"); tdata = inferior_target_data (current_inferior); /* FIXME: This assumes we don't get another event. In the LinuxThreads implementation, this is safe, because all events come from the manager thread (except for its own creation, of course). */ err = td_ta_event_getmsg (thread_agent, &msg); if (err != TD_OK) fprintf (stderr, "thread getmsg err: %s\n", thread_db_err_str (err)); /* msg.event == TD_EVENT_CREATE */ find_new_threads_callback (msg.th_p, NULL); }
//-------------------------------------------------------------------------- // check if there are pending messages from thread DB void linux_debmod_t::tdb_handle_messages(int tid) { if ( ta == NULL ) return; td_event_msg_t tmsg; thrinfo_t ti; td_err_e err; int loop = 1; td_thrhandle_t th; do { err = td_ta_event_getmsg(ta, &tmsg); if ( err != TD_OK ) { if ( err == TD_NOMSG ) return; msg("Cannot get thread event message: %s\n", tdb_strerr(err)); return; } err = td_thr_get_info(tmsg.th_p, &ti); ti.th_p = tmsg.th_p; COMPLAIN_IF_FAILED("td_thr_get_info", err); switch ( tmsg.event ) { case TD_CREATE: new_thread(&ti); break; case TD_DEATH: dead_thread(ti.ti_lid); break; default: msg("Spurious thread event %d.", tmsg.event); } } while (loop); }