1 /* Copyright (c) 2013-2018 Jeffrey Pfau
2  *
3  * This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef SWITCH_THREADING_H
7 #define SWITCH_THREADING_H
8 
9 #include <mgba-util/common.h>
10 
11 #include <switch.h>
12 
13 #define THREAD_ENTRY void
14 typedef ThreadFunc ThreadEntry;
15 typedef CondVar Condition;
16 
MutexInit(Mutex * mutex)17 static inline int MutexInit(Mutex* mutex) {
18 	mutexInit(mutex);
19 	return 0;
20 }
21 
MutexDeinit(Mutex * mutex)22 static inline int MutexDeinit(Mutex* mutex) {
23 	UNUSED(mutex);
24 	return 0;
25 }
26 
MutexLock(Mutex * mutex)27 static inline int MutexLock(Mutex* mutex) {
28 	mutexLock(mutex);
29 	return 0;
30 }
31 
MutexTryLock(Mutex * mutex)32 static inline int MutexTryLock(Mutex* mutex) {
33 	return mutexTryLock(mutex);
34 }
35 
MutexUnlock(Mutex * mutex)36 static inline int MutexUnlock(Mutex* mutex) {
37 	mutexUnlock(mutex);
38 	return 0;
39 }
40 
ConditionInit(Condition * cond)41 static inline int ConditionInit(Condition* cond) {
42 	condvarInit(cond);
43 	return 0;
44 }
45 
ConditionDeinit(Condition * cond)46 static inline int ConditionDeinit(Condition* cond) {
47 	UNUSED(cond);
48 	return 0;
49 }
50 
ConditionWait(Condition * cond,Mutex * mutex)51 static inline int ConditionWait(Condition* cond, Mutex* mutex) {
52 	return condvarWait(cond, mutex);
53 }
54 
ConditionWaitTimed(Condition * cond,Mutex * mutex,int32_t timeoutMs)55 static inline int ConditionWaitTimed(Condition* cond, Mutex* mutex, int32_t timeoutMs) {
56 	return condvarWaitTimeout(cond, mutex, timeoutMs * 1000000LL);
57 }
58 
ConditionWake(Condition * cond)59 static inline int ConditionWake(Condition* cond) {
60 	return condvarWakeOne(cond);
61 }
62 
ThreadCreate(Thread * thread,ThreadEntry entry,void * context)63 static inline int ThreadCreate(Thread* thread, ThreadEntry entry, void* context) {
64 	if (!entry || !thread) {
65 		return 1;
66 	}
67 	int res = threadCreate(thread, entry, context, NULL, 0x8000, 0x3B, 1);
68 	if(R_FAILED(res)) {
69 		return res;
70 	}
71 	return threadStart(thread);
72 }
73 
ThreadJoin(Thread * thread)74 static inline int ThreadJoin(Thread* thread) {
75 	int res = threadWaitForExit(thread);
76 	if(R_FAILED(res)) {
77 		return res;
78 	}
79 	return threadClose(thread);
80 }
81 
ThreadSetName(const char * name)82 static inline void ThreadSetName(const char* name) {
83 	UNUSED(name);
84 	// Unimplemented
85 }
86 
87 #endif
88