Revision 37cd5dc2 src/urt_node.c

View differences:

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