260 beremiz_dll_destroy(void) |
260 beremiz_dll_destroy(void) |
261 { |
261 { |
262 DeleteCriticalSection(&Atomic64CS); |
262 DeleteCriticalSection(&Atomic64CS); |
263 } |
263 } |
264 |
264 |
|
265 struct RT_to_nRT_signal_s { |
|
266 HANDLE sem; |
|
267 }; |
|
268 |
|
269 typedef struct RT_to_nRT_signal_s RT_to_nRT_signal_t; |
|
270 |
|
271 #define _LogAndReturnNull(text) \ |
|
272 {\ |
|
273 char mstr[256] = text " for ";\ |
|
274 strncat(mstr, name, 255);\ |
|
275 LogMessage(LOG_CRITICAL, mstr, strlen(mstr));\ |
|
276 return NULL;\ |
|
277 } |
|
278 |
|
279 void *create_RT_to_nRT_signal(char* name){ |
|
280 RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)malloc(sizeof(RT_to_nRT_signal_t)); |
|
281 |
|
282 if(!sig) |
|
283 _LogAndReturnNull("Failed allocating memory for RT_to_nRT signal"); |
|
284 |
|
285 sig->sem = CreateSemaphore( |
|
286 NULL, // default security attributes |
|
287 1, // initial count |
|
288 1, // maximum count |
|
289 NULL); // unnamed semaphore |
|
290 |
|
291 if(sig->sem == NULL) |
|
292 { |
|
293 char mstr[256]; |
|
294 snprintf(mstr, 255, "startPLC CreateSemaphore %s error: %d\n", name, GetLastError()); |
|
295 LogMessage(LOG_CRITICAL, mstr, strlen(mstr)); |
|
296 return NULL; |
|
297 } |
|
298 |
|
299 return (void*)sig; |
|
300 } |
|
301 |
|
302 void delete_RT_to_nRT_signal(void* handle){ |
|
303 RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)handle; |
|
304 |
|
305 CloseHandle(python_sem); |
|
306 |
|
307 free(sig); |
|
308 } |
|
309 |
|
310 int wait_RT_to_nRT_signal(void* handle){ |
|
311 int ret; |
|
312 RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)handle; |
|
313 return WaitForSingleObject(sig->sem, INFINITE); |
|
314 } |
|
315 |
|
316 int unblock_RT_to_nRT_signal(void* handle){ |
|
317 RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)handle; |
|
318 return ReleaseSemaphore(sig->sem, 1, NULL); |
|
319 } |
|
320 |
|
321 void nRT_reschedule(void){ |
|
322 SwitchToThread(); |
|
323 } |
|
324 |