From 358e703c5c1a56fecf723d1413eda962938dcd4f Mon Sep 17 00:00:00 2001 From: deuce <> Date: Tue, 11 Feb 2003 09:33:49 +0000 Subject: [PATCH] Basic semaphore emulation and defines for GNU/Hurd --- src/xpdev/genwrap.c | 2 +- src/xpdev/genwrap.h | 2 ++ src/xpdev/sem.c | 45 ++++++++++++++++++++++++++++++++++++++++++ src/xpdev/sem.h | 10 ++++++++++ src/xpdev/threadwrap.h | 4 ++++ 5 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/xpdev/sem.c create mode 100644 src/xpdev/sem.h diff --git a/src/xpdev/genwrap.c b/src/xpdev/genwrap.c index 99e14075fd..03b3fb3cb0 100644 --- a/src/xpdev/genwrap.c +++ b/src/xpdev/genwrap.c @@ -123,7 +123,7 @@ void DLLCALL unix_beep(int freq, int dur) { static int console_fd=-1; -#if !defined(__OpenBSD__) +#if !defined(__OpenBSD__) && !defined(__GNU__) if(console_fd == -1) console_fd = open("/dev/console", O_NOCTTY); diff --git a/src/xpdev/genwrap.h b/src/xpdev/genwrap.h index e4111b21e9..47c850ad45 100644 --- a/src/xpdev/genwrap.h +++ b/src/xpdev/genwrap.h @@ -106,6 +106,8 @@ extern "C" { #define PLATFORM_DESC "Solaris" #elif defined(__sun__) #define PLATFORM_DESC "SunOS" +#elif defined(__gnu__) + #define PLATFORM_DESC "GNU/Hurd" #elif defined(__unix__) #define PLATFORM_DESC "Unix" #else diff --git a/src/xpdev/sem.c b/src/xpdev/sem.c new file mode 100644 index 0000000000..825653e603 --- /dev/null +++ b/src/xpdev/sem.c @@ -0,0 +1,45 @@ +#include <errno.h> +#include <stdlib.h> +#include <unistd.h> +#include "genwrap.h" +#include "sem.h" + +int sem_init(sem_t *sem, int pshared, unsigned int value) { + sem=malloc(sizeof(sem_t)); + if(sem==NULL) { + errno=ENOSPC; + return(-1); + } + if(pipe((int *)sem)) { + errno=EPERM; + return(-1); + } + return(0); +} + +int sem_destroy(sem_t *sem) { + close(sem->read); + close(sem->write); + sem=NULL; + return(0); +} + +int sem_post(sem_t *sem) { + if(sem==NULL) { + errno=EINVAL; + return(-1); + } + write(sem->write,"-",1)==1; + return(0); +} + +int sem_wait(sem_t *sem) { + char buf; + if(sem==NULL) { + errno=EINVAL; + return(-1); + } + while(read(sem->read,&buf,1)<1) + SLEEP(1); + return(0); +} diff --git a/src/xpdev/sem.h b/src/xpdev/sem.h new file mode 100644 index 0000000000..9dbdd9eb90 --- /dev/null +++ b/src/xpdev/sem.h @@ -0,0 +1,10 @@ +typedef struct { + int read; + int write; +} sem_t; + +int sem_init(sem_t *sem, int pshared, unsigned int value); +int sem_destroy(sem_t *sem); +int sem_post(sem_t *sem); +int sem_wait(sem_t *sem); + diff --git a/src/xpdev/threadwrap.h b/src/xpdev/threadwrap.h index accb941133..a72f5b0cbc 100644 --- a/src/xpdev/threadwrap.h +++ b/src/xpdev/threadwrap.h @@ -48,7 +48,11 @@ extern "C" { #if defined(__unix__) #include <pthread.h> /* POSIX threads and mutexes */ +#if defined(_NEED_SEM) + #include "sem.h" +#else #include <semaphore.h> /* POSIX semaphores */ +#endif ulong _beginthread(void( *start_address )( void * ) ,unsigned stack_size, void *arglist); -- GitLab