diff --git a/src/xpdev/semwrap.c b/src/xpdev/semwrap.c index 4f22d479266706aab621e60cf259eb6c2dce052e..a489162dd7d6fe196c04c9dbd6d7050eeda512f5 100644 --- a/src/xpdev/semwrap.c +++ b/src/xpdev/semwrap.c @@ -59,4 +59,52 @@ sem_trywait_block(sem_t *sem, unsigned long timeout) errno=EAGAIN; return retval; } + +#elif defined(_WIN32) + +#include <limits.h> /* INT_MAX */ + +#if defined(__BORLANDC__) + #pragma argsused #endif +int sem_init(sem_t* psem, int pshared, unsigned int value) +{ + + if((*(psem)=CreateSemaphore(NULL,value,INT_MAX,NULL))==NULL) + return -1; + + return 0; +} + +int sem_trywait_block(sem_t* psem, unsigned long timeout) +{ + if(WaitForSingleObject(*(psem),timeout)!=WAIT_OBJECT_0) { + errno=EAGAIN; + return -1; + } + + return 0; +} + +int sem_post(sem_t* psem) +{ + if(ReleaseSemaphore(*(psem),1,NULL)==TRUE) + return 0; + + return -1; +} + +int sem_getvalue(sem_t* psem, int* vp) +{ + ReleaseSemaphore(*(psem),0,(LPLONG)vp); + return 0; +} + +int sem_destroy(sem_t* psem) +{ + if(CloseHandle(*(psem))==TRUE) + return 0; + return -1; +} + +#endif /* _WIN32 */ diff --git a/src/xpdev/semwrap.h b/src/xpdev/semwrap.h index 2c25eaff079a853c7a410544d74bff77e81f74d7..2220d72b2fa87de55062316b6ac7a0ed1392437d 100644 --- a/src/xpdev/semwrap.h +++ b/src/xpdev/semwrap.h @@ -61,28 +61,18 @@ extern "C" { #include <semaphore.h> /* POSIX semaphores */ #endif - /* NOT POSIX */ - int sem_trywait_block(sem_t *sem, unsigned long timeout); - #elif defined(_WIN32) #include <process.h> /* _beginthread */ - #include <limits.h> /* INT_MAX */ - #include <errno.h> /* EAGAIN and EBUSY */ /* POSIX semaphores */ typedef HANDLE sem_t; - #define sem_init(psem,ps,v) *(psem)=CreateSemaphore(NULL,v,INT_MAX,NULL),*(psem)==NULL?-1:0 - - /* NOT POSIX */ - #define sem_trywait_block(psem,t) (WaitForSingleObject(*(psem),t)==WAIT_OBJECT_0?0:(errno=EAGAIN,-1)) - - /* POSIX */ + int sem_init(sem_t*, int pshared, unsigned int value); + int sem_post(sem_t*); + int sem_getvalue(sem_t*, int* value); + int sem_destroy(sem_t*); #define sem_wait(psem) sem_trywait_block(psem,INFINITE) #define sem_trywait(psem) sem_trywait_block(psem,0) - #define sem_post(psem) (ReleaseSemaphore(*(psem),1,NULL)==TRUE?0:-1) - #define sem_destroy(psem) (CloseHandle(*(psem))==TRUE?0:-1) - #define sem_getvalue(psem,val) ReleaseSemaphore(*(psem),0,(LPLONG)val) #elif defined(__OS2__) /* These have *not* been tested! */ @@ -99,6 +89,10 @@ extern "C" { #endif +/* NOT POSIX */ +int sem_trywait_block(sem_t* psem, unsigned long timeout); + + /* Change semaphore to "unsignaled" (NOT POSIX) */ #define sem_reset(psem) while(sem_trywait(psem)==0) diff --git a/src/xpdev/xpdev_mt.dsp b/src/xpdev/xpdev_mt.dsp index 631a35ff70d352c8e73d80e82aa3e0b29b4c1897..bb12dfae0d677e9f9ca9e403dd88505ef02f96b1 100644 --- a/src/xpdev/xpdev_mt.dsp +++ b/src/xpdev/xpdev_mt.dsp @@ -106,6 +106,10 @@ SOURCE=.\msg_queue.c # End Source File # Begin Source File +SOURCE=.\semwrap.c +# End Source File +# Begin Source File + SOURCE=.\sockwrap.c # End Source File # Begin Source File