diff options
Diffstat (limited to 'pthreads/sem_post.c')
-rw-r--r-- | pthreads/sem_post.c | 88 |
1 files changed, 48 insertions, 40 deletions
diff --git a/pthreads/sem_post.c b/pthreads/sem_post.c index 34832527b..b495420bf 100644 --- a/pthreads/sem_post.c +++ b/pthreads/sem_post.c @@ -15,10 +15,11 @@ * * Pthreads-win32 - POSIX Threads Library for Win32 * Copyright(C) 1998 John E. Bossom - * Copyright(C) 1999,2005 Pthreads-win32 contributors - * - * Contact Email: rpj@callisto.canberra.edu.au - * + * Copyright(C) 1999,2012 Pthreads-win32 contributors + * + * Homepage1: http://sourceware.org/pthreads-win32/ + * Homepage2: http://sourceforge.net/projects/pthreads4w/ + * * The current list of contributors is contained * in the file CONTRIBUTORS included with the source * code distribution. The list can also be seen at the @@ -41,6 +42,10 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + #include "pthread.h" #include "semaphore.h" #include "implement.h" @@ -74,55 +79,58 @@ sem_post (sem_t * sem) */ { int result = 0; - sem_t s = *sem; - if (s == NULL) + if (NULL == sem || NULL == *sem) { result = EINVAL; } - else if ((result = pthread_mutex_lock (&s->lock)) == 0) - { - /* See sem_destroy.c - */ - if (*sem == NULL) - { - (void) pthread_mutex_unlock (&s->lock); - result = EINVAL; - return -1; - } - - if (s->value < SEM_VALUE_MAX) + else { -#if defined(NEED_SEM) - if (++s->value <= 0 - && !SetEvent(s->sem)) + sem_t s = *sem; + + if ((result = pthread_mutex_lock (&s->lock)) == 0) { - s->value--; - result = EINVAL; - } + /* + * See sem_destroy.c + */ + if (NULL == *sem /* don't test 's' here */) + { + result = EINVAL; + } + else + { + if (s->value < SEM_VALUE_MAX) + { +#if defined(NEED_SEM) + if (++s->value <= 0 + && !SetEvent(s->sem)) + { + s->value--; + result = EINVAL; + } #else - if (++s->value <= 0 - && !ReleaseSemaphore (s->sem, 1, NULL)) - { - s->value--; - result = EINVAL; - } + if (++s->value <= 0 + && !ReleaseSemaphore (s->sem, 1, NULL)) + { + s->value--; + result = EINVAL; + } #endif /* NEED_SEM */ + } + else + { + result = ERANGE; + } + } + (void) pthread_mutex_unlock (&s->lock); + } } - else - { - result = ERANGE; - } - - (void) pthread_mutex_unlock (&s->lock); - } if (result != 0) { - errno = result; + PTW32_SET_ERRNO(result); return -1; } return 0; - -} /* sem_post */ +} |