1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21: #include "thread_dbP.h"
22: #include <alloca.h>
23:
24: td_err_e
25: td_ta_tsd_iter (const td_thragent_t *ta_arg, td_key_iter_f *callback,
26: void *cbdata_p)
27: {
28: td_thragent_t *const ta = (td_thragent_t *) ta_arg;
29: td_err_e err;
30: void *keys;
31: size_t keys_nb, keys_elemsize;
32: psaddr_t addr;
33: uint32_t idx;
34:
35: LOG ("td_ta_tsd_iter");
36:
37:
38: if (! ta_ok (ta))
39: return TD_BADTA;
40:
41:
42: addr = 0;
43: err = _td_locate_field (ta,
44: ta->ta_var___pthread_keys, SYM_DESC___pthread_keys,
45: (psaddr_t) 0 + 1, &addr);
46: if (err != TD_OK)
47: return err;
48:
49:
50: keys_elemsize = (addr - (psaddr_t) 0) / 8;
51: keys_nb = keys_elemsize * DB_DESC_NELEM (ta->ta_var___pthread_keys);
52: keys = __alloca (keys_nb);
53: err = DB_GET_SYMBOL (addr, ta, __pthread_keys);
54: if (err != TD_OK)
55: return err;
56: if (ps_pdread (ta->ph, addr, keys, keys_nb) != PS_OK)
57: return TD_ERR;
58:
59:
60: for (idx = 0; idx < DB_DESC_NELEM (ta->ta_var___pthread_keys); ++idx)
61: {
62: psaddr_t seq, destr;
63: err = DB_GET_FIELD_LOCAL (seq, ta, keys, pthread_key_struct, seq, 0);
64: if (err != TD_OK)
65: return err;
66: if (((uintptr_t) seq) & 1)
67: {
68: err = DB_GET_FIELD_LOCAL (destr, ta, keys, pthread_key_struct,
69: destr, 0);
70: if (err != TD_OK)
71: return err;
72:
73: if (callback ((thread_key_t) idx, destr, cbdata_p) != 0)
74: return TD_DBERR;
75: }
76:
77: keys += keys_elemsize;
78: }
79:
80: return TD_OK;
81: }