diff --git a/include/coreinit/cache.h b/include/coreinit/cache.h index c9c7bf4..96bfa6a 100644 --- a/include/coreinit/cache.h +++ b/include/coreinit/cache.h @@ -4,6 +4,8 @@ /** * \defgroup coreinit_cache Cache * \ingroup coreinit + * + * Cache synchronisation functions. * @{ */ @@ -11,34 +13,67 @@ extern "C" { #endif + +/** + * Equivalent to dcbi instruction. + */ void DCInvalidateRange(void *addr, uint32_t size); + +/** + * Equivalent to dcbf, sync, eieio. + */ void DCFlushRange(void *addr, uint32_t size); + +/** + * Equivalent to dcbst, sync, eieio. + */ void DCStoreRange(void *addr, uint32_t size); + +/** + * Equivalent to dcbf. + * + * Does not perform sync, eieio like DCFlushRange. + */ void DCFlushRangeNoSync(void *addr, uint32_t size); + +/** + * Equivalent to dcbst. + * + * Does not perform sync, eieio like DCStoreRange. + */ void DCStoreRangeNoSync(void *addr, uint32_t size); + +/** + * Equivalent to dcbz instruction. + */ void DCZeroRange(void *addr, uint32_t size); + +/** + * Equivalent to dcbt instruction. + */ void DCTouchRange(void *addr, uint32_t size); + #ifdef __cplusplus } #endif diff --git a/include/coreinit/condition.h b/include/coreinit/condition.h index 7cd3cf1..de2b18c 100644 --- a/include/coreinit/condition.h +++ b/include/coreinit/condition.h @@ -5,6 +5,10 @@ /** * \defgroup coreinit_cond Condition Variable * \ingroup coreinit + * + * Standard condition variable implementation. + * + * Similar to std::condition_variable. * @{ */ @@ -35,20 +39,44 @@ CHECK_OFFSET(OSCondition, 0x04, name); CHECK_OFFSET(OSCondition, 0x0c, queue); CHECK_SIZE(OSCondition, 0x1c); + +/** + * Initialise a condition variable structure. + */ void OSInitCond(OSCondition *condition); + +/** + * Initialise a condition variable structure with a name. + */ void OSInitCondEx(OSCondition *condition, const char *name); + +/** + * Sleep the current thread until the condition variable has been signalled. + * + * The mutex must be locked when entering this function. + * Will unlock the mutex and then sleep, reacquiring the mutex when woken. + * + * Similar to std::condition_variable::wait. + */ void OSWaitCond(OSCondition *condition, OSMutex *mutex); + +/** + * Will wake up any threads waiting on the condition with OSWaitCond. + * + * Similar to std::condition_variable::notify_all. + */ void OSSignalCond(OSCondition *condition); + #ifdef __cplusplus } #endif diff --git a/include/coreinit/event.h b/include/coreinit/event.h index f97a157..9600195 100644 --- a/include/coreinit/event.h +++ b/include/coreinit/event.h @@ -6,6 +6,10 @@ /** * \defgroup coreinit_event Event Object * \ingroup coreinit + * + * Standard event object implementation. There are two supported event object modes, check OSEventMode. + * + * Similar to Windows Event Objects. * @{ */ @@ -18,7 +22,10 @@ typedef uint32_t OSEventMode; enum OSEventMode { + //! A manual event will only reset when OSResetEvent is called. OS_EVENT_MODE_MANUAL = 0, + + //! An auto event will reset everytime a thread is woken. OS_EVENT_MODE_AUTO = 1, }; @@ -26,11 +33,21 @@ enum OSEventMode struct OSEvent { + //! Should always be set to the value OS_EVENT_TAG. uint32_t tag; + + //! Name set by OSInitEventEx. const char *name; + UNKNOWN(4); + + //! The current value of the event object. BOOL value; + + //! The threads currently waiting on this event object with OSWaitEvent. OSThreadQueue queue; + + //! The mode of the event object, set by OSInitEvent. OSEventMode mode; }; CHECK_OFFSET(OSEvent, 0x0, tag); @@ -42,29 +59,85 @@ CHECK_SIZE(OSEvent, 0x24); #pragma pack(pop) + +/** + * Initialise an event object with value and mode. + */ void OSInitEvent(OSEvent *event, BOOL value, OSEventMode mode); + +/** + * Initialise an event object with value, mode and name. + */ void OSInitEventEx(OSEvent *event, BOOL value, OSEventMode mode, char *name); + +/** + * Signals the event. + * + * If no threads are waiting the event value is set. + * + * If the event mode is OS_EVENT_MODE_MANUAL this will wake all waiting threads + * and the event will remain set until OSResetEvent is called. + * + * If the event mode is OS_EVENT_MODE_AUTO this will wake only one thread + * and the event will be reset immediately. + * + * Similar to SetEvent. + */ void OSSignalEvent(OSEvent *event); +/** + * Signals all threads waiting on an event. + * + * If no threads are waiting the event value is set. + * + * If the event mode is OS_EVENT_MODE_MANUAL this will wake all waiting threads + * and the event will remain set until OSResetEvent is called. + * + * If the event mode is OS_EVENT_MODE_AUTO this will wake all waiting threads + * and the event will be reset. + */ void OSSignalEventAll(OSEvent *event); + +/** + * Wait until an event is signalled. + * + * If the event is already set, this returns immediately. + * + * If the event mode is OS_EVENT_MODE_AUTO the event will be reset before + * returning from this method. + * + * Similar to WaitForSingleObject. + */ void OSWaitEvent(OSEvent *event); + +/** + * Resets the event object. + * + * Similar to ResetEvent. + */ void OSResetEvent(OSEvent *event); + +/** + * Wait until an event is signalled or a timeout has occurred. + * + * Similar to WaitForSingleObject. + */ BOOL OSWaitEventWithTimeout(OSEvent *event, OSTime timeout); diff --git a/include/coreinit/fastmutex.h b/include/coreinit/fastmutex.h index 7e70388..98dd477 100644 --- a/include/coreinit/fastmutex.h +++ b/include/coreinit/fastmutex.h @@ -5,6 +5,9 @@ /** * \defgroup coreinit_fastmutex Fast Mutex * \ingroup coreinit + * + * Similar to OSMutex but tries to acquire the mutex without using the global + * scheduler lock, and does not test for thread cancel. * @{ */ @@ -43,7 +46,8 @@ CHECK_OFFSET(OSFastMutex, 0x14, link); CHECK_SIZE(OSFastMutex, 0x2c); void -OSFastMutex_Init(OSFastMutex *mutex, const char *name); +OSFastMutex_Init(OSFastMutex *mutex, + const char *name); void OSFastMutex_Lock(OSFastMutex *mutex); diff --git a/include/coreinit/mutex.h b/include/coreinit/mutex.h index c0c2a0a..9aa90fa 100644 --- a/include/coreinit/mutex.h +++ b/include/coreinit/mutex.h @@ -5,6 +5,10 @@ /** * \defgroup coreinit_mutex Mutex * \ingroup coreinit + * + * Standard mutex object, supports recursive locking. + * + * Similar to std::recursive_mutex. * @{ */ @@ -31,23 +35,24 @@ CHECK_SIZE(OSMutexLink, 0x8); struct OSMutex { - // OSMutex::Tag + //! Should always be set to the value OS_MUTEX_TAG. uint32_t tag; - // Name set by OSInitMutexEx(mutex, name) + //! Name set by OSInitMutexEx. const char *name; + UNKNOWN(4); - // Queue of threads waiting for this mutex to unlock + //! Queue of threads waiting for this mutex to unlock. OSThreadQueue queue; - // Current owner of mutex + //! Current owner of mutex. OSThread *owner; - // Current recursion lock count of mutex + //! Current recursion lock count of mutex. int32_t count; - // Link used inside OSThread's mutex queue + //! Link used inside OSThread's mutex queue. OSMutexLink link; }; CHECK_OFFSET(OSMutex, 0x00, tag); @@ -58,21 +63,68 @@ CHECK_OFFSET(OSMutex, 0x20, count); CHECK_OFFSET(OSMutex, 0x24, link); CHECK_SIZE(OSMutex, 0x2c); + +/** + * Initialise a mutex structure. + */ void OSInitMutex(OSMutex *mutex); + +/** + * Initialise a mutex structure with a name. + */ void OSInitMutexEx(OSMutex *mutex, const char *name); + +/** + * Lock the mutex. + * + * If no one owns the mutex, set current thread as owner. + * + * If the lock is owned by the current thread, increase the recursion count. + * + * If the lock is owned by another thread, the current thread will sleep until + * the owner has unlocked this mutex. + * + * Similar to std::recursive_mutex::lock. + */ void OSLockMutex(OSMutex *mutex); + +/** + * Try to lock a mutex. + * + * If no one owns the mutex, set current thread as owner. + * + * If the lock is owned by the current thread, increase the recursion count. + * + * If the lock is owned by another thread, do not block, return FALSE. + * + * \return TRUE if the mutex is locked, FALSE if the mutex is owned by another thread. + * + * Similar to std::recursive_mutex::try_lock. + */ +BOOL +OSTryLockMutex(OSMutex *mutex); + + +/** + * Unlocks the mutex. + * + * Will decrease the recursion count, will only unlock the mutex when the + * recursion count reaches 0. + * + * If any other threads are waiting to lock the mutex they will be woken. + * + * Similar to std::recursive_mutex::unlock. + */ void OSUnlockMutex(OSMutex *mutex); -BOOL -OSTryLockMutex(OSMutex *mutex); #ifdef __cplusplus } diff --git a/include/coreinit/semaphore.h b/include/coreinit/semaphore.h index 972a042..2d1b0f9 100644 --- a/include/coreinit/semaphore.h +++ b/include/coreinit/semaphore.h @@ -5,6 +5,8 @@ /** * \defgroup coreinit_semaphore Semaphore * \ingroup coreinit + * + * Similar to Windows Semaphore Objects. * @{ */ @@ -18,10 +20,18 @@ typedef struct OSSemaphore OSSemaphore; struct OSSemaphore { + //! Should always be set to the value OS_SEMAPHORE_TAG. uint32_t tag; + + //! Name set by OSInitMutexEx. const char *name; + UNKNOWN(4); + + //! Current count of semaphore int32_t count; + + //! Queue of threads waiting on semaphore object with OSWaitSemaphore OSThreadQueue queue; }; CHECK_OFFSET(OSSemaphore, 0x00, tag); @@ -30,27 +40,63 @@ CHECK_OFFSET(OSSemaphore, 0x0C, count); CHECK_OFFSET(OSSemaphore, 0x10, queue); CHECK_SIZE(OSSemaphore, 0x20); + +/** + * Initialise semaphore object with count. + */ void OSInitSemaphore(OSSemaphore *semaphore, int32_t count); + +/** + * Initialise semaphore object with count and name. + */ void OSInitSemaphoreEx(OSSemaphore *semaphore, int32_t count, const char *name); + +/** + * Get the current semaphore count. + */ int32_t OSGetSemaphoreCount(OSSemaphore *semaphore); + +/** + * Increase the semaphore value. + * + * If any threads are waiting for semaphore, they are woken. + */ int32_t OSSignalSemaphore(OSSemaphore *semaphore); + +/** + * Decrease the semaphore value. + * + * If the value is less than or equal to zero the current thread will be put to + * sleep until the count is above zero and it can decrement it safely. + */ int32_t OSWaitSemaphore(OSSemaphore *semaphore); + +/** + * Try to decrease the semaphore value. + * + * If the value is greater than zero then it will be decremented, else the function + * will return immediately with a value <= 0 indicating a failure. + * + * \return Returns previous semaphore count, before the decrement in this function. + * If the value is >0 then it means the call was succesful. + */ int32_t OSTryWaitSemaphore(OSSemaphore *semaphore); + #ifdef __cplusplus } #endif diff --git a/include/coreinit/thread.h b/include/coreinit/thread.h index 98fb09f..492e9be 100644 --- a/include/coreinit/thread.h +++ b/include/coreinit/thread.h @@ -6,6 +6,20 @@ /** * \defgroup coreinit_thread Thread * \ingroup coreinit + * + * The thread scheduler in the Wii U uses co-operative scheduling, this is different + * to the usual pre-emptive scheduling that most operating systems use (such as + * Windows, Linux, etc). In co-operative scheduling threads must voluntarily yield + * execution to other threads. In pre-emptive threads are switched by the operating + * system after an amount of time. + * + * With the Wii U's scheduling model the thread with the highest priority which + * is in a non-waiting state will always be running (where 0 is the highest + * priority and 31 is the lowest). Execution will only switch to other threads + * once this thread has been forced to wait, such as when waiting to acquire a + * mutex, or when the thread voluntarily yields execution to other threads which + * have the same priority using OSYieldThread. OSYieldThread will never yield to + * a thread with lower priority than the current thread. * @{ */ @@ -31,9 +45,17 @@ typedef void (*OSThreadDeallocatorFn)(OSThread *thread, void *stack); enum OSThreadState { OS_THREAD_STATE_NONE = 0, + + //! Thread is ready to run OS_THREAD_STATE_READY = 1 << 0, + + //! Thread is running OS_THREAD_STATE_RUNNING = 1 << 1, + + //! Thread is waiting, i.e. on a mutex OS_THREAD_STATE_WAITING = 1 << 2, + + //! Thread is about to terminate OS_THREAD_STATE_MORIBUND = 1 << 3, }; @@ -46,18 +68,32 @@ enum OSThreadRequest enum OSThreadAttributes { + //! Allow the thread to run on CPU0. OS_THREAD_ATTRIB_AFFINITY_CPU0 = 1 << 0, + + //! Allow the thread to run on CPU1. OS_THREAD_ATTRIB_AFFINITY_CPU1 = 1 << 1, + + //! Allow the thread to run on CPU2. OS_THREAD_ATTRIB_AFFINITY_CPU2 = 1 << 2, - OS_THREAD_ATTRIB_AFFINITY_ANY = 1 << 3, - OS_THREAD_ATTRIB_DETACHED = 1 << 4 + + //! Allow the thread to run any CPU. + OS_THREAD_ATTRIB_AFFINITY_ANY = ((1 << 0) | (1 << 1) | (1 << 2)), + + //! Start the thread detached. + OS_THREAD_ATTRIB_DETACHED = 1 << 3, + + //! Enables tracking of stack usage. + OS_THREAD_ATTRIB_STACK_USAGE = 1 << 5 }; #define OS_CONTEXT_TAG 0x4F53436F6E747874ull struct OSContext { + //! Should always be set to the value OS_CONTEXT_TAG. uint64_t tag; + uint32_t gpr[32]; uint32_t cr; uint32_t lr; @@ -132,7 +168,6 @@ CHECK_SIZE(OSFastMutexQueue, 0x08); #define OS_THREAD_TAG 0x74487244u -#pragma pack(push, 1) struct OSThread { OSContext context; @@ -140,36 +175,85 @@ struct OSThread OSThreadState state; OSThreadAttributes attr; uint16_t id; + + //! Suspend count (increased by OSSuspendThread). int32_t suspendCounter; - int32_t priority; // Actual priority of thread - int32_t basePriority; // Base priority of thread - int32_t exitValue; // Value from OSExitThread + + //! Actual priority of thread. + int32_t priority; + + //! Base priority of thread, 0 is highest priority, 31 is lowest priority. + int32_t basePriority; + + //! Exit value + int32_t exitValue; + UNKNOWN(0x35C - 0x338); - OSThreadQueue *queue; // Queue the thread is on - OSThreadLink link; // Thread queue link - OSThreadQueue joinQueue; // Queue of threads waiting to join this - OSMutex *mutex; // Mutex we are waiting to lock - OSMutexQueue mutexQueue; // Mutexes owned by this thread - OSThreadLink activeLink; // Link on active thread queue - void *stackStart; // Stack starting value (top, highest address) - void *stackEnd; // Stack end value (bottom, lowest address) - OSThreadEntryPointFn entryPoint; // Entry point from OSCreateThread + + //! Queue the thread is currently waiting on + OSThreadQueue *queue; + + //! Link used for thread queue + OSThreadLink link; + + //! Queue of threads waiting to join this thread + OSThreadQueue joinQueue; + + //! Mutex this thread is waiting to lock + OSMutex *mutex; + + //! Queue of mutexes this thread owns + OSMutexQueue mutexQueue; + + //! Link for global active thread queue + OSThreadLink activeLink; + + //! Stack start (top, highest address) + void *stackStart; + + //! Stack end (bottom, lowest address) + void *stackEnd; + + //! Thread entry point + OSThreadEntryPointFn entryPoint; + UNKNOWN(0x57c - 0x3a0); - uint32_t specific[0x10]; // OSSetThreadSpecific / OSGetThreadSpecific + + //! Thread specific values, accessed with OSSetThreadSpecific and OSGetThreadSpecific. + uint32_t specific[0x10]; + UNKNOWN(0x5c0 - 0x5bc); - const char *name; // Thread name + + //! Thread name, accessed with OSSetThreadName and OSGetThreadName. + const char *name; + UNKNOWN(0x4); - void *userStackPointer; // The stack specified in OSCreateThread - OSThreadCleanupCallbackFn cleanupCallback; // Set with OSSetThreadCleanupCallback - OSThreadDeallocatorFn deallocator; // Set with OSSetThreadDeallocator - uint32_t cancelState; // Is listening to requestFlag enabled - OSThreadRequest requestFlag; // Request flag for cancel or suspend - int32_t needSuspend; // How many pending suspends we have - int32_t suspendResult; // Result of suspend - OSThreadQueue suspendQueue; // Queue of threads waiting for suspend to finish + + //! The stack pointer passed in OSCreateThread. + void *userStackPointer; + + //! Called just before thread is terminated, set with OSSetThreadCleanupCallback + OSThreadCleanupCallbackFn cleanupCallback; + + //! Called just after a thread is terminated, set with OSSetThreadDeallocator + OSThreadDeallocatorFn deallocator; + + //! If TRUE then a thread can be cancelled or suspended, set with OSSetThreadCancelState + BOOL cancelState; + + //! Current thread request, used for cancelleing and suspending the thread. + OSThreadRequest requestFlag; + + //! Pending suspend request count + int32_t needSuspend; + + //! Result of thread suspend + int32_t suspendResult; + + //! Queue of threads waiting for a thread to be suspended. + OSThreadQueue suspendQueue; UNKNOWN(0x69c - 0x5f4); }; -#pragma pack(pop) CHECK_OFFSET(OSThread, 0x320, tag); CHECK_OFFSET(OSThread, 0x324, state); CHECK_OFFSET(OSThread, 0x325, attr); @@ -199,21 +283,57 @@ CHECK_OFFSET(OSThread, 0x5e0, suspendResult); CHECK_OFFSET(OSThread, 0x5e4, suspendQueue); CHECK_SIZE(OSThread, 0x69c); + +/** + * Cancels a thread. + * + * This sets the threads requestFlag to OS_THREAD_REQUEST_CANCEL, the thread will + * be terminated next time OSTestThreadCancel is called. + */ void OSCancelThread(OSThread *thread); + +/** + * Returns the count of active threads. + */ int32_t OSCheckActiveThreads(); + +/** + * Get the maximum amount of stack the thread has used. + */ int32_t OSCheckThreadStackUsage(OSThread *thread); + +/** + * Disable tracking of thread stack usage + */ void OSClearThreadStackUsage(OSThread *thread); + +/** + * Clears a thread's suspend counter and resumes it. + */ void OSContinueThread(OSThread *thread); + +/** + * Create a new thread. + * + * \param thread Thread to initialise. + * \param entry Thread entry point. + * \param argc argc argument passed to entry point. + * \param argv argv argument passed to entry point. + * \param stack Top of stack (highest address). + * \param stackSize Size of stack. + * \param priority Thread priority, 0 is highest priorty, 31 is lowest. + * \param attributes Thread attributes, see OSThreadAttributes. + */ BOOL OSCreateThread(OSThread *thread, OSThreadEntryPointFn entry, @@ -224,111 +344,277 @@ OSCreateThread(OSThread *thread, int32_t priority, OSThreadAttributes attributes); + +/** + * Detach thread. + */ void OSDetachThread(OSThread *thread); + +/** + * Exit the current thread with a exit code. + * + * This function is implicitly called when the thread entry point returns. + */ void OSExitThread(int32_t result); + +/** + * Get the next and previous thread in the thread's active queue. + */ void OSGetActiveThreadLink(OSThread *thread, OSThreadLink *link); + +/** + * Return pointer to OSThread object for the current thread. + */ OSThread * OSGetCurrentThread(); + +/** + * Returns the default thread for a specific core. + * + * Each core has 1 default thread created before the game boots. The default + * thread for core 1 calls the RPX entry point, the default threads for core 0 + * and 2 are suspended and can be used with OSRunThread. + */ OSThread * OSGetDefaultThread(uint32_t coreID); + +/** + * Return current stack pointer, value of r1 register. + */ uint32_t OSGetStackPointer(); + +/** + * Get a thread's affinity. + */ uint32_t OSGetThreadAffinity(OSThread *thread); + +/** + * Get a thread's name. + */ const char * OSGetThreadName(OSThread *thread); + +/** + * Get a thread's base priority. + */ int32_t OSGetThreadPriority(OSThread *thread); + +/** + * Get a thread's specific value set by OSSetThreadSpecific. + */ uint32_t OSGetThreadSpecific(uint32_t id); + +/** + * Returns TRUE if a thread is suspended. + */ BOOL OSIsThreadSuspended(OSThread *thread); + +/** + * Returns TRUE if a thread is terminated. + */ BOOL OSIsThreadTerminated(OSThread *thread); + +/** + * Wait until thread is terminated. + * + * If the target thread is detached, returns FALSE. + * + * \param thread Thread to wait for + * \param threadResult Pointer to store thread exit value in. + * \returns Returns TRUE if thread has terminated, FALSE if thread is detached. + */ BOOL OSJoinThread(OSThread *thread, int *threadResult); -void -OSPrintCurrentThreadState(); +/** + * Resumes a thread. + * + * Decrements the thread's suspend counter, if the counter reaches 0 the thread + * is resumed. + * + * \returns Returns the previous value of the suspend counter. + */ int32_t OSResumeThread(OSThread *thread); + +/** + * Run a function on an already created thread. + * + * Can only be used on idle threads. + */ BOOL OSRunThread(OSThread *thread, OSThreadEntryPointFn entry, int argc, const char **argv); + +/** + * Set a thread's affinity. + */ BOOL OSSetThreadAffinity(OSThread *thread, uint32_t affinity); + +/** + * Set a thread's cancellation state. + * + * If the state is TRUE then the thread can be suspended or cancelled when + * OSTestThreadCancel is called. + */ BOOL OSSetThreadCancelState(BOOL state); + +/** + * Set the callback to be called just before a thread is terminated. + */ OSThreadCleanupCallbackFn OSSetThreadCleanupCallback(OSThread *thread, OSThreadCleanupCallbackFn callback); + +/** + * Set the callback to be called just after a thread is terminated. + */ OSThreadDeallocatorFn OSSetThreadDeallocator(OSThread *thread, OSThreadDeallocatorFn deallocator); + +/** + * Set a thread's name. + */ void OSSetThreadName(OSThread *thread, const char *name); + +/** + * Set a thread's priority. + */ BOOL OSSetThreadPriority(OSThread *thread, int32_t priority); + +/** + * Set a thread's run quantum. + * + * This is the maximum amount of time the thread can run for before being forced + * to yield. + */ BOOL OSSetThreadRunQuantum(OSThread *thread, uint32_t quantum); +/** + * Set a thread specific value. + * + * Can be read with OSGetThreadSpecific. + */ void OSSetThreadSpecific(uint32_t id, uint32_t value); + +/** + * Set thread stack usage tracking. + */ BOOL OSSetThreadStackUsage(OSThread *thread); + +/** + * Sleep the current thread and add it to a thread queue. + * + * Will sleep until the thread queue is woken with OSWakeupThread. + */ void OSSleepThread(OSThreadQueue *queue); + +/** + * Sleep the current thread for a period of time. + */ void OSSleepTicks(OSTime ticks); + +/** + * Suspend a thread. + * + * Increases a thread's suspend counter, if the counter is >0 then the thread is + * suspended. + * + * \returns Returns the thread's previous suspend counter value + */ uint32_t OSSuspendThread(OSThread *thread); + +/** + * Check to see if the current thread should be cancelled or suspended. + * + * This is implicitly called in: + * - OSLockMutex + * - OSTryLockMutex + * - OSUnlockMutex + * - OSAcquireSpinLock + * - OSTryAcquireSpinLock + * - OSTryAcquireSpinLockWithTimeout + * - OSReleaseSpinLock + * - OSCancelThread + */ void OSTestThreadCancel(); + +/** + * Wake up all threads in queue. + * + * Clears the thread queue. + */ void OSWakeupThread(OSThreadQueue *queue); + +/** + * Yield execution to waiting threads with same priority. + * + * This will never switch to a thread with a lower priority than the current + * thread. + */ void OSYieldThread(); + #ifdef __cplusplus } #endif diff --git a/rpl/libcoreinit/exports.h b/rpl/libcoreinit/exports.h index dbc4202..19a789c 100644 --- a/rpl/libcoreinit/exports.h +++ b/rpl/libcoreinit/exports.h @@ -218,7 +218,6 @@ EXPORT(OSGetThreadSpecific); EXPORT(OSIsThreadSuspended); EXPORT(OSIsThreadTerminated); EXPORT(OSJoinThread); -EXPORT(OSPrintCurrentThreadState); EXPORT(OSResumeThread); EXPORT(OSRunThread); EXPORT(OSSetThreadAffinity);