aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorinmarket <andrewh@inmarket.com.au>2013-06-02 18:57:22 +1000
committerinmarket <andrewh@inmarket.com.au>2013-06-02 18:57:22 +1000
commit1c258a82738e145953fc9cf40c68dcce6db87d92 (patch)
treec151e882619714d696276ce29ef3388dce6e1866 /src
parentc2a4f9a5d616f5b18a965652d7492aacd377e5e2 (diff)
downloaduGFX-1c258a82738e145953fc9cf40c68dcce6db87d92.tar.gz
uGFX-1c258a82738e145953fc9cf40c68dcce6db87d92.tar.bz2
uGFX-1c258a82738e145953fc9cf40c68dcce6db87d92.zip
GOS updates
Diffstat (limited to 'src')
-rw-r--r--src/gdisp/gdisp.c10
-rw-r--r--src/gevent/gevent.c2
-rw-r--r--src/gfx.c9
-rw-r--r--src/gos/chibios.c7
-rw-r--r--src/gos/win32.c15
-rw-r--r--src/gtimer/gtimer.c12
-rw-r--r--src/gwin/console.c6
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);
}
diff --git a/src/gfx.c b/src/gfx.c
index ffc38c84..2b307426 100644
--- a/src/gfx.c
+++ b/src/gfx.c
@@ -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) {