Back to index

glibc  2.9
Classes | Defines | Typedefs | Enumerations | Functions | Variables
thread_dbP.h File Reference
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include "proc_service.h"
#include "thread_db.h"
#include "../nptl/pthreadP.h"
#include "structs.def"

Go to the source code of this file.

Classes

struct  td_thragent
union  td_thragent.ta_howto_data

Defines

#define DB_STRUCT(type)   SYM_SIZEOF_##type,
#define DB_STRUCT_FIELD(type, field)   SYM_##type##_FIELD_##field,
#define DB_SYMBOL(name)   SYM_##name,
#define DB_FUNCTION(name)   SYM_##name,
#define DB_VARIABLE(name)   SYM_##name, SYM_DESC_##name,
#define LOG(c)   if (__td_debug) write (2, c "\n", strlen (c "\n"))
#define DB_DESC_SIZE(desc)   ((desc)[0])
#define DB_DESC_NELEM(desc)   ((desc)[1])
#define DB_DESC_OFFSET(desc)   ((desc)[2])
#define DB_SIZEOF_DESC   (3 * sizeof (uint32_t))
#define DB_DEFINE_DESC(name, size, nelem, offset)   const uint32_t name[3] = { (size), (nelem), (offset) }
#define DB_STRUCT(type)   uint32_t ta_sizeof_##type;
#define DB_STRUCT_FIELD(type, field)   db_desc_t ta_field_##type##_##field;
#define DB_SYMBOL(name)   psaddr_t ta_addr_##name;
#define DB_FUNCTION(name)   psaddr_t ta_addr_##name;
#define DB_VARIABLE(name)
#define DB_GET_SYMBOL(var, ta, name)
#define DB_GET_FIELD(var, ta, ptr, type, field, idx)
#define DB_GET_FIELD_ADDRESS(var, ta, ptr, type, field, idx)
#define DB_GET_FIELD_LOCAL(var, ta, ptr, type, field, idx)
#define DB_GET_VALUE(var, ta, name, idx)
#define DB_PUT_FIELD(ta, ptr, type, field, idx, value)
#define DB_PUT_FIELD_LOCAL(ta, ptr, type, field, idx, value)
#define DB_PUT_VALUE(ta, name, idx, value)
#define DB_GET_STRUCT(var, ta, ptr, type)
#define DB_PUT_STRUCT(ta, ptr, type, copy)

Typedefs

typedef uint32_t db_desc_t [3]

Enumerations

enum  {
  SYM_TH_UNIQUE_CONST_THREAD_AREA, SYM_TH_UNIQUE_REGISTER64, SYM_TH_UNIQUE_REGISTER32, SYM_TH_UNIQUE_REGISTER64_THREAD_AREA,
  SYM_TH_UNIQUE_REGISTER32_THREAD_AREA, SYM_NUM_MESSAGES
}

Functions

static bool ta_ok (const td_thragent_t *ta)
ps_err_e td_lookup (struct ps_prochandle *ps, int idx, psaddr_t *sym_addr) attribute_hidden
td_err_e _td_locate_field (td_thragent_t *ta, db_desc_t desc, int descriptor_name, psaddr_t idx, psaddr_t *address) attribute_hidden
td_err_e _td_fetch_value (td_thragent_t *ta, db_desc_t field, int descriptor_name, psaddr_t idx, psaddr_t address, psaddr_t *result) attribute_hidden
td_err_e _td_fetch_value_local (td_thragent_t *ta, db_desc_t field, int descriptor_name, psaddr_t idx, void *address, psaddr_t *result) attribute_hidden
td_err_e _td_store_value (td_thragent_t *ta, db_desc_t field, int descriptor_name, psaddr_t idx, psaddr_t address, psaddr_t value) attribute_hidden
td_err_e _td_store_value_local (td_thragent_t *ta, db_desc_t field, int descriptor_name, psaddr_t idx, void *address, psaddr_t value) attribute_hidden
td_err_e _td_check_sizeof (td_thragent_t *ta, uint32_t *sizep, int sizep_name) attribute_hidden
td_err_e __td_ta_lookup_th_unique (const td_thragent_t *ta, lwpid_t lwpid, td_thrhandle_t *th)

Variables

int __td_debug attribute_hidden

Class Documentation

union td_thragent.ta_howto_data

Definition at line 113 of file thread_dbP.h.

