Revision 37cd5dc2 src/urt_node.c
src/urt_node.c | ||
---|---|---|
69 | 69 |
urtCoreSynchronizeNodes(((urt_node_t*)arg)); |
70 | 70 |
} |
71 | 71 |
|
72 |
|
|
73 | 72 |
while (urtThreadShouldTerminate()) |
74 | 73 |
{ |
75 | 74 |
urt_osEventMask_t temp = urtEventWait(mask, URT_EVENT_WAIT_ONE, URT_DELAY_INFINITE); |
... | ... | |
91 | 90 |
((urt_node_t*)arg)->shutdowncallback(((urt_node_t*)arg), urtCoreGetStatus(), ((urt_node_t*)arg)->shutdownparams); |
92 | 91 |
} |
93 | 92 |
urtEventUnregister(urtCoreGetEvtSource(), &((urt_node_t*)arg)->listener); |
94 |
urt_osThread_t* threadToTerminate = ((urt_node_t*)arg)->thread; |
|
95 |
//urt_osThread_t* threadToTerminate = urtThreadGetSelf(); |
|
96 |
while (threadToTerminate->children != NULL || threadToTerminate->sibling != NULL) |
|
93 |
|
|
94 |
|
|
95 |
//Terminate all children and siblings |
|
96 |
urt_osThread_t* threadToTerminate = urtThreadGetSelf()->children; |
|
97 |
while (threadToTerminate != urtThreadGetSelf() && threadToTerminate != NULL) |
|
97 | 98 |
{ |
99 |
urtThreadTerminate(threadToTerminate, URT_THREAD_TERMINATE_REQUEST); |
|
98 | 100 |
if (threadToTerminate->children != NULL) |
99 |
urtThreadTerminate(threadToTerminate->children, URT_THREAD_TERMINATE_REQUEST); |
|
100 |
if(threadToTerminate->sibling != NULL) |
|
101 |
urtThreadTerminate(threadToTerminate->sibling, URT_THREAD_TERMINATE_REQUEST); |
|
101 |
{ |
|
102 |
threadToTerminate = threadToTerminate->children; |
|
103 |
} |
|
104 |
else |
|
105 |
{ |
|
106 |
if (threadToTerminate->sibling != NULL) |
|
107 |
{ |
|
108 |
threadToTerminate = threadToTerminate->sibling; |
|
109 |
} |
|
110 |
else |
|
111 |
{ |
|
112 |
threadToTerminate = threadToTerminate->parent; |
|
113 |
while (threadToTerminate->sibling == NULL && threadToTerminate != urtThreadGetSelf()) |
|
114 |
{ |
|
115 |
threadToTerminate = threadToTerminate->parent; |
|
116 |
} |
|
117 |
if (threadToTerminate != urtThreadGetSelf()) |
|
118 |
{ |
|
119 |
threadToTerminate = threadToTerminate->sibling; |
|
120 |
} |
|
121 |
} |
|
122 |
} |
|
102 | 123 |
} |
103 | 124 |
|
104 |
urt_osThread_t* threadToJoin = ((urt_node_t*)arg)->thread;
|
|
105 |
while (threadToJoin->children != NULL || threadToJoin->sibling != NULL)
|
|
125 |
urt_osThread_t* threadToJoin = urtThreadGetSelf()->children;
|
|
126 |
while (threadToJoin != urtThreadGetSelf() && threadToJoin != NULL)
|
|
106 | 127 |
{ |
128 |
urtThreadJoin(threadToJoin); |
|
107 | 129 |
if (threadToJoin->children != NULL) |
108 |
urtThreadJoin(threadToJoin->children); |
|
109 |
if(threadToJoin->sibling != NULL) |
|
110 |
urtThreadJoin(threadToJoin->sibling); |
|
130 |
{ |
|
131 |
threadToJoin = threadToJoin->children; |
|
132 |
} |
|
133 |
else |
|
134 |
{ |
|
135 |
if (threadToJoin->sibling != NULL) |
|
136 |
{ |
|
137 |
threadToJoin = threadToJoin->sibling; |
|
138 |
} |
|
139 |
else |
|
140 |
{ |
|
141 |
threadToJoin = threadToJoin->parent; |
|
142 |
while (threadToJoin->sibling == NULL && threadToJoin != urtThreadGetSelf()) |
|
143 |
{ |
|
144 |
threadToJoin = threadToJoin->parent; |
|
145 |
} |
|
146 |
if (threadToJoin != urtThreadGetSelf()) |
|
147 |
{ |
|
148 |
threadToJoin = threadToJoin->sibling; |
|
149 |
} |
|
150 |
} |
|
151 |
} |
|
111 | 152 |
} |
112 | 153 |
|
113 | 154 |
urtThreadExit(); |
... | ... | |
161 | 202 |
urt_osMutex_t* mutexTemp = urtCoreGetMutex(); |
162 | 203 |
urtMutexLock(mutexTemp); |
163 | 204 |
node->next = urtCoreGetNodes(); |
164 |
urtCoreSetNodes(node);
|
|
205 |
urtCoreAddNode(node);
|
|
165 | 206 |
urtMutexUnlock(mutexTemp); |
166 | 207 |
return; |
167 | 208 |
} |
Also available in: Unified diff