diff options
author | Rickard Green <[email protected]> | 2010-12-03 10:57:26 +0100 |
---|---|---|
committer | Rickard Green <[email protected]> | 2010-12-11 03:03:19 +0100 |
commit | b297bfdd47b0a39831d8cc2541aeb910f9af0bca (patch) | |
tree | 59ac65b0d0bc95879d9507900781acdc4911bc3b /erts/lib_src/pthread | |
parent | 99e34bba1a60b262e24496cc9288b549360c6377 (diff) | |
download | otp-b297bfdd47b0a39831d8cc2541aeb910f9af0bca.tar.gz otp-b297bfdd47b0a39831d8cc2541aeb910f9af0bca.tar.bz2 otp-b297bfdd47b0a39831d8cc2541aeb910f9af0bca.zip |
Introduce ethr_sint_t and use it for atomics
The atomic memory operations interface used the 'long' type and assumed that
it was of the same size as 'void *'. This is true on most platforms, however,
not on Windows 64.
Diffstat (limited to 'erts/lib_src/pthread')
-rw-r--r-- | erts/lib_src/pthread/ethr_event.c | 8 | ||||
-rw-r--r-- | erts/lib_src/pthread/ethread.c | 8 |
2 files changed, 10 insertions, 6 deletions
diff --git a/erts/lib_src/pthread/ethr_event.c b/erts/lib_src/pthread/ethr_event.c index 6731c0eb46..ae1d827731 100644 --- a/erts/lib_src/pthread/ethr_event.c +++ b/erts/lib_src/pthread/ethr_event.c @@ -24,6 +24,10 @@ #define ETHR_INLINE_FUNC_NAME_(X) X ## __ #define ETHR_EVENT_IMPL__ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include "ethread.h" #if defined(ETHR_LINUX_FUTEX_IMPL__) @@ -52,7 +56,7 @@ wait__(ethr_event *e, int spincount) { unsigned sc = spincount; int res; - long val; + ethr_sint_t val; int until_yield = ETHR_YIELD_AFTER_BUSY_LOOPS; if (spincount < 0) @@ -131,7 +135,7 @@ static ETHR_INLINE int wait__(ethr_event *e, int spincount) { int sc = spincount; - long val; + ethr_sint_t val; int res, ulres; int until_yield = ETHR_YIELD_AFTER_BUSY_LOOPS; diff --git a/erts/lib_src/pthread/ethread.c b/erts/lib_src/pthread/ethread.c index ea1d9d43f0..7e5f92655c 100644 --- a/erts/lib_src/pthread/ethread.c +++ b/erts/lib_src/pthread/ethread.c @@ -81,14 +81,14 @@ typedef struct { static void *thr_wrapper(void *vtwd) { - long result; + ethr_sint_t result; void *res; ethr_thr_wrap_data__ *twd = (ethr_thr_wrap_data__ *) vtwd; void *(*thr_func)(void *) = twd->thr_func; void *arg = twd->arg; ethr_ts_event *tsep = NULL; - result = (long) ethr_make_ts_event__(&tsep); + result = (ethr_sint_t) ethr_make_ts_event__(&tsep); if (result == 0) { tsep->iflgs |= ETHR_TS_EV_ETHREAD; @@ -191,7 +191,7 @@ ethr_thr_create(ethr_tid *tid, void * (*func)(void *), void *arg, } #endif - ethr_atomic_init(&twd.result, -1); + ethr_atomic_init(&twd.result, (ethr_sint_t) -1); twd.tse = ethr_get_ts_event(); twd.thr_func = func; twd.arg = arg; @@ -252,7 +252,7 @@ ethr_thr_create(ethr_tid *tid, void * (*func)(void *), void *arg, /* Wait for child to initialize... */ while (1) { - long result; + ethr_sint_t result; ethr_event_reset(&twd.tse->event); result = ethr_atomic_read(&twd.result); |