aboutsummaryrefslogtreecommitdiff
path: root/pthreads/sem_post.c
diff options
context:
space:
mode:
Diffstat (limited to 'pthreads/sem_post.c')
-rw-r--r--pthreads/sem_post.c88
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 */
+}