#include <stdlib.h>
 
#include <stdio.h>
 
#include <errno.h>
 
#include "sysport.h"
 
 
 
/**** CLOCK *************************************************************************/
 
 
 
#if defined(USECLOCK)
 
 
 
        #include <time.h>
 
        extern myclock_t myclock
(void) {return (myclock_t
)clock();}  
        extern myclock_t ticks_per_sec (void) {return CLOCKS_PER_SEC;}
 
 
 
#elif defined(USEWINCLOCK)
 
 
 
        #define WIN32_LEAN_AND_MEAN
 
        #include <windows.h>
 
        extern myclock_t myclock(void) {return (myclock_t)GetTickCount();}
 
        extern myclock_t ticks_per_sec (void) {return 1000;}
 
 
 
 
 
#elif defined(USELINCLOCK)
 
 
 
        #include <sys/time.h>
 
        extern myclock_t myclock(void)
 
        {
 
                struct timeval tv;
 
                gettimeofday(&tv, NULL);
 
                return (myclock_t)tv.tv_sec * 1000 + (myclock_t)tv.tv_usec/1000;
 
        }
 
        extern myclock_t ticks_per_sec (void) {return 1000;}
 
 
 
#else
 
 
 
        #error No Clock specified in compilation
 
 
 
#endif
 
 
 
/**** PATH NAMES *************************************************************************/
 
 
 
#if defined(GCCLINUX)
 
        extern int isfoldersep (int x) { return x == '/';}
 
#elif defined(MVSC)
 
        extern int isfoldersep (int x) { return x == '\\' || x == ':';}
 
#else
 
        extern int isfoldersep (int x) { return x == '/' || x == '\\' || x == ':';}
 
#endif
 
 
 
/**** Maximum Files Open *****************************************************************/
 
 
 
#if defined(__MINGW32__) || defined(__MINGW64__)
 
    extern int mysys_fopen_max (void) { return FOPEN_MAX;}
 
#elif defined(GCCLINUX)
 
        #include <sys/resource.h>
 
        #if 0
 
        struct rlimit {
 
                rlim_t rlim_cur;  /* Soft limit */
 
                rlim_t rlim_max;  /* Hard limit (ceiling for rlim_cur) */
 
        };
 
        #endif
 
        extern int mysys_fopen_max (void)
 
        {
 
                int ok;
 
                struct rlimit rl;
 
                ok = 0 == getrlimit(RLIMIT_NOFILE, &rl);
 
                if (ok)
 
                        return (int)rl.rlim_cur;
 
                else
 
                        return FOPEN_MAX;
 
        }
 
#elif defined(MVSC)
 
        extern int mysys_fopen_max (void) { return FOPEN_MAX;}
 
#else
 
        extern int mysys_fopen_max (void) { return FOPEN_MAX;}
 
#endif
 
 
 
 
 
#if defined(MULTI_THREADED_INTERFACE)
 
/**** THREADS ****************************************************************************/
 
 
 
/*
 
|
 
|       POSIX
 
|
 
\*-------------------------*/
 
#if defined (POSIX_THREADS)
 
 
 
#include <pthread.h>
 
 
 
extern int /* boolean */
 
mythread_create (/*@out@*/ mythread_t *thread, routine_t start_routine, void *arg, /*@out@*/ int *ret_error)
 
{
 
        const pthread_attr_t *attr = NULL; /* default attributes */
 
        int ret;
 
        ret = pthread_create (thread, attr, start_routine, arg);
 
        *ret_error = ret;
 
        return 0 == ret;
 
}
 
 
 
extern int /* boolean */
 
mythread_join (mythread_t thread)
 
{
 
        void *p; /* value return from pthread_exit, not used */
 
        int ret = pthread_join (thread, &p);
 
        return 0 == ret;
 
}
 
 
 
extern void
 
mythread_exit (void)
 
{
 
        pthread_exit (NULL);
 
}
 
 
 
 
 
extern const char *
 
mythread_create_error (int err)
 
{
 
        const char *s;
 
        switch (err) {
 
                case 0     : s = "Success"; break;
 
                case EAGAIN: s = "EAGAIN" ; break;
 
                case EINVAL: s = "EINVAL" ; break;
 
                case EPERM : s = "EPERM"  ; break;
 
                default    : s = "Unknown error"; break;
 
        }
 
        return s;
 
}
 
 
 
extern void mythread_mutex_init         (mythread_mutex_t *m) { pthread_mutex_init   (m,NULL);}
 
extern void mythread_mutex_destroy      (mythread_mutex_t *m) { pthread_mutex_destroy(m)     ;}
 
extern void mythread_mutex_lock     (mythread_mutex_t *m) { pthread_mutex_lock   (m)     ;}
 
extern void mythread_mutex_unlock   (mythread_mutex_t *m) { pthread_mutex_unlock (m)     ;}
 
 
 
#ifdef SPINLOCKS
 
extern void mythread_spinx_init         (mythread_spinx_t *m) { pthread_spin_init   (m,0);} /**/
 
extern void mythread_spinx_destroy      (mythread_spinx_t *m) { pthread_spin_destroy(m)  ;} /**/
 
extern void mythread_spinx_lock     (mythread_spinx_t *m) { pthread_spin_lock   (m)  ;} /**/
 
