targets/Win32/plc_Win32_main.c
branchsvghmi
changeset 3295 0375d801fff7
parent 2174 55611282b909
child 3296 3bcd5ec67521
equal deleted inserted replaced
3294:e3db472b0dfb 3295:0375d801fff7
   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