From 95b15971584cbfdad533411bcb8d8cec82e996fa Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Tue, 23 Jul 2013 02:12:52 +0200 Subject: [PATCH] removed POSIX, now having dedicated Linux and MAC OS-X ports --- gfxconf.example.h | 3 +- include/gfx_rules.h | 4 +- include/gos/gos.h | 6 +- include/gos/linux.h | 2 +- include/gos/options.h | 13 +++- include/gos/posix.h | 96 ------------------------ src/gos/gos.mk | 4 +- src/gos/linux.c | 6 +- src/gos/posix.c | 169 ------------------------------------------ 9 files changed, 25 insertions(+), 278 deletions(-) delete mode 100644 include/gos/posix.h delete mode 100644 src/gos/posix.c diff --git a/gfxconf.example.h b/gfxconf.example.h index daa766df..e20f324f 100644 --- a/gfxconf.example.h +++ b/gfxconf.example.h @@ -17,7 +17,8 @@ /* The operating system to use - one of these must be defined */ #define GFX_USE_OS_CHIBIOS FALSE #define GFX_USE_OS_WIN32 FALSE -#define GFX_USE_OS_POSIX FALSE +#define GFX_USE_OS_LINUX FALSE +#define GFX_USE_OS_OSX FALSE /* GFX subsystems to turn on */ #define GFX_USE_GDISP FALSE diff --git a/include/gfx_rules.h b/include/gfx_rules.h index c0f1e6d6..32a6ca87 100644 --- a/include/gfx_rules.h +++ b/include/gfx_rules.h @@ -26,14 +26,14 @@ #define GFX_DISPLAY_RULE_WARNINGS FALSE #endif -#if !GFX_USE_OS_CHIBIOS && !GFX_USE_OS_WIN32 && !GFX_USE_OS_POSIX +#if !GFX_USE_OS_CHIBIOS && !GFX_USE_OS_WIN32 && !GFX_USE_OS_LINUX && !GFX_USE_OS_OSX #if GFX_DISPLAY_RULE_WARNINGS #warning "GOS: No Operating System has been defined. ChibiOS (GFX_USE_OS_CHIBIOS) has been turned on for you." #endif #undef GFX_USE_OS_CHIBIOS #define GFX_USE_OS_CHIBIOS TRUE #endif -#if GFX_USE_OS_CHIBIOS + GFX_USE_OS_WIN32 + GFX_USE_OS_POSIX != 1 * TRUE +#if GFX_USE_OS_CHIBIOS + GFX_USE_OS_WIN32 + GFX_USE_OS_LINUX + GFX_USE_OS_OSX != 1 * TRUE #error "GOS: More than one operation system has been defined as TRUE." #endif diff --git a/include/gos/gos.h b/include/gos/gos.h index 32e0b654..cf143ded 100644 --- a/include/gos/gos.h +++ b/include/gos/gos.h @@ -431,8 +431,10 @@ #include "gos/chibios.h" #elif GFX_USE_OS_WIN32 #include "gos/win32.h" -#elif GFX_USE_OS_POSIX - #include "gos/posix.h" +#elif GFX_USE_OS_LINUX + #include "gos/linux.h" +#elif GFX_USE_OS_OSX + #include "gos/osx.h" #else #error "Your operating system is not supported yet" #endif diff --git a/include/gos/linux.h b/include/gos/linux.h index 6653c81c..8be737b3 100644 --- a/include/gos/linux.h +++ b/include/gos/linux.h @@ -7,7 +7,7 @@ /** * @file include/gos/linux.h - * @brief GOS - Operating System Support header file for POSIX. + * @brief GOS - Operating System Support header file for LINUX. */ #ifndef _GOS_LINUX_H diff --git a/include/gos/options.h b/include/gos/options.h index ac48e144..f1762134 100644 --- a/include/gos/options.h +++ b/include/gos/options.h @@ -35,11 +35,18 @@ #define GFX_USE_OS_WIN32 FALSE #endif /** - * @brief Use a unix variant with posix threads + * @brief Use a linux based system running X11 * @details Defaults to FALSE */ - #ifndef GFX_USE_OS_POSIX - #define GFX_USE_OS_POSIX FALSE + #ifndef GFX_USE_OS_LINUX + #define GFX_USE_OS_LINUX FALSE + #endif + /** + * @brief Use a Mac OS-X based system + * @details Defaults to FALSE + */ + #ifndef GFX_USE_OS_OSX + #define GFX_USE_OS_OSX FALSE #endif /** * @} diff --git a/include/gos/posix.h b/include/gos/posix.h deleted file mode 100644 index 2f344169..00000000 --- a/include/gos/posix.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * This file is subject to the terms of the GFX License. If a copy of - * the license was not distributed with this file, you can obtain one at: - * - * http://ugfx.org/license.html - */ - -/** - * @file include/gos/posix.h - * @brief GOS - Operating System Support header file for POSIX. - */ - -#ifndef _GOS_POSIX_H -#define _GOS_POSIX_H - -#if GFX_USE_OS_POSIX - -#include -#include -#include - -/* Already defined int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, size_t */ - -typedef int8_t bool_t; -typedef unsigned long systemticks_t; -typedef void * threadreturn_t; -typedef unsigned long delaytime_t; -typedef pthread_t gfxThreadHandle; -typedef int threadpriority_t; -typedef uint32_t semcount_t; -typedef pthread_mutex_t gfxMutex; - -#define DECLARE_THREAD_FUNCTION(fnName, param) threadreturn_t fnName(void *param) -#define DECLARE_THREAD_STACK(name, sz) uint8_t name[0]; - -#define gfxExit() exit(0) -#define gfxAlloc(sz) malloc(sz) -#define gfxRealloc(p,osz,nsz) realloc(p, nsz) -#define gfxFree(ptr) free(ptr) -#define gfxMillisecondsToTicks(ms) (ms) -#define gfxYield() pthread_yield() -#define gfxThreadMe() pthread_self() -#define gfxThreadClose(th) {} -#define gfxMutexInit(pmtx) pthread_mutex_init(pmtx, 0) -#define gfxMutexDestroy(pmtx) pthread_mutex_destroy(pmtx) -#define gfxMutexEnter(pmtx) pthread_mutex_lock(pmtx) -#define gfxMutexExit(pmtx) pthread_mutex_unlock(pmtx) -#define gfxSemSignalI(psem) gfxSemSignal(psem) -#define gfxSemCounterI(pSem) ((pSem)->cnt) - - -#define FALSE 0 -#define TRUE 1 -#define TIME_IMMEDIATE 0 -#define TIME_INFINITE ((delaytime_t)-1) -#define MAX_SEMAPHORE_COUNT ((semcount_t)-1) -#define LOW_PRIORITY 10 -#define NORMAL_PRIORITY 0 -#define HIGH_PRIORITY -10 - -typedef struct gfxSem { - pthread_mutex_t mtx; - pthread_cond_t cond; - semcount_t cnt; - semcount_t max; - } gfxSem; - -/*===========================================================================*/ -/* Function declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - -void gfxHalt(const char *msg); -void gfxSleepMilliseconds(delaytime_t ms); -void gfxSleepMicroseconds(delaytime_t ms); -systemticks_t gfxSystemTicks(void); -void gfxSystemLock(void); -void gfxSystemUnlock(void); -void gfxSemInit(gfxSem *psem, semcount_t val, semcount_t limit); -void gfxSemDestroy(gfxSem *psem); -bool_t gfxSemWait(gfxSem *psem, delaytime_t ms); -void gfxSemSignal(gfxSem *psem); -semcount_t gfxSemCounter(gfxSem *pSem); -gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void *param); -threadreturn_t gfxThreadWait(gfxThreadHandle thread); - -#ifdef __cplusplus -} -#endif - -#endif /* GFX_USE_OS_POSIX */ - -#endif /* _GOS_POSIX_H */ diff --git a/src/gos/gos.mk b/src/gos/gos.mk index d963eea8..14193883 100644 --- a/src/gos/gos.mk +++ b/src/gos/gos.mk @@ -1,3 +1,5 @@ GFXSRC += $(GFXLIB)/src/gos/chibios.c \ $(GFXLIB)/src/gos/win32.c \ - $(GFXLIB)/src/gos/posix.c + $(GFXLIB)/src/gos/linux.c \ + $(GFXLIB)/src/gos/osx.c \ + diff --git a/src/gos/linux.c b/src/gos/linux.c index ef0fea97..54cadd6a 100644 --- a/src/gos/linux.c +++ b/src/gos/linux.c @@ -6,12 +6,12 @@ */ /** - * @file src/gos/osx.c + * @file src/gos/linux.c * @brief GOS ChibiOS Operating System support. */ #include "gfx.h" -#if GFX_USE_OS_OSX +#if GFX_USE_OS_LINUX #include #include @@ -165,6 +165,6 @@ semcount_t gfxSemCounter(gfxSem *pSem) { return res; } -#endif /* GFX_USE_OS_OSX */ +#endif /* GFX_USE_OS_LINUX */ /** @} */ diff --git a/src/gos/posix.c b/src/gos/posix.c deleted file mode 100644 index 2e930a6c..00000000 --- a/src/gos/posix.c +++ /dev/null @@ -1,169 +0,0 @@ -/* - * This file is subject to the terms of the GFX License. If a copy of - * the license was not distributed with this file, you can obtain one at: - * - * http://ugfx.org/license.html - */ - -/** - * @file src/gos/posix.c - * @brief GOS ChibiOS Operating System support. - */ -#include "gfx.h" - -#if GFX_USE_OS_POSIX - -#include -#include -#include -#include - -static gfxMutex SystemMutex; - -void _gosInit(void) { - gfxMutexInit(&SystemMutex); -} - -void gfxSystemLock(void) { - gfxMutexEnter(&SystemMutex); -} - -void gfxSystemUnlock(void) { - gfxMutexExit(&SystemMutex); -} - -void gfxHalt(const char *msg) { - if (msg) - fprintf(stderr, "%s\n", msg); - exit(1); -} - -void gfxSleepMilliseconds(delaytime_t ms) { - struct timespec ts; - - switch(ms) { - case TIME_IMMEDIATE: pthread_yield(); return; - case TIME_INFINITE: while(1) sleep(60); return; - default: - ts.tv_sec = ms / 1000; - ts.tv_nsec = (ms % 1000) * 1000; - nanosleep(&ts, 0); - return; - } -} - -void gfxSleepMicroseconds(delaytime_t ms) { - struct timespec ts; - - switch(ms) { - case TIME_IMMEDIATE: pthread_yield(); return; - case TIME_INFINITE: while(1) sleep(60); return; - default: - ts.tv_sec = ms / 1000000; - ts.tv_nsec = ms % 1000000; - nanosleep(&ts, 0); - return; - } -} - -systemticks_t gfxSystemTicks(void) { - struct timespec ts; - - clock_gettime(CLOCK_MONOTONIC, &ts); - return ts.tv_sec * 1000UL + ts.tv_nsec / 1000UL; -} - -gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void *param) { - gfxThreadHandle th; - - // Implementing priority with pthreads is a rats nest that is also pthreads implementation dependent. - // Only some pthreads schedulers support it, some implementations use the operating system process priority mechanisms. - // Even those that do support it can have different ranges of priority and "normal" priority is an undefined concept. - // Across different UNIX style operating systems things can be very different (let alone OS's such as Windows). - // Even just Linux changes the way priority works with different kernel schedulers and across kernel versions. - // For these reasons we ignore the priority. - - if (pthread_create(&th, 0, fn, param)) - return 0; - return th; -} - -threadreturn_t gfxThreadWait(gfxThreadHandle thread) { - threadreturn_t retval; - - if (pthread_join(thread, &retval)) - return 0; - return retval; -} - -void gfxSemInit(gfxSem *pSem, semcount_t val, semcount_t limit) { - pthread_mutex_init(&pSem->mtx, 0); - pthread_cond_init(&pSem->cond, 0); - pthread_mutex_lock(&pSem->mtx); - pSem->cnt = val; - pSem->max = limit; - pthread_mutex_unlock(&pSem->mtx); -} - -void gfxSemDestroy(gfxSem *pSem) { - pthread_mutex_destroy(&pSem->mtx); - pthread_cond_destroy(&pSem->cond); -} - -bool_t gfxSemWait(gfxSem *pSem, delaytime_t ms) { - pthread_mutex_lock(&pSem->mtx); - switch (ms) { - case TIME_INFINITE: - while (!pSem->cnt) - pthread_cond_wait(&pSem->cond, &pSem->mtx); - break; - case TIME_IMMEDIATE: - if (!pSem->cnt) { - pthread_mutex_unlock(&pSem->mtx); - return FALSE; - } - break; - default: - { - struct timeval now; - struct timespec tm; - - gettimeofday(&now); - tm.tv_sec = now.tv_sec + ms / 1000; - tm.tv_nsec = (now.tv_usec + ms % 1000) * 1000; - while (!pSem->cnt) { - if (pthread_cond_timedwait(&pSem->cond, &pSem->mtx, &tm) == ETIMEDOUT) { - pthread_mutex_unlock(&pSem->mtx); - return FALSE; - } - } - } - break; - } - pSem->cnt--; - pthread_mutex_unlock(&pSem->mtx); - return TRUE; -} - -void gfxSemSignal(gfxSem *pSem) { - pthread_mutex_lock(&pSem->mtx); - if (pSem->cnt < pSem->max) { - pSem->cnt++; - pthread_cond_signal(&pSem->cond); - } - pthread_mutex_unlock(&pSem->mtx); -} - -semcount_t gfxSemCounter(gfxSem *pSem) { - semcount_t res; - - // The locking is really only required if obtaining the count is a divisible operation - // which it might be on a 8/16 bit processor with a 32 bit semaphore count. - pthread_mutex_lock(&pSem->mtx); - res = pSem->cnt; - pthread_mutex_unlock(&pSem->mtx); - return res; -} - -#endif /* GFX_USE_OS_POSIX */ -/** @} */