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