targets/Linux/plc_Linux_main.c
changeset 3725 0043e2b9dbec
parent 3334 d7e0ddb5974b
child 3726 516779f11803
equal deleted inserted replaced
3709:7fbcc7b741b7 3725:0043e2b9dbec
     5 #include <stdio.h>
     5 #include <stdio.h>
     6 #include <string.h>
     6 #include <string.h>
     7 #include <time.h>
     7 #include <time.h>
     8 #include <signal.h>
     8 #include <signal.h>
     9 #include <stdlib.h>
     9 #include <stdlib.h>
       
    10 #include <errno.h>
    10 #include <pthread.h>
    11 #include <pthread.h>
    11 #include <locale.h>
    12 #include <locale.h>
    12 #include <semaphore.h>
    13 #include <semaphore.h>
    13 
    14 
    14 static sem_t Run_PLC;
    15 static sem_t Run_PLC;
   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;