extern void mythread_spinx_unlock   (mythread_spinx_t *m) { pthread_spin_unlock (m)  ;} /**/
 
#else
 
extern void mythread_spinx_init         (mythread_spinx_t *m) { pthread_mutex_init   (m,NULL);} /**/
 
extern void mythread_spinx_destroy      (mythread_spinx_t *m) { pthread_mutex_destroy(m)     ;} /**/
 
extern void mythread_spinx_lock     (mythread_spinx_t *m) { pthread_mutex_lock   (m)     ;} /**/
 
extern void mythread_spinx_unlock   (mythread_spinx_t *m) { pthread_mutex_unlock (m)     ;} /**/
 
#endif
 
 
 
/* semaphores */
 
extern int /* boolean */
 
mysem_init      (mysem_t *sem, unsigned int value)
 
        { return -1 != sem_init (sem, 0 /*not shared with processes*/, value);}
 
 
 
extern int /* boolean */
 
mysem_wait      (mysem_t *sem)
 
        { return  0 == sem_wait (sem);}
 
 
 
extern int /* boolean */
 
mysem_post      (mysem_t *sem)
 
        { return  0 == sem_post (sem);}
 
 
 
extern int /* boolean */
 
mysem_destroy   (mysem_t *sem)
 
        { return  0 == sem_destroy (sem);}
 
 
 
/*
 
|
 
|       NT_THREADS
 
|
 
\*-------------------------*/
 
#elif defined(NT_THREADS)
 
 
 
#define WIN32_LEAN_AND_MEAN
 
#include <windows.h>
 
#include <process.h>
 
 
 
extern int /* boolean */
 
mythread_create (/*@out@*/ mythread_t *thread, routine_t start_routine, void *arg, /*@out@*/ int *ret_error)
 
{
 
        static unsigned int     thread_id;
 
        mythread_t t;
 
        int /* boolean */ is_ok;
 
 
 
        t =     (mythread_t) _beginthreadex (NULL, 0, start_routine, arg, 0, &thread_id );
 
        is_ok = (t != 0);
 
        *thread = t;
 
        *ret_error = is_ok? 0: errno;
 
        return is_ok;
 
}
 
 
 
extern int /* boolean */
 
mythread_join (mythread_t thread)
 
{
 
        unsigned long int ret;
 
        ret = WaitForSingleObject (thread, INFINITE);
 
        CloseHandle(thread);
 
        return ret != WAIT_FAILED;
 
}
 
 
 
extern void
 
mythread_exit (void)
 
{
 
        return;
 
}
 
 
 
extern const char *
 
mythread_create_error (int err)
 
{
 
        const char *s;
 
        switch (err) {
 
                case 0     : s = "Success"; break;
 
                case EAGAIN: s = "EAGAIN" ; break;
 
                case EINVAL: s = "EINVAL" ; break;
 
                case EPERM : s = "EPERM"  ; break;
 
                default    : s = "Unknown error"; break;
 
        }
 
        return s;
 
}
 
 
 
extern void mythread_mutex_init         (mythread_mutex_t *m) { *m = CreateMutex(0, FALSE, 0)      ;}
 
extern void mythread_mutex_destroy      (mythread_mutex_t *m) { CloseHandle(*m)                    ;}
 
extern void mythread_mutex_lock     (mythread_mutex_t *m) { WaitForSingleObject(*m, INFINITE)  ;}
 
extern void mythread_mutex_unlock   (mythread_mutex_t *m) { ReleaseMutex(*m)                   ;}
 
 
 
extern void mythread_spinx_init         (mythread_spinx_t *m) { InitializeCriticalSection(m)  ;} /**/
 
extern void mythread_spinx_destroy      (mythread_spinx_t *m) { DeleteCriticalSection(m)  ;} /**/
 
extern void mythread_spinx_lock     (mythread_spinx_t *m) { EnterCriticalSection (m)  ;} /**/
 
extern void mythread_spinx_unlock   (mythread_spinx_t *m) { LeaveCriticalSection (m)  ;} /**/
 
 
 
/* semaphores */
 
extern int /* boolean */
 
mysem_init      (mysem_t *sem, unsigned int value)
 
{
 
        mysem_t h =
 
        CreateSemaphore(
 
                NULL,   /* cannot be inherited */
 
                value,  /* Initial Count */
 
                256,    /* Maximum Count */
 
                NULL    /* Name --> NULL, not shared among threads */
 
        );
 
 
 
        if (h != NULL)  *sem = h;
 
 
 
        return h != NULL;
 
}
 
 
 
extern int /* boolean */
 
mysem_wait      (mysem_t *sem)
 
{
 
        HANDLE h = *sem;
 
        return WAIT_FAILED != WaitForSingleObject (h, INFINITE);
 
}
 
 
 
extern int /* boolean */
 
mysem_post      (mysem_t *sem)
 
{
 
        HANDLE h = *sem;
 
        return 0 != ReleaseSemaphore(h, 1, NULL);
 
}
 
 
 
extern int /* boolean */
 
mysem_destroy   (mysem_t *sem)
 
{
 
        return 0 != CloseHandle( *sem);
 
}
 
 
 
/**** THREADS ****************************************************************************/
 
#else
 
        #error Definition of threads not present
 
#endif
 
 
 
/* MULTI_THREADED_INTERFACE */
 
#endif