237 } |
237 } |
238 |
238 |
239 static pthread_cond_t svghmi_send_WakeCond = PTHREAD_COND_INITIALIZER; |
239 static pthread_cond_t svghmi_send_WakeCond = PTHREAD_COND_INITIALIZER; |
240 static pthread_mutex_t svghmi_send_WakeCondLock = PTHREAD_MUTEX_INITIALIZER; |
240 static pthread_mutex_t svghmi_send_WakeCondLock = PTHREAD_MUTEX_INITIALIZER; |
241 |
241 |
242 void SVGHMI_SuspendFromPythonThread(void) |
242 struct RT_to_nRT_signal_s { |
243 { |
243 pthread_cond_t WakeCond; |
244 pthread_mutex_lock(&svghmi_send_WakeCondLock); |
244 pthread_mutex_t WakeCondLock; |
245 pthread_cond_wait(&svghmi_send_WakeCond, &svghmi_send_WakeCondLock); |
245 }; |
246 pthread_mutex_unlock(&svghmi_send_WakeCondLock); |
246 |
247 } |
247 typedef struct RT_to_nRT_signal_s RT_to_nRT_signal_t; |
248 |
248 |
249 void SVGHMI_WakeupFromRTThread(void) |
249 #define _LogAndReturnNull(text) \ |
250 { |
250 {\ |
251 pthread_cond_signal(&svghmi_send_WakeCond); |
251 char mstr[256] = text " for ";\ |
252 } |
252 strncat(mstr, name, 255);\ |
|
253 LogMessage(LOG_CRITICAL, mstr, strlen(mstr));\ |
|
254 return NULL;\ |
|
255 } |
|
256 |
|
257 void *create_RT_to_nRT_signal(char* name){ |
|
258 RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)malloc(sizeof(RT_to_nRT_signal_t)); |
|
259 |
|
260 if(!sig) |
|
261 _LogAndReturnNull("Failed allocating memory for RT_to_nRT signal"); |
|
262 |
|
263 pthread_cond_init(&sig->WakeCond, NULL); |
|
264 pthread_mutex_init(&sig->WakeCondLock, NULL); |
|
265 |
|
266 return (void*)sig; |
|
267 } |
|
268 |
|
269 void delete_RT_to_nRT_signal(void* handle){ |
|
270 RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)handle; |
|
271 |
|
272 pthread_cond_destroy(&sig->WakeCond); |
|
273 pthread_mutex_destroy(&sig->WakeCondLock); |
|
274 |
|
275 free(sig); |
|
276 } |
|
277 |
|
278 int wait_RT_to_nRT_signal(void* handle){ |
|
279 int ret; |
|
280 RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)handle; |
|
281 pthread_mutex_lock(&sig->WakeCondLock); |
|
282 ret = pthread_cond_wait(&sig->WakeCond, &sig->WakeCondLock); |
|
283 pthread_mutex_unlock(&sig->WakeCondLock); |
|
284 return ret; |
|
285 } |
|
286 |
|
287 int unblock_RT_to_nRT_signal(void* handle){ |
|
288 RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)handle; |
|
289 return pthread_cond_signal(&sig->WakeCond); |
|
290 } |
|
291 |