Revision 4ea18a07 src/urt_node.c
src/urt_node.c | ||
---|---|---|
37 | 37 |
/* LOCAL VARIABLES */ |
38 | 38 |
/******************************************************************************/ |
39 | 39 |
|
40 |
urt_node_t localNode; |
|
41 |
static URT_THREAD_MEMORY(_node_thread, AMIROOS_CFG_SHELL_STACKSIZE); //TODO: not here |
|
42 |
|
|
43 | 40 |
/******************************************************************************/ |
44 | 41 |
/* LOCAL FUNCTIONS */ |
45 | 42 |
/******************************************************************************/ |
... | ... | |
51 | 48 |
*/ |
52 | 49 |
void _main(void* arg) |
53 | 50 |
{ |
51 |
urt_node_t* localNode = (urt_node_t*)arg; |
|
54 | 52 |
urt_osEventMask_t mask; |
55 | 53 |
urt_osEventFlags_t flag = 0; |
56 |
urtEventRegister(urtCoreGetEvtSource(), &localNode.listener, mask, flag);
|
|
57 |
if (localNode.setupcallback != NULL)
|
|
54 |
urtEventRegister(urtCoreGetEvtSource(), &(localNode->listener), mask, flag);
|
|
55 |
if (localNode->setupcallback != NULL)
|
|
58 | 56 |
{ |
59 |
mask = localNode.setupcallback(&localNode, arg);
|
|
57 |
mask = localNode->setupcallback(localNode, localNode->setupparams);
|
|
60 | 58 |
if (mask == urtCoreGetEventMask()) |
61 | 59 |
{ |
62 | 60 |
urtCoreStopNodes(URT_STATUS_NODE_INVALEVTMASK); |
... | ... | |
64 | 62 |
} |
65 | 63 |
else |
66 | 64 |
{ |
67 |
mask = ALL_EVENTS;
|
|
65 |
mask = URT_EVENTMASK_ALL;
|
|
68 | 66 |
} |
69 | 67 |
|
70 | 68 |
if (urtCoreGetStatus() == URT_STATUS_OK) |
... | ... | |
77 | 75 |
urt_osEventMask_t temp = urtEventWait(mask, URT_EVENT_WAIT_ONE, URT_DELAY_INFINITE); |
78 | 76 |
if (temp == urtCoreGetEventMask()) |
79 | 77 |
{ |
80 |
localNode.loopcallback(&localNode, mask, arg);
|
|
78 |
localNode->loopcallback(localNode, mask, localNode->loopparams);
|
|
81 | 79 |
#if (URT_CFG_PUBSUB_PROFILING || URT_CFG_RPC_PROFILING) |
82 |
localNode.loops++;
|
|
80 |
localNode->loops++;
|
|
83 | 81 |
#endif /* URT_CFG_PUBSUB_PROFILING || URT_CFG_RPC_PROFILING */ |
84 | 82 |
if (mask == urtCoreGetEventMask()) |
85 | 83 |
{ |
... | ... | |
88 | 86 |
} |
89 | 87 |
} |
90 | 88 |
|
91 |
if (localNode.shutdowncallback)
|
|
89 |
if (localNode->shutdowncallback)
|
|
92 | 90 |
{ |
93 |
localNode.shutdowncallback(&localNode, urtCoreGetStatus(), arg);
|
|
91 |
localNode->shutdowncallback(localNode, urtCoreGetStatus(), localNode->shutdownparams);
|
|
94 | 92 |
} |
95 |
urtEventUnregister(urtCoreGetEvtSource(), &localNode.listener);
|
|
93 |
urtEventUnregister(urtCoreGetEvtSource(), &localNode->listener);
|
|
96 | 94 |
|
97 |
urt_osThread_t* threadToTerminate = localNode.thread;
|
|
95 |
urt_osThread_t* threadToTerminate = localNode->thread;
|
|
98 | 96 |
while (threadToTerminate->children != NULL || threadToTerminate->sibling != NULL) |
99 | 97 |
{ |
100 | 98 |
if (threadToTerminate->children != NULL) |
... | ... | |
104 | 102 |
} |
105 | 103 |
urtThreadTerminate(&threadToTerminate, URT_THREAD_TERMINATE_REQUEST); |
106 | 104 |
|
107 |
urt_osThread_t* threadToJoin = localNode.thread;
|
|
105 |
urt_osThread_t* threadToJoin = localNode->thread;
|
|
108 | 106 |
while (threadToJoin->children != NULL || threadToJoin->sibling != NULL) |
109 | 107 |
{ |
110 | 108 |
if (threadToJoin->children != NULL) |
... | ... | |
140 | 138 |
* Must be NULL if no shutdown callback is specified. |
141 | 139 |
* May be NULL if the specified shutdown callback does not expect parameters. |
142 | 140 |
*/ |
143 |
void urtNodeInit(urt_node_t* node, urt_osThread_t* thread, urt_osThreadPrio_t prio, urt_nodeSetupCallback_t* setupcallback,
|
|
144 |
void* setupparams, urt_nodeLoopCallback_t* loopcallback, void* loopparams,
|
|
145 |
urt_nodeShutdownCallback_t* shutdowncallback, void* shutdownparams)
|
|
141 |
void urtNodeInit(urt_node_t* node, urt_osThread_t* thread, urt_osThreadPrio_t prio, urt_nodeSetupCallback_t setupcallback, |
|
142 |
void* setupparams, urt_nodeLoopCallback_t loopcallback, void* loopparams, |
|
143 |
urt_nodeShutdownCallback_t shutdowncallback, void* shutdownparams) |
|
146 | 144 |
{ |
147 | 145 |
urtDebugAssert(node != NULL); |
148 | 146 |
urtDebugAssert(thread == NULL); |
... | ... | |
150 | 148 |
urtDebugAssert(setupparams == NULL); |
151 | 149 |
|
152 | 150 |
node->next = NULL; |
153 |
node->thread = urtThreadInit(_node_thread, sizeof(_node_thread), prio, _main, setupparams);
|
|
151 |
node->thread = urtThreadInit(thread, sizeof(thread), prio, _main, node);
|
|
154 | 152 |
node->setupcallback = setupcallback; |
155 | 153 |
node->setupparams = setupparams; |
156 | 154 |
node->loopcallback = loopcallback; |
... | ... | |
168 | 166 |
urt_node_t* nodeCore = urtCoreGetNodes(); |
169 | 167 |
nodeCore = node; |
170 | 168 |
urtMutexUnlock(mutexTemp); |
171 |
localNode = *node; |
|
172 | 169 |
return; |
173 | 170 |
} |
Also available in: Unified diff