235 { |
236 { |
236 pthread_mutex_lock(&python_mutex); |
237 pthread_mutex_lock(&python_mutex); |
237 } |
238 } |
238 |
239 |
239 struct RT_to_nRT_signal_s { |
240 struct RT_to_nRT_signal_s { |
|
241 int used; |
240 pthread_cond_t WakeCond; |
242 pthread_cond_t WakeCond; |
241 pthread_mutex_t WakeCondLock; |
243 pthread_mutex_t WakeCondLock; |
242 }; |
244 }; |
243 |
245 |
244 typedef struct RT_to_nRT_signal_s RT_to_nRT_signal_t; |
246 typedef struct RT_to_nRT_signal_s RT_to_nRT_signal_t; |
255 RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)malloc(sizeof(RT_to_nRT_signal_t)); |
257 RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)malloc(sizeof(RT_to_nRT_signal_t)); |
256 |
258 |
257 if(!sig) |
259 if(!sig) |
258 _LogAndReturnNull("Failed allocating memory for RT_to_nRT signal"); |
260 _LogAndReturnNull("Failed allocating memory for RT_to_nRT signal"); |
259 |
261 |
|
262 sig->used = 1; |
260 pthread_cond_init(&sig->WakeCond, NULL); |
263 pthread_cond_init(&sig->WakeCond, NULL); |
261 pthread_mutex_init(&sig->WakeCondLock, NULL); |
264 pthread_mutex_init(&sig->WakeCondLock, NULL); |
262 |
265 |
263 return (void*)sig; |
266 return (void*)sig; |
264 } |
267 } |
265 |
268 |
266 void delete_RT_to_nRT_signal(void* handle){ |
269 void delete_RT_to_nRT_signal(void* handle){ |
267 RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)handle; |
270 RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)handle; |
268 |
271 |
269 pthread_cond_destroy(&sig->WakeCond); |
272 pthread_mutex_lock(&sig->WakeCondLock); |
270 pthread_mutex_destroy(&sig->WakeCondLock); |
273 sig->used = 0; |
271 |
274 pthread_cond_signal(&sig->WakeCond); |
272 free(sig); |
275 pthread_mutex_unlock(&sig->WakeCondLock); |
273 } |
276 } |
274 |
277 |
275 int wait_RT_to_nRT_signal(void* handle){ |
278 int wait_RT_to_nRT_signal(void* handle){ |
276 int ret; |
279 int ret; |
277 RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)handle; |
280 RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)handle; |
278 pthread_mutex_lock(&sig->WakeCondLock); |
281 pthread_mutex_lock(&sig->WakeCondLock); |
279 ret = pthread_cond_wait(&sig->WakeCond, &sig->WakeCondLock); |
282 ret = pthread_cond_wait(&sig->WakeCond, &sig->WakeCondLock); |
|
283 if(!sig->used) ret = -EINVAL; |
280 pthread_mutex_unlock(&sig->WakeCondLock); |
284 pthread_mutex_unlock(&sig->WakeCondLock); |
|
285 |
|
286 if(!sig->used){ |
|
287 pthread_cond_destroy(&sig->WakeCond); |
|
288 pthread_mutex_destroy(&sig->WakeCondLock); |
|
289 free(sig); |
|
290 } |
281 return ret; |
291 return ret; |
282 } |
292 } |
283 |
293 |
284 int unblock_RT_to_nRT_signal(void* handle){ |
294 int unblock_RT_to_nRT_signal(void* handle){ |
285 RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)handle; |
295 RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)handle; |