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 <assert.h>
23:
24:
25: td_err_e
26: td_thr_event_getmsg (const td_thrhandle_t *th, td_event_msg_t *msg)
27: {
28: td_err_e err;
29: psaddr_t eventbuf, eventnum, eventdata;
30: psaddr_t thp, prevp;
31: void *copy;
32:
33: LOG ("td_thr_event_getmsg");
34:
35:
36: err = DB_GET_FIELD_ADDRESS (eventbuf, th->th_ta_p, th->th_unique, pthread,
37: eventbuf, 0);
38: if (err == TD_OK)
39: err = DB_GET_STRUCT (copy, th->th_ta_p, eventbuf, td_eventbuf_t);
40: if (err != TD_OK)
41: return err;
42:
43:
44: err = DB_GET_FIELD_LOCAL (eventnum, th->th_ta_p, copy,
45: td_eventbuf_t, eventnum, 0);
46: if (err != TD_OK)
47: return err;
48: if ((int) (uintptr_t) eventnum == TD_EVENT_NONE)
49:
50: return TD_NOMSG;
51:
52:
53: err = DB_GET_FIELD_LOCAL (eventdata, th->th_ta_p, copy,
54: td_eventbuf_t, eventdata, 0);
55: if (err != TD_OK)
56: return err;
57:
58: msg->msg.data = (uintptr_t) eventdata;
59: msg->event = (uintptr_t) eventnum;
60: msg->th_p = th;
61:
62:
63: memset (copy, 0, th->th_ta_p->ta_sizeof_td_eventbuf_t);
64: err = DB_PUT_STRUCT (th->th_ta_p, eventbuf, td_eventbuf_t, copy);
65: if (err != TD_OK)
66: return err;
67:
68:
69:
70:
71:
72: err = DB_GET_SYMBOL (prevp, th->th_ta_p, __nptl_last_event);
73: if (err != TD_OK)
74: return err;
75: err = DB_GET_VALUE (thp, th->th_ta_p, __nptl_last_event, 0);
76: if (err != TD_OK)
77: return err;
78:
79: while (thp != 0)
80: {
81: psaddr_t next;
82: err = DB_GET_FIELD (next, th->th_ta_p, th->th_unique, pthread,
83: nextevent, 0);
84: if (err != TD_OK)
85: return err;
86:
87: if (next == thp)
88: return TD_DBERR;
89:
90: if (thp == th->th_unique)
91: {
92:
93: psaddr_t next_nextp;
94: err = DB_GET_FIELD_ADDRESS (next_nextp, th->th_ta_p, next, pthread,
95: nextevent, 0);
96: assert (err == TD_OK);
97: if (prevp == next_nextp)
98: return TD_DBERR;
99:
100: err = _td_store_value (th->th_ta_p,
101: th->th_ta_p->ta_var___nptl_last_event, -1,
102: 0, prevp, next);
103: if (err != TD_OK)
104: return err;
105:
106:
107:
108: return DB_PUT_FIELD (th->th_ta_p, thp, pthread, nextevent, 0, 0);
109: }
110:
111: err = DB_GET_FIELD_ADDRESS (prevp, th->th_ta_p, thp, pthread,
112: nextevent, 0);
113: assert (err == TD_OK);
114: thp = next;
115: }
116:
117:
118: return TD_DBERR;
119: }