summaryrefslogtreecommitdiff
path: root/pjlib/src/pj/os_core_win32.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjlib/src/pj/os_core_win32.c')
-rw-r--r--pjlib/src/pj/os_core_win32.c107
1 files changed, 98 insertions, 9 deletions
diff --git a/pjlib/src/pj/os_core_win32.c b/pjlib/src/pj/os_core_win32.c
index 531be6bf..1cb6004d 100644
--- a/pjlib/src/pj/os_core_win32.c
+++ b/pjlib/src/pj/os_core_win32.c
@@ -38,6 +38,10 @@
# include <winsock2.h>
#endif
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+# include "../../../third_party/threademulation/include/ThreadEmulation.h"
+#endif
+
/* Activate mutex related logging if PJ_DEBUG_MUTEX is set, otherwise
* use default level 6 logging.
*/
@@ -297,7 +301,12 @@ PJ_DEF(pj_bool_t) pj_thread_is_registered(void)
*/
PJ_DEF(int) pj_thread_get_prio(pj_thread_t *thread)
{
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ PJ_UNUSED_ARG(thread);
+ return -1;
+#else
return GetThreadPriority(thread->hthread);
+#endif
}
@@ -312,7 +321,11 @@ PJ_DEF(pj_status_t) pj_thread_set_prio(pj_thread_t *thread, int prio)
prio<=THREAD_PRIORITY_TIME_CRITICAL,
PJ_EINVAL);
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ if (SetThreadPriorityRT(thread->hthread, prio) == FALSE)
+#else
if (SetThreadPriority(thread->hthread, prio) == FALSE)
+#endif
return PJ_RETURN_OS_ERROR(GetLastError());
return PJ_SUCCESS;
@@ -473,6 +486,10 @@ PJ_DEF(pj_status_t) pj_thread_create( pj_pool_t *pool,
DWORD dwflags = 0;
pj_thread_t *rec;
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ PJ_UNUSED_ARG(stack_size);
+#endif
+
PJ_CHECK_STACK();
PJ_ASSERT_RETURN(pool && proc && thread_ptr, PJ_EINVAL);
@@ -506,9 +523,17 @@ PJ_DEF(pj_status_t) pj_thread_create( pj_pool_t *pool,
/* Create the thread. */
rec->proc = proc;
rec->arg = arg;
- rec->hthread = CreateThread(NULL, stack_size,
- thread_main, rec,
- dwflags, &rec->idthread);
+
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ rec->hthread = CreateThreadRT(NULL, 0,
+ thread_main, rec,
+ dwflags, NULL);
+#else
+ rec->hthread = CreateThread(NULL, stack_size,
+ thread_main, rec,
+ dwflags, &rec->idthread);
+#endif
+
if (rec->hthread == NULL)
return PJ_RETURN_OS_ERROR(GetLastError());
@@ -540,7 +565,11 @@ PJ_DEF(pj_status_t) pj_thread_resume(pj_thread_t *p)
PJ_CHECK_STACK();
PJ_ASSERT_RETURN(p, PJ_EINVAL);
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ if (ResumeThreadRT(rec->hthread) == (DWORD)-1)
+#else
if (ResumeThread(rec->hthread) == (DWORD)-1)
+#endif
return PJ_RETURN_OS_ERROR(GetLastError());
else
return PJ_SUCCESS;
@@ -584,7 +613,11 @@ PJ_DEF(pj_status_t) pj_thread_join(pj_thread_t *p)
PJ_LOG(6, (pj_thread_this()->obj_name, "Joining thread %s", p->obj_name));
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ rc = WaitForSingleObjectEx(rec->hthread, INFINITE, FALSE);
+#else
rc = WaitForSingleObject(rec->hthread, INFINITE);
+#endif
if (rc==WAIT_OBJECT_0)
return PJ_SUCCESS;
@@ -616,7 +649,13 @@ PJ_DEF(pj_status_t) pj_thread_destroy(pj_thread_t *p)
PJ_DEF(pj_status_t) pj_thread_sleep(unsigned msec)
{
PJ_CHECK_STACK();
+
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ SleepRT(msec);
+#else
Sleep(msec);
+#endif
+
return PJ_SUCCESS;
}
@@ -810,7 +849,11 @@ PJ_DEF(pj_status_t) pj_thread_local_alloc(long *index)
//beginning before main thread is initialized.
//PJ_CHECK_STACK();
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ *index = TlsAllocRT();
+#else
*index = TlsAlloc();
+#endif
if (*index == TLS_OUT_OF_INDEXES)
return PJ_RETURN_OS_ERROR(GetLastError());
@@ -824,7 +867,11 @@ PJ_DEF(pj_status_t) pj_thread_local_alloc(long *index)
PJ_DEF(void) pj_thread_local_free(long index)
{
PJ_CHECK_STACK();
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ TlsFreeRT(index);
+#else
TlsFree(index);
+#endif
}
/*
@@ -837,7 +884,13 @@ PJ_DEF(pj_status_t) pj_thread_local_set(long index, void *value)
//Can't check stack because this function is called in the
//beginning before main thread is initialized.
//PJ_CHECK_STACK();
+
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ rc = TlsSetValueRT(index, value);
+#else
rc = TlsSetValue(index, value);
+#endif
+
return rc!=0 ? PJ_SUCCESS : PJ_RETURN_OS_ERROR(GetLastError());
}
@@ -849,7 +902,11 @@ PJ_DEF(void*) pj_thread_local_get(long index)
//Can't check stack because this function is called
//by PJ_CHECK_STACK() itself!!!
//PJ_CHECK_STACK();
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ return TlsGetValueRT(index);
+#else
return TlsGetValue(index);
+#endif
}
///////////////////////////////////////////////////////////////////////////////
@@ -858,7 +915,9 @@ static pj_status_t init_mutex(pj_mutex_t *mutex, const char *name)
PJ_CHECK_STACK();
-#if PJ_WIN32_WINNT >= 0x0400
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ InitializeCriticalSectionEx(&mutex->crit, 0, 0);
+#elif PJ_WIN32_WINNT >= 0x0400
InitializeCriticalSection(&mutex->crit);
#else
mutex->hMutex = CreateMutex(NULL, FALSE, NULL);
@@ -1112,7 +1171,15 @@ PJ_DEF(pj_status_t) pj_sem_create( pj_pool_t *pool,
PJ_ASSERT_RETURN(pool && sem_ptr, PJ_EINVAL);
sem = pj_pool_alloc(pool, sizeof(*sem));
+
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ /** SEMAPHORE_ALL_ACCESS **/
+ sem->hSemaphore = CreateSemaphoreEx(NULL, initial, max, NULL, 0,
+ SEMAPHORE_ALL_ACCESS);
+#else
sem->hSemaphore = CreateSemaphore(NULL, initial, max, NULL);
+#endif
+
if (!sem->hSemaphore)
return PJ_RETURN_OS_ERROR(GetLastError());
@@ -1142,8 +1209,13 @@ static pj_status_t pj_sem_wait_for(pj_sem_t *sem, unsigned timeout)
LOG_MUTEX((sem->obj_name, "Semaphore: thread %s is waiting",
pj_thread_this()->obj_name));
-
+
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ result = WaitForSingleObjectEx(sem->hSemaphore, timeout, FALSE);
+#else
result = WaitForSingleObject(sem->hSemaphore, timeout);
+#endif
+
if (result == WAIT_OBJECT_0) {
LOG_MUTEX((sem->obj_name, "Semaphore acquired by thread %s",
pj_thread_this()->obj_name));
@@ -1240,8 +1312,14 @@ PJ_DEF(pj_status_t) pj_event_create( pj_pool_t *pool,
if (!event)
return PJ_ENOMEM;
- event->hEvent = CreateEvent(NULL, manual_reset?TRUE:FALSE,
- initial?TRUE:FALSE, NULL);
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ event->hEvent = CreateEventEx(NULL, NULL,
+ (manual_reset? 0x1:0x0) | (initial? 0x2:0x0),
+ EVENT_ALL_ACCESS);
+#else
+ event->hEvent = CreateEvent(NULL, manual_reset ? TRUE : FALSE,
+ initial ? TRUE : FALSE, NULL);
+#endif
if (!event->hEvent)
return PJ_RETURN_OS_ERROR(GetLastError());
@@ -1273,7 +1351,12 @@ static pj_status_t pj_event_wait_for(pj_event_t *event, unsigned timeout)
PJ_LOG(6, (event->obj_name, "Event: thread %s is waiting",
pj_thread_this()->obj_name));
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ result = WaitForSingleObjectEx(event->hEvent, timeout, FALSE);
+#else
result = WaitForSingleObject(event->hEvent, timeout);
+#endif
+
if (result == WAIT_OBJECT_0) {
PJ_LOG(6, (event->obj_name, "Event: thread %s is released",
pj_thread_this()->obj_name));
@@ -1331,15 +1414,21 @@ PJ_DEF(pj_status_t) pj_event_set(pj_event_t *event)
*/
PJ_DEF(pj_status_t) pj_event_pulse(pj_event_t *event)
{
+#if defined(PJ_WIN32_WINPHONE8) && PJ_WIN32_WINPHONE8
+ PJ_UNUSED_ARG(event);
+ pj_assert(!"pj_event_pulse() not supported!");
+ return PJ_ENOTSUP;
+#else
PJ_CHECK_STACK();
PJ_ASSERT_RETURN(event, PJ_EINVAL);
PJ_LOG(6, (event->obj_name, "Pulsing event"));
if (PulseEvent(event->hEvent))
- return PJ_SUCCESS;
+ return PJ_SUCCESS;
else
- return PJ_RETURN_OS_ERROR(GetLastError());
+ return PJ_RETURN_OS_ERROR(GetLastError());
+#endif
}
/*