13955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng/* 23955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * Copyright (C) 2013 The Android Open Source Project 33955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * 43955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 53955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * you may not use this file except in compliance with the License. 63955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * You may obtain a copy of the License at 73955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * 83955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * http://www.apache.org/licenses/LICENSE-2.0 93955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * 103955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * Unless required by applicable law or agreed to in writing, software 113955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * distributed under the License is distributed on an "AS IS" BASIS, 123955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * See the License for the specific language governing permissions and 143955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * limitations under the License. 153955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng */ 163955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 173955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#ifndef _LIBTHREAD_DB__THREAD_DB_H 183955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define _LIBTHREAD_DB__THREAD_DB_H 193955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 203955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#include <pthread.h> 213955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#include <signal.h> 223955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#include <stdint.h> 233955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#include <sys/types.h> 243955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 253955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef void *psaddr_t; 263955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define HAVE_PSADDR_T 1 273955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 283955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef pid_t lwpid_t; 293955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define HAVE_LWPID_T 1 303955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 313955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define TD_THR_ANY_USER_FLAGS 0xffffffff 323955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define TD_THR_LOWEST_PRIORITY -20 333955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define TD_SIGNO_MASK NULL 343955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 353955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng/* td_err_e values */ 363955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengenum { 373955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_OK, 383955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_ERR, 393955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_NOTHR, 403955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_NOSV, 413955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_NOLWP, 423955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_BADPH, 433955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_BADTH, 443955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_BADSH, 453955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_BADTA, 463955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_BADKEY, 473955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_NOMSG, 483955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_NOFPREGS, 493955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_NOLIBTHREAD, 503955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_NOEVENT, 513955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_NOCAPAB, 523955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_DBERR, 533955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_NOAPLIC, 543955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_NOTSD, 553955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_MALLOC, 563955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_PARTIALREG, 573955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_NOXREGS, 583955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_VERSION 593955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng}; 603955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 613955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng/* 623955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * td_event_e values 633955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * NOTE: There is a max of 32 events 643955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng */ 653955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengenum { 663955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_CREATE, 673955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_DEATH 683955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng}; 693955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 703955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng/* td_thr_state_e values */ 713955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengenum { 723955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_THR_ANY_STATE, 733955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_THR_UNKNOWN, 743955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_THR_SLEEP, 753955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng TD_THR_ZOMBIE 763955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng}; 773955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 783955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef int32_t td_err_e; 793955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef uint32_t td_event_e; 803955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef uint32_t td_notify_e; 813955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef uint32_t td_thr_state_e; 823955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef pthread_t thread_t; 833955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 843955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef struct 853955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng{ 863955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng pid_t pid; 873955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng struct ps_prochandle *ph; 883955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng} td_thragent_t; 893955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 903955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef struct 913955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng{ 923955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng pid_t pid; 933955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng pid_t tid; 943955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng} td_thrhandle_t; 953955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 963955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef struct 973955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng{ 983955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng td_event_e event; 993955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng td_thrhandle_t const * th_p; 1003955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng union { 1013955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng void * data; 1023955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng } msg; 1033955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng} td_event_msg_t; 1043955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1053955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef struct 1063955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng{ 1073955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng uint32_t events; 1083955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng} td_thr_events_t; 1093955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1103955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef struct 1113955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng{ 1123955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng union { 1133955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng void * bptaddr; 1143955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng } u; 1153955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng} td_notify_t; 1163955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1173955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef struct 1183955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng{ 1193955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng td_thr_state_e ti_state; 1203955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng thread_t ti_tid; // pthread's id for the thread 1213955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng int32_t ti_lid; // the kernel's id for the thread 1223955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng} td_thrinfo_t; 1233955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1243955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1253955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define td_event_emptyset(set) \ 1263955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng (set)->events = 0 1273955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1283955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define td_event_fillset(set) \ 1293955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng (set)->events = 0xffffffff 1303955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1313955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define td_event_addset(set, n) \ 1323955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng (set)->events |= (1 << n) 1333955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1343955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1353955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef int td_thr_iter_f(td_thrhandle_t const *, void *); 1363955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1373955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1383955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengstruct ps_prochandle; 1393955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1403955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#ifdef __cplusplus 1413955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern "C"{ 1423955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#endif 1433955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1443955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_ta_new(struct ps_prochandle * proc_handle, td_thragent_t ** thread_agent); 1453955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1463955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_ta_delete(td_thragent_t * ta); 1473955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1483955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_ta_set_event(td_thragent_t const * agent, td_thr_events_t * event); 1493955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1503955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_ta_event_addr(td_thragent_t const * agent, td_event_e event, td_notify_t * notify); 1513955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1523955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_ta_clear_event(const td_thragent_t * ta_arg, 1533955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng td_thr_events_t * event); 1543955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1553955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_ta_event_getmsg(td_thragent_t const * agent, td_event_msg_t * event); 1563955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1573955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_ta_map_lwp2thr(td_thragent_t const * agent, lwpid_t lwpid, 1583955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng td_thrhandle_t *th); 1593955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1603955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_thr_get_info(td_thrhandle_t const * handle, 1613955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng td_thrinfo_t * info); 1623955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1633955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_thr_event_enable(td_thrhandle_t const * handle, 1643955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng td_event_e event); 1653955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1663955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_ta_thr_iter(td_thragent_t const * agent, td_thr_iter_f * func, void * cookie, 1673955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng td_thr_state_e state, int32_t prio, sigset_t * sigmask, uint32_t user_flags); 1683955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1693955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern char const ** td_symbol_list(void); 1703955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1713955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_thr_event_enable(td_thrhandle_t const * handle, td_event_e event); 1723955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1733955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_thr_get_info(td_thrhandle_t const * handle, td_thrinfo_t * info); 1743955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1753955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_thr_tls_get_addr(const td_thrhandle_t * th, 1763955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng psaddr_t map_address, size_t offset, 1773955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng psaddr_t * address); 1783955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1793955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#ifdef __cplusplus 1803955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng} 1813955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#endif 1823955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng 1833955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#endif 184