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 <stdbool.h>
23:
24: static td_err_e
25: check_thread_list (const td_thrhandle_t *th, psaddr_t head, bool *uninit)
26: {
27: td_err_e err;
28: psaddr_t next, ofs;
29:
30: err = DB_GET_FIELD (next, th->th_ta_p, head, list_t, next, 0);
31: if (err == TD_OK)
32: {
33: if (next == 0)
34: {
35: *uninit = true;
36: return TD_NOTHR;
37: }
38: err = DB_GET_FIELD_ADDRESS (ofs, th->th_ta_p, 0, pthread, list, 0);
39: }
40:
41: while (err == TD_OK)
42: {
43: if (next == head)
44: return TD_NOTHR;
45:
46: if (next - (ofs - (psaddr_t) 0) == th->th_unique)
47: return TD_OK;
48:
49: err = DB_GET_FIELD (next, th->th_ta_p, next, list_t, next, 0);
50: }
51:
52: return err;
53: }
54:
55:
56: td_err_e
57: td_thr_validate (const td_thrhandle_t *th)
58: {
59: td_err_e err;
60: psaddr_t list;
61:
62: LOG ("td_thr_validate");
63:
64:
65: bool uninit = false;
66: err = DB_GET_SYMBOL (list, th->th_ta_p, __stack_user);
67: if (err == TD_OK)
68: err = check_thread_list (th, list, &uninit);
69:
70:
71:
72: if (err == TD_NOTHR)
73: {
74: err = DB_GET_SYMBOL (list, th->th_ta_p, stack_used);
75: if (err == TD_OK)
76: err = check_thread_list (th, list, &uninit);
77:
78: if (err == TD_NOTHR && uninit && th->th_unique == 0)
79:
80:
81: err = TD_OK;
82: }
83:
84: return err;
85: }