targets/OSX/plc_OSX_main.c
author GP Orcullo <kinsamanka@gmail.com>
Wed, 09 Nov 2022 17:29:59 +0800
branchpython3
changeset 3778 296e459efdfb
child 3781 25195da82745
permissions -rw-r--r--
Preliminary OSX support
3778
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
     1
/**
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
     2
 * Mac OSX specific code
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
     3
 **/
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
     4
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
     5
#include <stdio.h>
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
     6
#include <string.h>
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
     7
#include <time.h>
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
     8
#include <signal.h>
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
     9
#include <stdlib.h>
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    10
#include <pthread.h>
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    11
#include <locale.h>
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    12
#include <semaphore.h>
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    13
#include <dispatch/dispatch.h>
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    14
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    15
static sem_t Run_PLC;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    16
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    17
long AtomicCompareExchange(long *atomicvar, long compared, long exchange)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    18
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    19
    return __sync_val_compare_and_swap(atomicvar, compared, exchange);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    20
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    21
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    22
long long AtomicCompareExchange64(long long *atomicvar, long long compared,
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    23
                                  long long exchange)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    24
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    25
    return __sync_val_compare_and_swap(atomicvar, compared, exchange);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    26
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    27
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    28
void PLC_GetTime(IEC_TIME * CURRENT_TIME)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    29
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    30
    struct timespec tmp;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    31
    clock_gettime(CLOCK_REALTIME, &tmp);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    32
    CURRENT_TIME->tv_sec = tmp.tv_sec;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    33
    CURRENT_TIME->tv_nsec = tmp.tv_nsec;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    34
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    35
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    36
dispatch_queue_t queue;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    37
dispatch_source_t PLC_timer;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    38
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    39
static inline void PLC_timer_cancel(void *arg)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    40
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    41
    dispatch_release(PLC_timer);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    42
    dispatch_release(queue);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    43
    exit(0);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    44
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    45
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    46
static inline void PLC_timer_notify(void *arg)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    47
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    48
    PLC_GetTime(&__CURRENT_TIME);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    49
    sem_post(&Run_PLC);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    50
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    51
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    52
void PLC_SetTimer(unsigned long long next, unsigned long long period)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    53
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    54
    if (next == period && next == 0) {
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    55
        dispatch_suspend(PLC_timer);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    56
    } else {
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    57
        dispatch_time_t start;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    58
        start = dispatch_time(DISPATCH_TIME_NOW, next);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    59
        dispatch_source_set_timer(PLC_timer, start, period, 0);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    60
        dispatch_resume(PLC_timer);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    61
    }
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    62
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    63
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    64
void catch_signal(int sig)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    65
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    66
    signal(SIGINT, catch_signal);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    67
    printf("Got Signal %d\n", sig);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    68
    dispatch_source_cancel(PLC_timer);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    69
    exit(0);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    70
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    71
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    72
static unsigned long __debug_tick;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    73
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    74
pthread_t PLC_thread;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    75
static pthread_mutex_t python_wait_mutex = PTHREAD_MUTEX_INITIALIZER;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    76
static pthread_mutex_t python_mutex = PTHREAD_MUTEX_INITIALIZER;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    77
static pthread_mutex_t debug_wait_mutex = PTHREAD_MUTEX_INITIALIZER;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    78
static pthread_mutex_t debug_mutex = PTHREAD_MUTEX_INITIALIZER;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    79
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    80
int PLC_shutdown = 0;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    81
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    82
int ForceSaveRetainReq(void)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    83
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    84
    return PLC_shutdown;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    85
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    86
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    87
void PLC_thread_proc(void *arg)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    88
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    89
    while (!PLC_shutdown) {
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    90
        sem_wait(&Run_PLC);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    91
        __run();
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    92
    }
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    93
    pthread_exit(0);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    94
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    95
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    96
#define maxval(a,b) ((a>b)?a:b)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    97
int startPLC(int argc, char **argv)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    98
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
    99
    setlocale(LC_NUMERIC, "C");
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   100
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   101
    PLC_shutdown = 0;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   102
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   103
    sem_init(&Run_PLC, 0, 0);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   104
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   105
    pthread_create(&PLC_thread, NULL, (void *)&PLC_thread_proc, NULL);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   106
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   107
    pthread_mutex_init(&debug_wait_mutex, NULL);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   108
    pthread_mutex_init(&debug_mutex, NULL);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   109
    pthread_mutex_init(&python_wait_mutex, NULL);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   110
    pthread_mutex_init(&python_mutex, NULL);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   111
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   112
    pthread_mutex_lock(&debug_wait_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   113
    pthread_mutex_lock(&python_wait_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   114
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   115
    queue = dispatch_queue_create("timerQueue", 0);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   116
    PLC_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   117
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   118
    dispatch_set_context(PLC_timer, &PLC_timer);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   119
    dispatch_source_set_event_handler_f(PLC_timer, PLC_timer_notify);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   120
    dispatch_source_set_cancel_handler_f(PLC_timer, PLC_timer_cancel);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   121
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   122
    if (__init(argc, argv) == 0) {
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   123
        PLC_SetTimer(common_ticktime__, common_ticktime__);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   124
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   125
        /* install signal handler for manual break */
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   126
        signal(SIGINT, catch_signal);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   127
    } else {
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   128
        return 1;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   129
    }
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   130
    return 0;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   131
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   132
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   133
int TryEnterDebugSection(void)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   134
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   135
    if (pthread_mutex_trylock(&debug_mutex) == 0) {
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   136
        /* Only enter if debug active */
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   137
        if (__DEBUG) {
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   138
            return 1;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   139
        }
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   140
        pthread_mutex_unlock(&debug_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   141
    }
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   142
    return 0;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   143
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   144
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   145
void LeaveDebugSection(void)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   146
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   147
    pthread_mutex_unlock(&debug_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   148
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   149
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   150
int stopPLC()
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   151
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   152
    /* Stop the PLC */
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   153
    PLC_shutdown = 1;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   154
    sem_post(&Run_PLC);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   155
    PLC_SetTimer(0, 0);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   156
    pthread_join(PLC_thread, NULL);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   157
    sem_destroy(&Run_PLC);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   158
    dispatch_source_cancel(PLC_timer);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   159
    __cleanup();
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   160
    pthread_mutex_destroy(&debug_wait_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   161
    pthread_mutex_destroy(&debug_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   162
    pthread_mutex_destroy(&python_wait_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   163
    pthread_mutex_destroy(&python_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   164
    return 0;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   165
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   166
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   167
extern unsigned long __tick;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   168
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   169
int WaitDebugData(unsigned long *tick)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   170
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   171
    int res;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   172
    if (PLC_shutdown)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   173
        return 1;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   174
    /* Wait signal from PLC thread */
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   175
    res = pthread_mutex_lock(&debug_wait_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   176
    *tick = __debug_tick;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   177
    return res;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   178
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   179
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   180
/* Called by PLC thread when debug_publish finished
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   181
 * This is supposed to unlock debugger thread in WaitDebugData*/
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   182
void InitiateDebugTransfer()
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   183
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   184
    /* remember tick */
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   185
    __debug_tick = __tick;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   186
    /* signal debugger thread it can read data */
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   187
    pthread_mutex_unlock(&debug_wait_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   188
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   189
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   190
int suspendDebug(int disable)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   191
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   192
    /* Prevent PLC to enter debug code */
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   193
    pthread_mutex_lock(&debug_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   194
    /*__DEBUG is protected by this mutex */
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   195
    __DEBUG = !disable;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   196
    if (disable)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   197
        pthread_mutex_unlock(&debug_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   198
    return 0;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   199
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   200
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   201
void resumeDebug(void)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   202
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   203
    __DEBUG = 1;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   204
    /* Let PLC enter debug code */
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   205
    pthread_mutex_unlock(&debug_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   206
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   207
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   208
/* from plc_python.c */
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   209
int WaitPythonCommands(void)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   210
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   211
    /* Wait signal from PLC thread */
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   212
    return pthread_mutex_lock(&python_wait_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   213
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   214
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   215
/* Called by PLC thread on each new python command*/
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   216
void UnBlockPythonCommands(void)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   217
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   218
    /* signal python thread it can read data */
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   219
    pthread_mutex_unlock(&python_wait_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   220
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   221
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   222
int TryLockPython(void)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   223
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   224
    return pthread_mutex_trylock(&python_mutex) == 0;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   225
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   226
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   227
void UnLockPython(void)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   228
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   229
    pthread_mutex_unlock(&python_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   230
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   231
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   232
void LockPython(void)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   233
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   234
    pthread_mutex_lock(&python_mutex);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   235
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   236
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   237
struct RT_to_nRT_signal_s {
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   238
    pthread_cond_t WakeCond;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   239
    pthread_mutex_t WakeCondLock;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   240
};
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   241
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   242
typedef struct RT_to_nRT_signal_s RT_to_nRT_signal_t;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   243
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   244
#define _LogAndReturnNull(text) \
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   245
    {\
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   246
    	char mstr[256] = text " for ";\
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   247
        strncat(mstr, name, 255);\
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   248
        LogMessage(LOG_CRITICAL, mstr, strlen(mstr));\
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   249
        return NULL;\
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   250
    }
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   251
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   252
void *create_RT_to_nRT_signal(char *name)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   253
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   254
    RT_to_nRT_signal_t *sig =
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   255
        (RT_to_nRT_signal_t *) malloc(sizeof(RT_to_nRT_signal_t));
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   256
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   257
    if (!sig)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   258
        _LogAndReturnNull("Failed allocating memory for RT_to_nRT signal");
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   259
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   260
    pthread_cond_init(&sig->WakeCond, NULL);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   261
    pthread_mutex_init(&sig->WakeCondLock, NULL);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   262
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   263
    return (void *)sig;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   264
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   265
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   266
void delete_RT_to_nRT_signal(void *handle)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   267
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   268
    RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t *) handle;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   269
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   270
    pthread_cond_destroy(&sig->WakeCond);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   271
    pthread_mutex_destroy(&sig->WakeCondLock);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   272
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   273
    free(sig);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   274
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   275
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   276
int wait_RT_to_nRT_signal(void *handle)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   277
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   278
    int ret;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   279
    RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t *) handle;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   280
    pthread_mutex_lock(&sig->WakeCondLock);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   281
    ret = pthread_cond_wait(&sig->WakeCond, &sig->WakeCondLock);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   282
    pthread_mutex_unlock(&sig->WakeCondLock);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   283
    return ret;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   284
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   285
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   286
int unblock_RT_to_nRT_signal(void *handle)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   287
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   288
    RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t *) handle;
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   289
    return pthread_cond_signal(&sig->WakeCond);
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   290
}
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   291
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   292
void nRT_reschedule(void)
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   293
{
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   294
    sched_yield();
296e459efdfb Preliminary OSX support
GP Orcullo <kinsamanka@gmail.com>
parents:
diff changeset
   295
}