Deleted Added
sdiff udiff text old ( 180982 ) new ( 181341 )
full compact
1/*
2 * Copyright (c) 2004 Marcel Moolenaar
3 * Copyright (c) 2005 David Xu
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 12 unchanged lines hidden (view full) ---

21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#include <sys/cdefs.h>
29__FBSDID("$FreeBSD: head/lib/libthread_db/libthr_db.c 180982 2008-07-30 00:59:19Z marcel $");
30
31#include <proc_service.h>
32#include <stddef.h>
33#include <stdlib.h>
34#include <string.h>
35#include <sys/types.h>
36#include <sys/linker_set.h>
37#include <sys/ptrace.h>

--- 202 unchanged lines hidden (view full) ---

240
241static td_err_e
242pt_ta_map_lwp2thr(const td_thragent_t *ta, lwpid_t lwp, td_thrhandle_t *th)
243{
244 return (pt_ta_map_id2thr(ta, lwp, th));
245}
246
247static td_err_e
248pt_ta_thr_iter(const td_thragent_t *ta,
249 td_thr_iter_f *callback, void *cbdata_p,
250 td_thr_state_e state, int ti_pri,
251 sigset_t *ti_sigmask_p,
252 unsigned int ti_user_flags)
253{
254 TAILQ_HEAD(, pthread) thread_list;
255 td_thrhandle_t th;
256 psaddr_t pt;
257 long lwp;
258 int ret;
259
260 TDBG_FUNC();

--- 22 unchanged lines hidden (view full) ---

283 return (P2T(ret));
284 }
285 return (TD_OK);
286}
287
288static td_err_e
289pt_ta_tsd_iter(const td_thragent_t *ta, td_key_iter_f *ki, void *arg)
290{
291 char *keytable;
292 void *destructor;
293 int i, ret, allocated;
294
295 TDBG_FUNC();
296
297 keytable = malloc(ta->thread_max_keys * ta->thread_size_key);
298 if (keytable == NULL)
299 return (TD_MALLOC);
300 ret = ps_pread(ta->ph, (psaddr_t)ta->thread_keytable_addr, keytable,
301 ta->thread_max_keys * ta->thread_size_key);
302 if (ret != 0) {
303 free(keytable);
304 return (P2T(ret));
305 }
306 for (i = 0; i < ta->thread_max_keys; i++) {
307 allocated = *(int *)(keytable + i * ta->thread_size_key +
308 ta->thread_off_key_allocated);
309 destructor = *(void **)(keytable + i * ta->thread_size_key +
310 ta->thread_off_key_destructor);
311 if (allocated) {
312 ret = (ki)(i, destructor, arg);
313 if (ret != 0) {
314 free(keytable);
315 return (TD_DBERR);
316 }
317 }
318 }

--- 98 unchanged lines hidden (view full) ---

417 handle.th_thread = pt;
418 msg->th_p = &handle;
419 return (0);
420}
421
422static td_err_e
423pt_dbsuspend(const td_thrhandle_t *th, int suspend)
424{
425 td_thragent_t *ta = (td_thragent_t *)th->th_ta;
426 int ret;
427
428 TDBG_FUNC();
429
430 ret = pt_validate(th);
431 if (ret)
432 return (ret);
433

--- 223 unchanged lines hidden (view full) ---

657 &mask, sizeof(mask));
658 return (P2T(ret));
659}
660
661static td_err_e
662pt_thr_event_getmsg(const td_thrhandle_t *th, td_event_msg_t *msg)
663{
664 static td_thrhandle_t handle;
665 td_thragent_t *ta = (td_thragent_t *)th->th_ta;
666 psaddr_t pt, pt_temp;
667 long lwp;
668 int ret;
669 td_thr_events_e tmp;
670
671 TDBG_FUNC();
672 pt = th->th_thread;
673 ret = ps_pread(ta->ph, ta->thread_last_event_addr, &pt_temp, sizeof(pt_temp));

--- 24 unchanged lines hidden (view full) ---

698 handle.th_ta = ta;
699 handle.th_tid = lwp;
700 handle.th_thread = pt;
701 msg->th_p = &handle;
702 return (0);
703}
704
705static td_err_e
706pt_thr_sstep(const td_thrhandle_t *th, int step)
707{
708 TDBG_FUNC();
709
710 return pt_validate(th);
711}
712
713static int
714pt_validate(const td_thrhandle_t *th)

--- 81 unchanged lines hidden ---