libthr_db.c (180982) | libthr_db.c (181341) |
---|---|
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> | 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 $"); | 29__FBSDID("$FreeBSD: head/lib/libthread_db/libthr_db.c 181341 2008-08-06 03:14:18Z 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 | 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) | 248pt_ta_thr_iter(const td_thragent_t *ta, td_thr_iter_f *callback, 249 void *cbdata_p, td_thr_state_e state __unused, int ti_pri __unused, 250 sigset_t *ti_sigmask_p __unused, unsigned int ti_user_flags __unused) |
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{ | 251{ 252 TAILQ_HEAD(, pthread) thread_list; 253 td_thrhandle_t th; 254 psaddr_t pt; 255 long lwp; 256 int ret; 257 258 TDBG_FUNC(); --- 22 unchanged lines hidden (view full) --- 281 return (P2T(ret)); 282 } 283 return (TD_OK); 284} 285 286static td_err_e 287pt_ta_tsd_iter(const td_thragent_t *ta, td_key_iter_f *ki, void *arg) 288{ |
291 char *keytable; | 289 void *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++) { | 290 void *destructor; 291 int i, ret, allocated; 292 293 TDBG_FUNC(); 294 295 keytable = malloc(ta->thread_max_keys * ta->thread_size_key); 296 if (keytable == NULL) 297 return (TD_MALLOC); 298 ret = ps_pread(ta->ph, (psaddr_t)ta->thread_keytable_addr, keytable, 299 ta->thread_max_keys * ta->thread_size_key); 300 if (ret != 0) { 301 free(keytable); 302 return (P2T(ret)); 303 } 304 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); | 305 allocated = *(int *)(void *)((uintptr_t)keytable + 306 i * ta->thread_size_key + ta->thread_off_key_allocated); 307 destructor = *(void **)(void *)((uintptr_t)keytable + 308 i * ta->thread_size_key + 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{ | 309 if (allocated) { 310 ret = (ki)(i, destructor, arg); 311 if (ret != 0) { 312 free(keytable); 313 return (TD_DBERR); 314 } 315 } 316 } --- 98 unchanged lines hidden (view full) --- 415 handle.th_thread = pt; 416 msg->th_p = &handle; 417 return (0); 418} 419 420static td_err_e 421pt_dbsuspend(const td_thrhandle_t *th, int suspend) 422{ |
425 td_thragent_t *ta = (td_thragent_t *)th->th_ta; | 423 const td_thragent_t *ta = 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; | 424 int ret; 425 426 TDBG_FUNC(); 427 428 ret = pt_validate(th); 429 if (ret) 430 return (ret); 431 --- 223 unchanged lines hidden (view full) --- 655 &mask, sizeof(mask)); 656 return (P2T(ret)); 657} 658 659static td_err_e 660pt_thr_event_getmsg(const td_thrhandle_t *th, td_event_msg_t *msg) 661{ 662 static td_thrhandle_t handle; |
665 td_thragent_t *ta = (td_thragent_t *)th->th_ta; | 663 const td_thragent_t *ta = 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 | 664 psaddr_t pt, pt_temp; 665 long lwp; 666 int ret; 667 td_thr_events_e tmp; 668 669 TDBG_FUNC(); 670 pt = th->th_thread; 671 ret = ps_pread(ta->ph, ta->thread_last_event_addr, &pt_temp, sizeof(pt_temp)); --- 24 unchanged lines hidden (view full) --- 696 handle.th_ta = ta; 697 handle.th_tid = lwp; 698 handle.th_thread = pt; 699 msg->th_p = &handle; 700 return (0); 701} 702 703static td_err_e |
706pt_thr_sstep(const td_thrhandle_t *th, int step) | 704pt_thr_sstep(const td_thrhandle_t *th, int step __unused) |
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 --- | 705{ 706 TDBG_FUNC(); 707 708 return pt_validate(th); 709} 710 711static int 712pt_validate(const td_thrhandle_t *th) --- 81 unchanged lines hidden --- |