MacOS pthreads does not have pthread_yield().
[SquirrelJME.git] / nanocoat / lib / base / multithread.c
blobcc537b42c2a92e62c83ec782efa7bbaf92227560
1 /* -*- Mode: C; indent-tabs-mode: t; tab-width: 4 -*-
2 // ---------------------------------------------------------------------------
3 // SquirrelJME
4 // Copyright (C) Stephanie Gawroriski <xer@multiphasicapps.net>
5 // ---------------------------------------------------------------------------
6 // SquirrelJME is under the Mozilla Public License Version 2.0.
7 // See license.mkd for licensing and copyright information.
8 // -------------------------------------------------------------------------*/
10 #include "sjme/config.h"
12 #if defined(SJME_CONFIG_HAS_LINUX)
13 #include <sched.h>
14 #endif
16 #include "sjme/multithread.h"
17 #include "sjme/debug.h"
19 void sjme_thread_barrier(void)
21 #if defined(SJME_CONFIG_HAS_GCC)
22 __sync_synchronize();
23 #elif defined(SJME_CONFIG_HAS_WINDOWS)
24 MemoryBarrier();
25 #endif
28 sjme_errorCode sjme_thread_current(
29 sjme_attrInOutNotNull sjme_thread* outThread)
31 sjme_thread result;
33 if (outThread == NULL)
34 return SJME_ERROR_NULL_ARGUMENTS;
36 /* Clear. */
37 result = SJME_THREAD_NULL;
39 #if defined(SJME_CONFIG_HAS_THREADS_PTHREAD)
40 /* Query. */
41 result = pthread_self();
42 if (result == 0 || result == SJME_THREAD_NULL)
43 return SJME_ERROR_ILLEGAL_STATE;
44 #elif defined(SJME_CONFIG_HAS_THREADS_WIN32)
45 /* Query. */
46 result = GetCurrentThread();
47 if (result == NULL || result == SJME_THREAD_NULL)
48 return SJME_ERROR_ILLEGAL_STATE;
49 #else
50 sjme_todo("Impl?");
51 return SJME_ERROR_NOT_IMPLEMENTED;
52 #endif
54 /* Use given result. */
55 *outThread = result;
56 return SJME_ERROR_NONE;
59 sjme_jboolean sjme_thread_equal(
60 sjme_attrInNullable sjme_thread aThread,
61 sjme_attrInNullable sjme_thread bThread)
63 if ((aThread == SJME_THREAD_NULL) != (bThread == SJME_THREAD_NULL))
64 return SJME_JNI_FALSE;
66 else if (aThread == SJME_THREAD_NULL && bThread == SJME_THREAD_NULL)
67 return SJME_JNI_TRUE;
69 #if defined(SJME_CONFIG_HAS_THREADS_PTHREAD)
70 return pthread_equal(aThread, bThread);
71 #elif defined(SJME_CONFIG_HAS_THREADS_WIN32)
72 return GetThreadId(aThread) == GetThreadId(bThread);
73 #else
74 return aThread == bThread;
75 #endif
78 sjme_errorCode sjme_thread_new(
79 sjme_attrInOutNotNull sjme_thread* outThread,
80 sjme_attrInNotNull sjme_thread_mainFunc inMain,
81 sjme_attrInNullable sjme_thread_parameter anything)
83 sjme_thread result;
85 if (outThread == NULL || inMain == NULL)
86 return SJME_ERROR_NULL_ARGUMENTS;
88 /* Clear first. */
89 result = SJME_THREAD_NULL;
91 #if defined(SJME_CONFIG_HAS_THREADS_PTHREAD)
92 /* Setup new thread. */
93 if (0 != pthread_create(&result, NULL, inMain,
94 anything))
95 return SJME_ERROR_CANNOT_CREATE;
96 #elif defined(SJME_CONFIG_HAS_THREADS_WIN32)
97 /* Setup new thread. */
98 result = CreateThread(NULL, 0, inMain, anything, 0, NULL);
99 if (result == NULL || result == SJME_THREAD_NULL)
100 return SJME_ERROR_CANNOT_CREATE;
101 #else
102 sjme_todo("Impl?");
103 return SJME_ERROR_NOT_IMPLEMENTED;
104 #endif
106 /* Success! */
107 *outThread = result;
108 return SJME_ERROR_NONE;
111 void sjme_thread_yield(void)
113 #if defined(SJME_CONFIG_HAS_LINUX)
114 sched_yield();
115 #elif defined(SJME_CONFIG_HAS_THREADS_PTHREAD_MACOS);
116 #elif defined(SJME_CONFIG_HAS_THREADS_PTHREAD_BSD)
117 pthread_yield();
118 #elif defined(SJME_CONFIG_HAS_THREADS_WIN32)
119 SwitchToThread();
120 #endif