1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21: #include <stddef.h>
22: #include <string.h>
23:
24: #include "thread_dbP.h"
25:
26:
27: td_err_e
28: td_ta_event_getmsg (const td_thragent_t *ta_arg, td_event_msg_t *msg)
29: {
30: td_thragent_t *const ta = (td_thragent_t *) ta_arg;
31: td_err_e err;
32: psaddr_t eventbuf, eventnum, eventdata;
33: psaddr_t thp, next;
34: void *copy;
35:
36:
37:
38: static td_thrhandle_t th;
39:
40: LOG ("td_thr_event_getmsg");
41:
42:
43: if (! ta_ok (ta))
44: return TD_BADTA;
45:
46:
47: err = DB_GET_VALUE (thp, ta, __nptl_last_event, 0);
48: if (err != TD_OK)
49: return err;
50:
51: if (thp == 0)
52:
53: return TD_NOMSG;
54:
55:
56: err = DB_GET_FIELD_ADDRESS (eventbuf, ta, thp, pthread, eventbuf, 0);
57: if (err == TD_OK)
58: err = DB_GET_STRUCT (copy, ta, eventbuf, td_eventbuf_t);
59: if (err != TD_OK)
60: return err;
61:
62:
63: err = DB_GET_FIELD_LOCAL (eventnum, ta, copy, td_eventbuf_t, eventnum, 0);
64: if (err != TD_OK)
65: return err;
66:
67: if ((int) (uintptr_t) eventnum == TD_EVENT_NONE)
68: return TD_DBERR;
69:
70:
71: err = DB_GET_FIELD_LOCAL (eventdata, ta, copy, td_eventbuf_t, eventdata, 0);
72: if (err != TD_OK)
73: return err;
74:
75:
76: th.th_ta_p = (td_thragent_t *) ta;
77: th.th_unique = thp;
78:
79:
80: msg->msg.data = (uintptr_t) eventdata;
81: msg->event = (uintptr_t) eventnum;
82: msg->th_p = &th;
83:
84:
85: memset (copy, 0, ta->ta_sizeof_td_eventbuf_t);
86: err = DB_PUT_STRUCT (ta, eventbuf, td_eventbuf_t, copy);
87: if (err != TD_OK)
88: return err;
89:
90:
91: err = DB_GET_FIELD (next, ta, thp, pthread, nextevent, 0);
92: if (err != TD_OK)
93: return err;
94:
95:
96: err = DB_PUT_VALUE (ta, __nptl_last_event, 0, next);
97: if (err != TD_OK)
98: return err;
99:
100: if (next != 0)
101:
102: err = DB_PUT_FIELD (ta, thp, pthread, nextevent, 0, 0);
103:
104: return err;
105: }