Class Members
uint32_t const_thread_area
db_desc_t reg
db_desc_t reg_thread_area

Define Documentation

#define DB_DEFINE_DESC (   name,
  size,
  nelem,
  offset 
)    const uint32_t name[3] = { (size), (nelem), (offset) }

Definition at line 71 of file thread_dbP.h.

#define DB_DESC_NELEM (   desc)    ((desc)[1])

Definition at line 68 of file thread_dbP.h.

#define DB_DESC_OFFSET (   desc)    ((desc)[2])

Definition at line 69 of file thread_dbP.h.

#define DB_DESC_SIZE (   desc)    ((desc)[0])

Definition at line 67 of file thread_dbP.h.

#define DB_FUNCTION (   name)    SYM_##name,

Definition at line 93 of file thread_dbP.h.

#define DB_FUNCTION (   name)    psaddr_t ta_addr_##name;

Definition at line 93 of file thread_dbP.h.

#define DB_GET_FIELD (   var,
  ta,
  ptr,
  type,
  field,
  idx 
)
Value:
_td_fetch_value ((ta), (ta)->ta_field_##type##_##field, \
                 SYM_##type##_FIELD_##field, \
                 (psaddr_t) 0 + (idx), (ptr), &(var))

Definition at line 157 of file thread_dbP.h.

#define DB_GET_FIELD_ADDRESS (   var,
  ta,
  ptr,
  type,
  field,
  idx 
)
Value:
((var) = (ptr), _td_locate_field ((ta), (ta)->ta_field_##type##_##field, \
                                SYM_##type##_FIELD_##field, \
                                (psaddr_t) 0 + (idx), &(var)))

Definition at line 162 of file thread_dbP.h.

#define DB_GET_FIELD_LOCAL (   var,
  ta,
  ptr,
  type,
  field,
  idx 
)
Value:
_td_fetch_value_local ((ta), (ta)->ta_field_##type##_##field, \
                       SYM_##type##_FIELD_##field, \
                      (psaddr_t) 0 + (idx), (ptr), &(var))

Definition at line 175 of file thread_dbP.h.

