static void enable_thread_event_reporting (void) { td_thr_events_t events; td_notify_t notify; td_err_e err; /* We cannot use the thread event reporting facility if these functions aren't available. */ if (td_ta_event_addr_p == NULL || td_ta_set_event_p == NULL || td_ta_event_getmsg_p == NULL || td_thr_event_enable_p == NULL) return; /* Set the process wide mask saying which events we're interested in. */ td_event_emptyset (&events); td_event_addset (&events, TD_CREATE); td_event_addset (&events, TD_DEATH); err = td_ta_set_event_p (thread_agent, &events); if (err != TD_OK) { warning ("Unable to set global thread event mask: %s", thread_db_err_str (err)); return; } /* Delete previous thread event breakpoints, if any. */ remove_thread_event_breakpoints (); td_create_bp_addr = 0; td_death_bp_addr = 0; /* Set up the thread creation event. */ err = enable_thread_event (thread_agent, TD_CREATE, &td_create_bp_addr); if (err != TD_OK) { warning ("Unable to get location for thread creation breakpoint: %s", thread_db_err_str (err)); return; } /* Set up the thread death event. */ err = enable_thread_event (thread_agent, TD_DEATH, &td_death_bp_addr); if (err != TD_OK) { warning ("Unable to get location for thread death breakpoint: %s", thread_db_err_str (err)); return; } }
static void enable_thread_event_reporting (void) { td_thr_events_t events; td_err_e err; #ifdef HAVE_GNU_LIBC_VERSION_H const char *libc_version; int libc_major, libc_minor; #endif struct thread_db_info *info; info = get_thread_db_info (GET_PID (inferior_ptid)); /* We cannot use the thread event reporting facility if these functions aren't available. */ if (info->td_ta_event_addr_p == NULL || info->td_ta_set_event_p == NULL || info->td_ta_event_getmsg_p == NULL || info->td_thr_event_enable_p == NULL) return; /* Set the process wide mask saying which events we're interested in. */ td_event_emptyset (&events); td_event_addset (&events, TD_CREATE); #ifdef HAVE_GNU_LIBC_VERSION_H /* The event reporting facility is broken for TD_DEATH events in glibc 2.1.3, so don't enable it if we have glibc but a lower version. */ libc_version = gnu_get_libc_version (); if (sscanf (libc_version, "%d.%d", &libc_major, &libc_minor) == 2 && (libc_major > 2 || (libc_major == 2 && libc_minor > 1))) #endif td_event_addset (&events, TD_DEATH); err = info->td_ta_set_event_p (info->thread_agent, &events); if (err != TD_OK) { warning (_("Unable to set global thread event mask: %s"), thread_db_err_str (err)); return; } /* Delete previous thread event breakpoints, if any. */ remove_thread_event_breakpoints (); info->td_create_bp_addr = 0; info->td_death_bp_addr = 0; /* Set up the thread creation event. */ err = enable_thread_event (TD_CREATE, &info->td_create_bp_addr); if (err != TD_OK) { warning (_("Unable to get location for thread creation breakpoint: %s"), thread_db_err_str (err)); return; } /* Set up the thread death event. */ err = enable_thread_event (TD_DEATH, &info->td_death_bp_addr); if (err != TD_OK) { warning (_("Unable to get location for thread death breakpoint: %s"), thread_db_err_str (err)); return; } }