targets/Linux/plc_Linux_main.c
branchsvghmi
changeset 3294 e3db472b0dfb
parent 2820 d9b5303d43dc
child 3295 0375d801fff7
equal deleted inserted replaced
3293:d2b0c768755d 3294:e3db472b0dfb
   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