1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 00:47:45 +00:00

LibPthread: Implement semaphore functions

This commit is contained in:
Gunnar Beutner 2021-04-14 04:29:39 +02:00 committed by Andreas Kling
parent f2ff8f2658
commit ea6d0aa1d4
4 changed files with 73 additions and 15 deletions

View file

@ -24,7 +24,6 @@ set(LIBC_SOURCES
qsort.cpp qsort.cpp
scanf.cpp scanf.cpp
sched.cpp sched.cpp
semaphore.cpp
serenity.cpp serenity.cpp
signal.cpp signal.cpp
spawn.cpp spawn.cpp

View file

@ -1,6 +1,7 @@
set(SOURCES set(SOURCES
pthread.cpp pthread.cpp
pthread_once.cpp pthread_once.cpp
semaphore.cpp
) )
serenity_libc(LibPthread pthread) serenity_libc(LibPthread pthread)

View file

@ -25,41 +25,94 @@
*/ */
#include <AK/Assertions.h> #include <AK/Assertions.h>
#include <errno.h>
#include <semaphore.h> #include <semaphore.h>
int sem_close(sem_t*) int sem_close(sem_t*)
{ {
VERIFY_NOT_REACHED(); errno = ENOSYS;
return -1;
} }
int sem_destroy(sem_t*)
int sem_destroy(sem_t* sem)
{ {
VERIFY_NOT_REACHED(); pthread_mutex_destroy(&sem->mtx);
pthread_cond_destroy(&sem->cv);
return 0;
} }
int sem_getvalue(sem_t*, int*) int sem_getvalue(sem_t*, int*)
{ {
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }
int sem_init(sem_t*, int, unsigned int)
int sem_init(sem_t* sem, int shared, unsigned int value)
{ {
VERIFY_NOT_REACHED(); if (shared)
return ENOSYS;
if (pthread_mutex_init(&sem->mtx, nullptr) != 0)
return -1;
if (pthread_cond_init(&sem->cv, nullptr) != 0)
return -1;
sem->value = value;
return 0;
} }
sem_t* sem_open(const char*, int, ...) sem_t* sem_open(const char*, int, ...)
{ {
VERIFY_NOT_REACHED(); errno = ENOSYS;
return nullptr;
} }
int sem_post(sem_t*)
int sem_post(sem_t* sem)
{ {
VERIFY_NOT_REACHED(); sem->value++;
pthread_cond_signal(&sem->cv);
pthread_mutex_unlock(&sem->mtx);
return 0;
} }
int sem_trywait(sem_t*)
int sem_trywait(sem_t* sem)
{ {
VERIFY_NOT_REACHED(); if (pthread_mutex_lock(&sem->mtx) != 0)
return -1;
if (sem->value == 0) {
pthread_mutex_unlock(&sem->mtx);
errno = EAGAIN;
return -1;
}
sem->value--;
return 0;
} }
int sem_unlink(const char*) int sem_unlink(const char*)
{ {
VERIFY_NOT_REACHED(); return ENOSYS;
} }
int sem_wait(sem_t*)
int sem_wait(sem_t* sem)
{ {
VERIFY_NOT_REACHED(); if (pthread_mutex_lock(&sem->mtx) != 0)
return -1;
while (sem->value == 0) {
if (pthread_cond_wait(&sem->cv, &sem->mtx) != 0) {
pthread_mutex_unlock(&sem->mtx);
return -1;
}
}
sem->value--;
return 0;
} }

View file

@ -26,12 +26,17 @@
#pragma once #pragma once
#include <pthread.h>
#include <sys/cdefs.h> #include <sys/cdefs.h>
#include <sys/types.h> #include <sys/types.h>
__BEGIN_DECLS __BEGIN_DECLS
typedef int sem_t; typedef struct {
pthread_mutex_t mtx;
pthread_cond_t cv;
int value;
} sem_t;
int sem_close(sem_t*); int sem_close(sem_t*);
int sem_destroy(sem_t*); int sem_destroy(sem_t*);