1 /* -*- Mode: C; indent-tabs-mode: t; tab-width: 4 -*-
2 // ---------------------------------------------------------------------------
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)
16 #include "sjme/multithread.h"
17 #include "sjme/debug.h"
19 void sjme_thread_barrier(void)
21 #if defined(SJME_CONFIG_HAS_GCC)
23 #elif defined(SJME_CONFIG_HAS_WINDOWS)
28 sjme_errorCode
sjme_thread_current(
29 sjme_attrInOutNotNull sjme_thread
* outThread
)
33 if (outThread
== NULL
)
34 return SJME_ERROR_NULL_ARGUMENTS
;
37 result
= SJME_THREAD_NULL
;
39 #if defined(SJME_CONFIG_HAS_THREADS_PTHREAD)
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)
46 result
= GetCurrentThread();
47 if (result
== NULL
|| result
== SJME_THREAD_NULL
)
48 return SJME_ERROR_ILLEGAL_STATE
;
51 return SJME_ERROR_NOT_IMPLEMENTED
;
54 /* Use given 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
)
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
);
74 return aThread
== bThread
;
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
)
85 if (outThread
== NULL
|| inMain
== NULL
)
86 return SJME_ERROR_NULL_ARGUMENTS
;
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
,
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
;
103 return SJME_ERROR_NOT_IMPLEMENTED
;
108 return SJME_ERROR_NONE
;
111 void sjme_thread_yield(void)
113 #if defined(SJME_CONFIG_HAS_LINUX)
115 #elif defined(SJME_CONFIG_HAS_THREADS_PTHREAD_MACOS);
116 #elif defined(SJME_CONFIG_HAS_THREADS_PTHREAD_BSD)
118 #elif defined(SJME_CONFIG_HAS_THREADS_WIN32)