Index: cygwin/thread.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/thread.cc,v retrieving revision 1.225 diff -u -p -r1.225 thread.cc --- cygwin/thread.cc 6 Apr 2010 15:27:34 -0000 1.225 +++ cygwin/thread.cc 28 Mar 2011 21:46:56 -0000 @@ -3076,10 +3076,16 @@ semaphore::init (sem_t *sem, int pshared { /* opengroup calls this undefined */ if (is_good_object (sem)) - return EBUSY; + { + set_errno(EBUSY); + return -1; + } if (value > SEM_VALUE_MAX) - return EINVAL; + { + set_errno(EINVAL); + return -1; + } *sem = new semaphore (pshared, value); @@ -3087,7 +3093,8 @@ semaphore::init (sem_t *sem, int pshared { delete (*sem); *sem = NULL; - return EAGAIN; + set_errno(EAGAIN); + return -1; } return 0; } @@ -3096,11 +3103,17 @@ int semaphore::destroy (sem_t *sem) { if (!is_good_object (sem)) - return EINVAL; + { + set_errno(EINVAL); + return -1; + } /* It's invalid to destroy a semaphore not opened with sem_init. */ if ((*sem)->fd != -1) - return EINVAL; + { + set_errno(EINVAL); + return -1; + } /* FIXME - new feature - test for busy against threads... */ @@ -3113,11 +3126,17 @@ int semaphore::close (sem_t *sem) { if (!is_good_object (sem)) - return EINVAL; + { + set_errno(EINVAL); + return -1; + } /* It's invalid to close a semaphore not opened with sem_open. */ if ((*sem)->fd == -1) - return EINVAL; + { + set_errno(EINVAL); + return -1; + } delete (*sem); delete sem; Index: cygwin/thread.h =================================================================== RCS file: /cvs/src/src/winsup/cygwin/thread.h,v retrieving revision 1.114 diff -u -p -r1.114 thread.h --- cygwin/thread.h 22 Feb 2010 20:36:04 -0000 1.114 +++ cygwin/thread.h 28 Mar 2011 21:46:56 -0000 @@ -21,6 +21,7 @@ details. */ #include #include "security.h" #include +#include "cygerrno.h" enum cw_sig_wait { @@ -641,6 +642,7 @@ public: } static void terminate () { + save_errno save; semaphores.for_each (&semaphore::_terminate); }