diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gdisp/gdisp.c | 10 | ||||
-rw-r--r-- | src/gevent/gevent.c | 2 | ||||
-rw-r--r-- | src/gfx.c | 9 | ||||
-rw-r--r-- | src/gos/chibios.c | 7 | ||||
-rw-r--r-- | src/gos/win32.c | 15 | ||||
-rw-r--r-- | src/gtimer/gtimer.c | 12 | ||||
-rw-r--r-- | src/gwin/console.c | 6 |
7 files changed, 35 insertions, 26 deletions
diff --git a/src/gdisp/gdisp.c b/src/gdisp/gdisp.c index b316be49..9ba85d82 100644 --- a/src/gdisp/gdisp.c +++ b/src/gdisp/gdisp.c @@ -39,7 +39,7 @@ static gfxMutex gdispMsgsMutex; static gfxSem gdispMsgsSem; static gdisp_lld_msg_t gdispMsgs[GDISP_QUEUE_SIZE]; - static DECLARESTACK(waGDISPThread, GDISP_THREAD_STACK_SIZE); + static DECLARE_THREAD_STACK(waGDISPThread, GDISP_THREAD_STACK_SIZE); #endif /*===========================================================================*/ @@ -47,7 +47,7 @@ /*===========================================================================*/ #if GDISP_NEED_ASYNC - static threadreturn_t GDISPThreadHandler(void *arg) { + static DECLARE_THREAD_FUNCTION(GDISPThreadHandler, arg) { (void)arg; gdisp_lld_msg_t *pmsg; @@ -111,7 +111,8 @@ } #elif GDISP_NEED_ASYNC void _gdispInit(void) { - unsigned i; + unsigned i; + gfxThreadHandle hth; /* Mark all the Messages as free */ for(i=0; i < GDISP_QUEUE_SIZE; i++) @@ -126,7 +127,8 @@ gfxMutexInit(&gdispMsgsMutex); gfxSemInit(&gdispMsgsSem, GDISP_QUEUE_SIZE, GDISP_QUEUE_SIZE); - gfxCreateThread(waGDISPThread, sizeof(waGDISPThread), NORMAL_PRIORITY, GDISPThreadHandler, NULL); + hth = gfxThreadCreate(waGDISPThread, sizeof(waGDISPThread), NORMAL_PRIORITY, GDISPThreadHandler, NULL); + if (hth) gfxThreadClose(hth); /* Initialise driver - synchronous */ gfxMutexEnter(&gdispMutex); diff --git a/src/gevent/gevent.c b/src/gevent/gevent.c index 676fc8cb..d83fa4d8 100644 --- a/src/gevent/gevent.c +++ b/src/gevent/gevent.c @@ -170,7 +170,7 @@ void geventSendEvent(GSourceListener *psl) { } else { // Wake up the listener - if (gfxSemCounter(&psl->pListener->waitqueue) < 0) + if (gfxSemCounter(&psl->pListener->waitqueue) <= 0) gfxSemSignal(&psl->pListener->waitqueue); gfxMutexExit(&geventMutex); } @@ -28,6 +28,8 @@ #include "gfx.h" +void DEPRECATED("Use gfxInit() instead") gdispInit() { gfxInit(); } + /* These init functions are defined by each module but not published */ extern void _gosInit(void); #if GFX_USE_GDISP && (GDISP_NEED_MULTITHREAD || GDISP_NEED_ASYNC) @@ -105,10 +107,3 @@ void gfxInit(void) { _gaudoutInit(); #endif } - -void gdispInit(void) { - #warning "gdispInit() is obsolete - please use gfxInit() instead" - - gfxInit(); -} - diff --git a/src/gos/chibios.c b/src/gos/chibios.c index 7e369824..40e176ce 100644 --- a/src/gos/chibios.c +++ b/src/gos/chibios.c @@ -86,13 +86,14 @@ void gfxSemSignalI(gfxSem *psem) { chSemSignalI(&psem->sem); } -bool_t gfxCreateThread(void *stackarea, size_t stacksz, threadpriority_t prio, gfxThreadFunction fn, void *param) { +gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void *param) { if (!stackarea) { if (!stacksz) stacksz = 256; - return chThdCreateFromHeap(0, stacksz, prio, fn, param) != 0; + return chThdCreateFromHeap(0, stacksz, prio, fn, param); } - return stacksz && chThdCreateStatic(stackarea, stacksz, prio, fn, param) != NULL; + if (!stacksz) return NULL; + return chThdCreateStatic(stackarea, stacksz, prio, fn, param); } #endif /* GFX_USE_OS_CHIBIOS */ diff --git a/src/gos/win32.c b/src/gos/win32.c index bda57f6f..a1c5abcd 100644 --- a/src/gos/win32.c +++ b/src/gos/win32.c @@ -96,15 +96,24 @@ semcount_t gfxSemCounter(gfxSem *pSem) { return BasicInfo.CurrentCount; } -bool_t gfxCreateThread(void *stackarea, size_t stacksz, threadpriority_t prio, gfxThreadFunction fn, void *param) { - (void) stackarea; +gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void *param) { + (void) stackarea; HANDLE thd; if (!(thd = CreateThread(NULL, stacksz, fn, param, CREATE_SUSPENDED, NULL))) return FALSE; SetThreadPriority(thd, prio); ResumeThread(thd); - return TRUE; + return thd; +} + +threadreturn_t gfxThreadWait(gfxThreadHandle thread) { + DWORD ret; + + WaitForSingleObject(thread, INFINITE); + GetExitCodeThread(thread, &ret); + CloseHandle(thread); + return ret; } #endif /* GFX_USE_OS_WIN32 */ diff --git a/src/gtimer/gtimer.c b/src/gtimer/gtimer.c index 366ca4a9..1de1ce45 100644 --- a/src/gtimer/gtimer.c +++ b/src/gtimer/gtimer.c @@ -26,16 +26,16 @@ /* This mutex protects access to our tables */
static gfxMutex mutex;
-static bool_t haveThread = 0;
+static gfxThreadHandle hThread = 0;
static GTimer *pTimerHead = 0;
static gfxSem waitsem;
-static DECLARESTACK(waTimerThread, GTIMER_THREAD_WORKAREA_SIZE);
+static DECLARE_THREAD_STACK(waTimerThread, GTIMER_THREAD_WORKAREA_SIZE);
/*===========================================================================*/
/* Driver local functions. */
/*===========================================================================*/
-static threadreturn_t GTimerThreadHandler(void *arg) {
+static DECLARE_THREAD_FUNCTION(GTimerThreadHandler, arg) {
(void)arg;
GTimer *pt;
systemticks_t tm;
@@ -131,8 +131,10 @@ void gtimerStart(GTimer *pt, GTimerFunction fn, void *param, bool_t periodic, de gfxMutexEnter(&mutex);
// Start our thread if not already going
- if (!haveThread)
- haveThread = gfxCreateThread(waTimerThread, sizeof(waTimerThread), HIGH_PRIORITY, GTimerThreadHandler, NULL);
+ if (!hThread) {
+ hThread = gfxThreadCreate(waTimerThread, sizeof(waTimerThread), HIGH_PRIORITY, GTimerThreadHandler, NULL);
+ if (hThread) gfxThreadClose(hThread); // We never really need the handle again
+ }
// Is this already scheduled?
if (pt->flags & GTIMER_FLG_SCHEDULED) {
diff --git a/src/gwin/console.c b/src/gwin/console.c index 32e4f35a..5c068c93 100644 --- a/src/gwin/console.c +++ b/src/gwin/console.c @@ -63,7 +63,7 @@ GHandle gwinCreateConsole(GConsoleObject *gc, coord_t x, coord_t y, coord_t widt return 0; gc->gwin.type = GW_CONSOLE; gwinSetFont(&gc->gwin, font); - #if GFX_USE_OS_CHIBIOS + #if GFX_USE_OS_CHIBIOS && GWIN_CONSOLE_USE_BASESTREAM gc->stream.vmt = &GWindowConsoleVMT; #endif gc->cx = 0; @@ -193,7 +193,7 @@ void gwinPrintf(GHandle gh, const char *fmt, ...) { int i, precision, width; bool_t is_long, left_align; long l; - #if CHPRINTF_USE_FLOAT + #if GWIN_CONSOLE_USE_FLOAT float f; char tmpbuf[2*MAX_FILLER + 1]; #else @@ -286,7 +286,7 @@ void gwinPrintf(GHandle gh, const char *fmt, ...) { } p = ltoa_wd(p, l, 10, 0); break; - #if CHPRINTF_USE_FLOAT + #if GWIN_CONSOLE_USE_FLOAT case 'f': f = (float) va_arg(ap, double); if (f < 0) { |