#define DB_GET_STRUCT (   var,
  ta,
  ptr,
  type 
)
Value:
({ td_err_e _err = TD_OK;                                            \
     if ((ta)->ta_sizeof_##type == 0)                                       \
       _err = _td_check_sizeof ((ta), &(ta)->ta_sizeof_##type,              \
                                  SYM_SIZEOF_##type);                \
     if (_err == TD_OK)                                                     \
       _err = ps_pdread ((ta)->ph, (ptr),                            \
                      (var) = __alloca ((ta)->ta_sizeof_##type),            \
                      (ta)->ta_sizeof_##type)                        \
        == PS_OK ? TD_OK : TD_ERR;                                   \
     else                                                            \
       (var) = NULL;                                                        \
     _err;                                                           \
  })

Definition at line 231 of file thread_dbP.h.

#define DB_GET_SYMBOL (   var,
  ta,
  name 
)
Value:
(((ta)->ta_addr_##name == 0                                          \
    && td_lookup ((ta)->ph, SYM_##name, &(ta)->ta_addr_##name) != PS_OK)      \
   ? TD_ERR : ((var) = (ta)->ta_addr_##name, TD_OK))

Definition at line 150 of file thread_dbP.h.

#define DB_GET_VALUE (   var,
  ta,
  name,
  idx 
)
Value:
(((ta)->ta_addr_##name == 0                                          \
    && td_lookup ((ta)->ph, SYM_##name, &(ta)->ta_addr_##name) != PS_OK)      \
   ? TD_ERR                                                          \
   : _td_fetch_value ((ta), (ta)->ta_var_##name, SYM_DESC_##name,           \
                    (psaddr_t) 0 + (idx), (ta)->ta_addr_##name, &(var)))

Definition at line 182 of file thread_dbP.h.

#define DB_PUT_FIELD (   ta,
  ptr,
  type,
  field,
  idx,
  value 
)
Value:
_td_store_value ((ta), (ta)->ta_field_##type##_##field, \
                 SYM_##type##_FIELD_##field, \
                 (psaddr_t) 0 + (idx), (ptr), (value))

Definition at line 202 of file thread_dbP.h.

#define DB_PUT_FIELD_LOCAL (   ta,
  ptr,
  type,
  field,
  idx,
  value 
)
Value:
_td_store_value_local ((ta), (ta)->ta_field_##type##_##field, \
                      SYM_##type##_FIELD_##field, \
                      (psaddr_t) 0 + (idx), (ptr), (value))

Definition at line 207 of file thread_dbP.h.

#define DB_PUT_STRUCT (   ta,
  ptr,
  type,
  copy 
)
Value:
({ assert ((ta)->ta_sizeof_##type != 0);                             \
     ps_pdwrite ((ta)->ph, (ptr), (copy), (ta)->ta_sizeof_##type)           \
       == PS_OK ? TD_OK : TD_ERR;                                    \
  })

Definition at line 245 of file thread_dbP.h.

#define DB_PUT_VALUE (   ta,
  name,
  idx,
  value 
)
Value:
(((ta)->ta_addr_##name == 0                                          \
    && td_lookup ((ta)->ph, SYM_##name, &(ta)->ta_addr_##name) != PS_OK)      \
   ? TD_ERR                                                          \
   : _td_store_value ((ta), (ta)->ta_var_##name, SYM_DESC_##name,           \
                    (psaddr_t) 0 + (idx), (ta)->ta_addr_##name, (value)))

Definition at line 214 of file thread_dbP.h.

#define DB_SIZEOF_DESC   (3 * sizeof (uint32_t))

Definition at line 70 of file thread_dbP.h.

#define DB_STRUCT (   type)    SYM_SIZEOF_##type,

Definition at line 87 of file thread_dbP.h.

#define DB_STRUCT (   type)    uint32_t ta_sizeof_##type;

Definition at line 87 of file thread_dbP.h.

#define DB_STRUCT_FIELD (   type,
  field 
)    SYM_##type##_FIELD_##field,

Definition at line 89 of file thread_dbP.h.

#define DB_STRUCT_FIELD (   type,
  field 
)    db_desc_t ta_field_##type##_##field;

Definition at line 89 of file thread_dbP.h.

#define DB_SYMBOL (   name)    SYM_##name,

Definition at line 91 of file thread_dbP.h.

#define DB_SYMBOL (   name)    psaddr_t ta_addr_##name;

Definition at line 91 of file thread_dbP.h.

#define DB_VARIABLE (   name)    SYM_##name, SYM_DESC_##name,

Definition at line 95 of file thread_dbP.h.

#define DB_VARIABLE (   name)
Value:
psaddr_t ta_addr_##name; \
  db_desc_t ta_var_##name;

Definition at line 95 of file thread_dbP.h.

#define LOG (   c)    if (__td_debug) write (2, c "\n", strlen (c "\n"))

Definition at line 60 of file thread_dbP.h.


Typedef Documentation

typedef uint32_t db_desc_t[3]

Definition at line 73 of file thread_dbP.h.


Enumeration Type Documentation

anonymous enum
Enumerator:
SYM_TH_UNIQUE_CONST_THREAD_AREA 
SYM_TH_UNIQUE_REGISTER64 
SYM_TH_UNIQUE_REGISTER32 
SYM_TH_UNIQUE_REGISTER64_THREAD_AREA 
SYM_TH_UNIQUE_REGISTER32_THREAD_AREA 
SYM_NUM_MESSAGES 

Definition at line 34 of file thread_dbP.h.

  {
# define DB_STRUCT(type)           SYM_SIZEOF_##type,
# define DB_STRUCT_FIELD(type, field)     SYM_##type##_FIELD_##field,
# define DB_SYMBOL(name)           SYM_##name,
# define DB_FUNCTION(name)         SYM_##name,
# define DB_VARIABLE(name)         SYM_##name, SYM_DESC_##name,
# include "structs.def"
# undef DB_STRUCT
# undef DB_STRUCT_FIELD
# undef DB_SYMBOL
# undef DB_FUNCTION
# undef DB_VARIABLE

    SYM_TH_UNIQUE_CONST_THREAD_AREA,
    SYM_TH_UNIQUE_REGISTER64,
    SYM_TH_UNIQUE_REGISTER32,
    SYM_TH_UNIQUE_REGISTER64_THREAD_AREA,
    SYM_TH_UNIQUE_REGISTER32_THREAD_AREA,

    SYM_NUM_MESSAGES
  };

Function Documentation

td_err_e __td_ta_lookup_th_unique ( const td_thragent_t *  ta,
lwpid_t  lwpid,
td_thrhandle_t th 
)

Definition at line 27 of file td_ta_map_lwp2thr.c.

{
  td_thragent_t *const ta = (td_thragent_t *) ta_arg;
  ps_err_e err;
  td_err_e terr;
  prgregset_t regs;
  psaddr_t addr;

  LOG ("td_ta_map_lwp2thr");

  /* Test whether the TA parameter is ok.  */
  if (! ta_ok (ta))
    return TD_BADTA;

  if (ta->ta_howto == ta_howto_unknown)
    {
      /* We need to read in from the inferior the instructions what to do.  */
      psaddr_t howto;

      err = td_lookup (ta->ph, SYM_TH_UNIQUE_CONST_THREAD_AREA, &howto);
      if (err == PS_OK)
       {
         err = ps_pdread (ta->ph, howto,
                        &ta->ta_howto_data.const_thread_area,
                        sizeof ta->ta_howto_data.const_thread_area);
         if (err != PS_OK)
           return TD_ERR;
         ta->ta_howto = ta_howto_const_thread_area;
         if (ta->ta_howto_data.const_thread_area & 0xff000000U)
           ta->ta_howto_data.const_thread_area
             = bswap_32 (ta->ta_howto_data.const_thread_area);
       }
      else
       {
         switch (sizeof (regs[0]))
           {
           case 8:
             err = td_lookup (ta->ph, SYM_TH_UNIQUE_REGISTER64, &howto);
             if (err == PS_OK)
              ta->ta_howto = ta_howto_reg;
             else if (err == PS_NOSYM)
              {
                err = td_lookup (ta->ph,
                               SYM_TH_UNIQUE_REGISTER64_THREAD_AREA,
                               &howto);
                if (err == PS_OK)
                  ta->ta_howto = ta_howto_reg_thread_area;
              }
             break;

           case 4:
             err = td_lookup (ta->ph, SYM_TH_UNIQUE_REGISTER32, &howto);
             if (err == PS_OK)
              ta->ta_howto = ta_howto_reg;
             else if (err == PS_NOSYM)
              {
                err = td_lookup (ta->ph,
                               SYM_TH_UNIQUE_REGISTER32_THREAD_AREA,
                               &howto);
                if (err == PS_OK)
                  ta->ta_howto = ta_howto_reg_thread_area;
              }
             break;

           default:
             abort ();
             return TD_DBERR;
           }

         if (err != PS_OK)
           return TD_DBERR;

         /* For either of these methods we read in the same descriptor.  */
         err = ps_pdread (ta->ph, howto,
                        ta->ta_howto_data.reg, DB_SIZEOF_DESC);
         if (err != PS_OK)
           return TD_ERR;
         if (DB_DESC_SIZE (ta->ta_howto_data.reg) == 0)
           return TD_DBERR;
         if (DB_DESC_SIZE (ta->ta_howto_data.reg) & 0xff000000U)
           {
             /* Byte-swap these words, though we leave the size word
               in native order as the handy way to distinguish.  */
             DB_DESC_OFFSET (ta->ta_howto_data.reg)
              = bswap_32 (DB_DESC_OFFSET (ta->ta_howto_data.reg));
             DB_DESC_NELEM (ta->ta_howto_data.reg)
              = bswap_32 (DB_DESC_NELEM (ta->ta_howto_data.reg));
           }
       }
    }

  switch (ta->ta_howto)
    {
    default:
      return TD_DBERR;

    case ta_howto_reg:
      /* On most machines, we are just looking at a register.  */
      if (ps_lgetregs (ta->ph, lwpid, regs) != PS_OK)
       return TD_ERR;
      terr = _td_fetch_value_local (ta, ta->ta_howto_data.reg, -1,
                                0, regs, &addr);
      if (terr != TD_OK)
       return terr;

      /* In this descriptor the nelem word is overloaded as the bias.  */
      addr += (int32_t) DB_DESC_NELEM (ta->ta_howto_data.reg);
      th->th_unique = addr;
      break;

    case ta_howto_const_thread_area:
      /* Some hosts don't have this call and this case won't be used.  */
# pragma weak ps_get_thread_area
      if (&ps_get_thread_area == NULL)
       return TD_NOCAPAB;

      /* A la x86-64, there is a magic index for get_thread_area.  */
      if (ps_get_thread_area (ta->ph, lwpid,
                           ta->ta_howto_data.const_thread_area,
                           &th->th_unique) != PS_OK)
       return TD_ERR;       /* XXX Other error value?  */
      break;

    case ta_howto_reg_thread_area:
      if (&ps_get_thread_area == NULL)
       return TD_NOCAPAB;

      /* A la i386, a register holds the index for get_thread_area.  */
      if (ps_lgetregs (ta->ph, lwpid, regs) != PS_OK)
       return TD_ERR;
      terr = _td_fetch_value_local (ta, ta->ta_howto_data.reg_thread_area,
                                -1, 0, regs, &addr);
      if (terr != TD_OK)
       return terr;
      /* In this descriptor the nelem word is overloaded as scale factor.  */
      if (ps_get_thread_area
         (ta->ph, lwpid,
          ((addr - (psaddr_t) 0)
           >> DB_DESC_NELEM (ta->ta_howto_data.reg_thread_area)),
          &th->th_unique) != PS_OK)
       return TD_ERR;       /* XXX Other error value?  */
      break;
    }

  /* Found it.  Now complete the `td_thrhandle_t' object.  */
  th->th_ta_p = ta;

  return TD_OK;
}

Here is the call graph for this function:

Here is the caller graph for this function:

td_err_e _td_check_sizeof ( td_thragent_t *  ta,
uint32_t sizep,
int  sizep_name 
)

Definition at line 25 of file fetch-value.c.

{
  if (*sizep == 0)
    {
      psaddr_t descptr;
      ps_err_e err = td_lookup (ta->ph, sizep_name, &descptr);
      if (err == PS_NOSYM)
       return TD_NOCAPAB;
      if (err == PS_OK)
       err = ps_pdread (ta->ph, descptr, sizep, sizeof *sizep);
      if (err != PS_OK)
       return TD_ERR;
      if (*sizep & 0xff000000U)
       *sizep = bswap_32 (*sizep);
    }
  return TD_OK;
}

Here is the call graph for this function:

Here is the caller graph for this function:

td_err_e _td_fetch_value ( td_thragent_t *  ta,
db_desc_t  field,
int  descriptor_name,
psaddr_t  idx,
psaddr_t  address,
psaddr_t result 
)

Definition at line 87 of file fetch-value.c.

{
  ps_err_e err;
  td_err_e terr = _td_locate_field (ta, desc, descriptor_name, idx, &address);
  if (terr != TD_OK)
    return terr;

  if (DB_DESC_SIZE (desc) == 8 || DB_DESC_SIZE (desc) == bswap_32 (8))
    {
      uint8_t value;
      err = ps_pdread (ta->ph, address, &value, sizeof value);
      *result = (psaddr_t) 0 + value;
    }
  else if (DB_DESC_SIZE (desc) == 32)
    {
      uint32_t value;
      err = ps_pdread (ta->ph, address, &value, sizeof value);
      *result = (psaddr_t) 0 + value;
    }
  else if (DB_DESC_SIZE (desc) == 64)
    {
      uint64_t value;
      if (sizeof (psaddr_t) < 8)
       return TD_NOCAPAB;
      err = ps_pdread (ta->ph, address, &value, sizeof value);
      *result = (psaddr_t) 0 + value;
    }
  else if (DB_DESC_SIZE (desc) == bswap_32 (32))
    {
      uint32_t value;
      err = ps_pdread (ta->ph, address, &value, sizeof value);
      value = bswap_32 (value);
      *result = (psaddr_t) 0 + value;
    }
  else if (DB_DESC_SIZE (desc) == bswap_32 (64))
    {
      uint64_t value;
      if (sizeof (psaddr_t) < 8)
       return TD_NOCAPAB;
      err = ps_pdread (ta->ph, address, &value, sizeof value);
      value = bswap_64 (value);
      *result = (psaddr_t) 0 + value;
    }
  else
    return TD_DBERR;

  return err == PS_OK ? TD_OK : TD_ERR;
}

Here is the call graph for this function:

td_err_e _td_fetch_value_local ( td_thragent_t *  ta,
db_desc_t  field,
int  descriptor_name,
psaddr_t  idx,
void *  address,
psaddr_t result 
)

Definition at line 188 of file fetch-value.c.

{
  td_err_e terr = _td_locate_field (ta, desc, descriptor_name, idx, &address);
  if (terr != TD_OK)
    return terr;

  if (DB_DESC_SIZE (desc) == 8 || DB_DESC_SIZE (desc) == bswap_32 (8))
    {
      uint8_t value;
      memcpy (&value, address, sizeof value);
      *result = (psaddr_t) 0 + value;
    }
  else if (DB_DESC_SIZE (desc) == 32)
    {
      uint32_t value;
      memcpy (&value, address, sizeof value);
      *result = (psaddr_t) 0 + value;
    }
  else if (DB_DESC_SIZE (desc) == 64)
    {
      uint64_t value;
      if (sizeof (psaddr_t) < 8)
       return TD_NOCAPAB;
      memcpy (&value, address, sizeof value);
      *result = (psaddr_t) 0 + value;
    }
  else if (DB_DESC_SIZE (desc) == bswap_32 (32))
    {
      uint32_t value;
      memcpy (&value, address, sizeof value);
      value = bswap_32 (value);
      *result = (psaddr_t) 0 + value;
    }
  else if (DB_DESC_SIZE (desc) == bswap_32 (64))
    {
      uint64_t value;
      if (sizeof (psaddr_t) < 8)
       return TD_NOCAPAB;
      memcpy (&value, address, sizeof value);
      value = bswap_64 (value);
      *result = (psaddr_t) 0 + value;
    }
  else
    return TD_DBERR;

  return TD_OK;
}

Here is the call graph for this function:

Here is the caller graph for this function:

td_err_e _td_locate_field ( td_thragent_t *  ta,
db_desc_t  desc,
int  descriptor_name,
psaddr_t  idx,
psaddr_t address 
)

Definition at line 44 of file fetch-value.c.

{
  uint32_t elemsize;

  if (DB_DESC_SIZE (desc) == 0)
    {
      /* Read the information about this field from the inferior.  */
      psaddr_t descptr;
      ps_err_e err = td_lookup (ta->ph, descriptor_name, &descptr);
      if (err == PS_NOSYM)
       return TD_NOCAPAB;
      if (err == PS_OK)
       err = ps_pdread (ta->ph, descptr, desc, DB_SIZEOF_DESC);
      if (err != PS_OK)
       return TD_ERR;
      if (DB_DESC_SIZE (desc) == 0)
       return TD_DBERR;
      if (DB_DESC_SIZE (desc) & 0xff000000U)
       {
         /* Byte-swap these words, though we leave the size word
            in native order as the handy way to distinguish.  */
         DB_DESC_OFFSET (desc) = bswap_32 (DB_DESC_OFFSET (desc));
         DB_DESC_NELEM (desc) = bswap_32 (DB_DESC_NELEM (desc));
       }
    }

  if (idx != 0 && idx - (psaddr_t) 0 > DB_DESC_NELEM (desc))
    /* This is an internal indicator to callers with nonzero IDX
       that the IDX value is too big.  */
    return TD_NOAPLIC;

  elemsize = DB_DESC_SIZE (desc);
  if (elemsize & 0xff000000U)
    elemsize = bswap_32 (elemsize);

  *address += (int32_t) DB_DESC_OFFSET (desc);
  *address += (elemsize / 8 * (idx - (psaddr_t) 0));
  return TD_OK;
}

Here is the call graph for this function:

Here is the caller graph for this function:

td_err_e _td_store_value ( td_thragent_t *  ta,
db_desc_t  field,
int  descriptor_name,
psaddr_t  idx,
psaddr_t  address,
psaddr_t  value 
)
td_err_e _td_store_value_local ( td_thragent_t *  ta,
db_desc_t  field,
int  descriptor_name,
psaddr_t  idx,
void *  address,
psaddr_t  value 
)
static bool ta_ok ( const td_thragent_t *  ta) [inline, static]

Definition at line 130 of file thread_dbP.h.

{
  list_t *runp;

  list_for_each (runp, &__td_agent_list)
    if (list_entry (runp, td_thragent_t, list) == ta)
      return true;

  return false;
}
ps_err_e td_lookup ( struct ps_prochandle *  ps,
int  idx,
psaddr_t sym_addr 
)

Definition at line 58 of file td_symbol_list.c.

{
  assert (idx >= 0 && idx < NUM_MESSAGES);
  return ps_pglobal_lookup (ps, LIBPTHREAD_SO, symbol_list_arr[idx], sym_addr);
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

Definition at line 125 of file thread_dbP.h.