+ threadExit(0);
+}
+
+static inline int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr) {
+ LightLock_Init(mutex);
+ return 0;
+}
+
+static inline int pthread_mutex_lock(pthread_mutex_t *mutex) {
+ LightLock_Lock(mutex);
+ return 0;
+}
+
+static inline int pthread_mutex_unlock(pthread_mutex_t *mutex) {
+ LightLock_Unlock(mutex);
+ return 0;
+}
+
+static inline int pthread_mutex_destroy(pthread_mutex_t *mutex) {
+ return 0;
+}
+
+static inline int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr) {
+ cond_t *cond_data = calloc(1, sizeof(cond_t));
+ if (!cond_data)
+ goto error;
+
+ if (svcCreateSemaphore(&cond_data->semaphore, 0, 1))
+ goto error;
+
+ LightLock_Init(&cond_data->lock);
+ cond_data->waiting = 0;
+ *cond = cond_data;
+ return 0;
+
+ error:
+ svcCloseHandle(cond_data->semaphore);
+ if (cond_data)
+ free(cond_data);
+ return -1;
+}
+
+static inline int pthread_cond_signal(pthread_cond_t *cond) {
+ int32_t count;
+ cond_t *cond_data = (cond_t *)*cond;
+ LightLock_Lock(&cond_data->lock);
+ if (cond_data->waiting) {
+ cond_data->waiting--;
+ svcReleaseSemaphore(&count, cond_data->semaphore, 1);
+ }
+ LightLock_Unlock(&cond_data->lock);
+ return 0;
+}
+
+static inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *lock) {
+ cond_t *cond_data = (cond_t *)*cond;
+ LightLock_Lock(&cond_data->lock);
+ cond_data->waiting++;
+ LightLock_Unlock(lock);
+ LightLock_Unlock(&cond_data->lock);
+ svcWaitSynchronization(cond_data->semaphore, INT64_MAX);
+ LightLock_Lock(lock);
+ return 0;
+}
+
+static inline int pthread_cond_destroy(pthread_cond_t *cond) {
+ if (*cond) {
+ cond_t *cond_data = (cond_t *)*cond;
+
+ svcCloseHandle(cond_data->semaphore);
+ free(*cond);
+ }
+ *cond = 0;
+ return 0;