Revision 408a606c
inc/urt_core.h | ||
---|---|---|
40 | 40 |
/* DATA STRUCTURES AND TYPES */ |
41 | 41 |
/******************************************************************************/ |
42 | 42 |
|
43 |
/** |
|
44 |
* @brief core |
|
45 |
*/ |
|
46 |
typedef struct urt_core |
|
47 |
{ |
|
48 |
urt_node_t* _nodes; |
|
49 |
urt_osEventSource_t* _evtSource; |
|
50 |
urt_osMutex_t _lock; |
|
51 |
urt_status_t _status; |
|
52 |
#if (URT_CFG_PUBSUB_ENABLED) |
|
53 |
urt_topic_t* _topics; |
|
54 |
#endif /* URT_CFG_PUBSUB_ENABLED */ |
|
55 |
#if (URT_CFG_RPC_ENABLED) |
|
56 |
urt_service_t* _services; |
|
57 |
#endif /* URT_CFG_RPC_ENABLED */ |
|
58 |
}urt_core_t; |
|
59 |
|
|
60 |
static urt_core_t core; |
|
61 |
|
|
62 | 43 |
/******************************************************************************/ |
63 | 44 |
/* MACROS */ |
64 | 45 |
/******************************************************************************/ |
... | ... | |
73 | 54 |
|
74 | 55 |
void urtCoreInit(void); |
75 | 56 |
urt_status_t urtCoreGetStatus(void); |
57 |
urt_osMutex_t urtCoreGetMutex(void); |
|
58 |
urt_osEventSource_t* urtCoreGetEvtSource(void); |
|
59 |
urt_node_t* urtCoreGetNodes(void); |
|
76 | 60 |
void urtCoreStartNodes(void); |
77 | 61 |
urt_status_t urtCoreSynchronizeNodes(urt_node_t* node); |
78 | 62 |
urt_status_t urtCoreStopNodes(urt_status_t reason); |
src/urt_core.c | ||
---|---|---|
33 | 33 |
/* LOCAL TYPES */ |
34 | 34 |
/******************************************************************************/ |
35 | 35 |
|
36 |
/** |
|
37 |
* @brief core |
|
38 |
*/ |
|
39 |
typedef struct urt_core |
|
40 |
{ |
|
41 |
urt_node_t* _nodes; |
|
42 |
urt_osEventSource_t* _evtSource; |
|
43 |
urt_osMutex_t _lock; |
|
44 |
urt_status_t _status; |
|
45 |
#if (URT_CFG_PUBSUB_ENABLED) |
|
46 |
urt_topic_t* _topics; |
|
47 |
#endif /* URT_CFG_PUBSUB_ENABLED */ |
|
48 |
#if (URT_CFG_RPC_ENABLED) |
|
49 |
urt_service_t* _services; |
|
50 |
#endif /* URT_CFG_RPC_ENABLED */ |
|
51 |
}urt_core_t; |
|
52 |
|
|
53 |
static urt_core_t core; |
|
54 |
|
|
36 | 55 |
/******************************************************************************/ |
37 | 56 |
/* LOCAL VARIABLES */ |
38 | 57 |
/******************************************************************************/ |
... | ... | |
74 | 93 |
} |
75 | 94 |
|
76 | 95 |
/** |
96 |
* @brief Get Core mutex. |
|
97 |
* |
|
98 |
* @return Current system mutex. |
|
99 |
*/ |
|
100 |
urt_osMutex_t urtCoreGetMutex(void) |
|
101 |
{ |
|
102 |
return core._lock; |
|
103 |
} |
|
104 |
|
|
105 |
/** |
|
106 |
* @brief Get Core event source. |
|
107 |
* |
|
108 |
* @return Current system event source. |
|
109 |
*/ |
|
110 |
urt_osEventSource_t* urtCoreGetEvtSource(void) |
|
111 |
{ |
|
112 |
return core._evtSource; |
|
113 |
} |
|
114 |
|
|
115 |
urt_node_t* urtCoreGetNodes(void) |
|
116 |
{ |
|
117 |
return core._nodes; |
|
118 |
} |
|
119 |
|
|
120 |
/** |
|
77 | 121 |
* @brief Start threads of all nodes of the Core. |
78 | 122 |
*/ |
79 | 123 |
void urtCoreStartNodes(void) |
src/urt_node.c | ||
---|---|---|
52 | 52 |
{ |
53 | 53 |
urt_osEventMask_t mask; |
54 | 54 |
urt_osEventFlags_t flag; //TODO: flag from core here |
55 |
urtEventRegister(core._evtSource, &localNode.listener, mask, flag);
|
|
55 |
urtEventRegister(urtCoreGetEvtSource(), &localNode.listener, mask, flag);
|
|
56 | 56 |
if (localNode.setupcallback != NULL) |
57 | 57 |
{ |
58 | 58 |
mask = localNode.setupcallback(&localNode, arg); |
... | ... | |
66 | 66 |
mask = 0xFFFFFFFF; |
67 | 67 |
} |
68 | 68 |
|
69 |
if (core._status == URT_STATUS_OK)
|
|
69 |
if (urtCoreGetStatus() == URT_STATUS_OK)
|
|
70 | 70 |
{ |
71 | 71 |
urtCoreSynchronizeNodes(&localNode); |
72 | 72 |
} |
... | ... | |
92 | 92 |
{ |
93 | 93 |
localNode.shutdowncallback(&localNode, urtCoreGetStatus(), arg); |
94 | 94 |
} |
95 |
urtEventUnregister(core._evtSource, &localNode.listener);
|
|
95 |
urtEventUnregister(urtCoreGetEvtSource(), &localNode.listener);
|
|
96 | 96 |
urt_osThread_t* threadToTerminate = localNode.thread; |
97 | 97 |
urt_osThread_t* threadToTerminateChild; |
98 | 98 |
while (threadToTerminate != NULL) |
... | ... | |
150 | 150 |
#if (URT_CFG_PUBSUB_PROFILING || URT_CFG_RPC_PROFILING) |
151 | 151 |
node->loops = 0; |
152 | 152 |
#endif /* URT_CFG_PUBSUB_PROFILING || URT_CFG_RPC_PROFILING */ |
153 |
urtMutexLock(&core._lock); |
|
154 |
node->next = core._nodes; |
|
155 |
core._nodes = node; |
|
156 |
urtMutexUnlock(&core._lock); |
|
153 |
urt_osMutex_t mutexTemp = urtCoreGetMutex(); |
|
154 |
urtMutexLock(&mutexTemp); |
|
155 |
node->next = urtCoreGetNodes(); |
|
156 |
urt_node_t* nodeCore = urtCoreGetNodes(); |
|
157 |
nodeCore = node; |
|
158 |
urtMutexUnlock(&mutexTemp); |
|
157 | 159 |
localNode = *node; |
158 | 160 |
return; |
159 | 161 |
} |
Also available in: Unified diff