sem_getvalue patch revisited
Darik Horn
dajhorn@uwaterloo.ca
Fri Jun 28 15:18:00 GMT 2002
Sam Robb posted a semaphore getvalue patch on June 7th, 2002:
http://cygwin.com/ml/cygwin-patches/2002-q2/msg00339.html
I had been working on the same problem, but I produced a different
solution. Please see the attachment, which was written against 1.3.10-1
but also applies to 1.3.11-3 cleanly.
In particular, Rob's patch returns `(*sem)->currentvalue` directly from
inside the new __sem_ function, whereas my patch adds a GetValue method to
the semaphore class. (I was trying to follow the style of the existing
Cygwin semaphore.)
I am wondering whether Sam's patch is functionally equivalent to my own,
and whether one is more or less correct than the other.
[]
-------------- next part --------------
diff -ruN /usr/src/cygwin-1.3.10-1/winsup/cygwin/cygwin.din cygwin-1.3.10-1/winsup/cygwin/cygwin.din
--- /usr/src/cygwin-1.3.10-1/winsup/cygwin/cygwin.din 2002-01-19 12:45:46.000000000 -0500
+++ cygwin-1.3.10-1/winsup/cygwin/cygwin.din 2002-06-28 15:30:48.000000000 -0400
@@ -1207,6 +1207,7 @@
sem_wait
sem_trywait
sem_post
+sem_getvalue
sched_get_priority_max
sched_get_priority_min
sched_getparam
diff -ruN /usr/src/cygwin-1.3.10-1/winsup/cygwin/include/semaphore.h cygwin-1.3.10-1/winsup/cygwin/include/semaphore.h
--- /usr/src/cygwin-1.3.10-1/winsup/cygwin/include/semaphore.h 2001-03-21 11:06:22.000000000 -0500
+++ cygwin-1.3.10-1/winsup/cygwin/include/semaphore.h 2002-06-28 15:30:48.000000000 -0400
@@ -33,6 +33,7 @@
int sem_wait (sem_t * sem);
int sem_trywait (sem_t * sem);
int sem_post (sem_t * sem);
+ int sem_getvalue(sem_t * sem, int * value);
#ifdef __cplusplus
}
diff -ruN /usr/src/cygwin-1.3.10-1/winsup/cygwin/posix.sgml cygwin-1.3.10-1/winsup/cygwin/posix.sgml
--- /usr/src/cygwin-1.3.10-1/winsup/cygwin/posix.sgml 2001-08-25 21:41:57.000000000 -0400
+++ cygwin-1.3.10-1/winsup/cygwin/posix.sgml 2002-06-28 15:30:48.000000000 -0400
@@ -52,7 +52,7 @@
</para></sect2>
<sect2><title>Synchronization (Section 11) </title><para>
-sem_init, sem_destroy, sem_wait, sem_trywait, sem_post,
+sem_init, sem_destroy, sem_wait, sem_trywait, sem_post, sem_getvalue
pthread_mutex_init, pthread_mutex_destroy, pthread_mutex_lock,
pthread_mutex_trylock, pthread_mutex_unlock
diff -ruN /usr/src/cygwin-1.3.10-1/winsup/cygwin/pthread.cc cygwin-1.3.10-1/winsup/cygwin/pthread.cc
--- /usr/src/cygwin-1.3.10-1/winsup/cygwin/pthread.cc 2001-10-05 01:05:09.000000000 -0400
+++ cygwin-1.3.10-1/winsup/cygwin/pthread.cc 2002-06-28 15:30:48.000000000 -0400
@@ -476,4 +476,10 @@
return __sem_post (sem);
}
+int
+sem_getvalue (sem_t * sem, int * value)
+{
+ return __sem_post (sem);
}
+
+} /* extern */
diff -ruN /usr/src/cygwin-1.3.10-1/winsup/cygwin/thread.cc cygwin-1.3.10-1/winsup/cygwin/thread.cc
--- /usr/src/cygwin-1.3.10-1/winsup/cygwin/thread.cc 2002-01-08 00:16:29.000000000 -0500
+++ cygwin-1.3.10-1/winsup/cygwin/thread.cc 2002-06-28 15:30:48.000000000 -0400
@@ -793,6 +793,12 @@
}
void
+semaphore::GetValue (long * value)
+{
+ *value = currentvalue;
+}
+
+void
semaphore::Post ()
{
/* we can't use the currentvalue, because the wait functions don't let us access it */
@@ -2238,4 +2244,14 @@
return 0;
}
+int
+__sem_getvalue (sem_t *sem, long *value)
+{
+ if (verifyable_object_isvalid (sem, SEM_MAGIC) != VALID_OBJECT)
+ return EINVAL;
+
+ (*sem)->GetValue (value);
+ return 0;
+}
+
#endif // MT_SAFE
diff -ruN /usr/src/cygwin-1.3.10-1/winsup/cygwin/thread.h cygwin-1.3.10-1/winsup/cygwin/thread.h
--- /usr/src/cygwin-1.3.10-1/winsup/cygwin/thread.h 2002-02-19 22:25:01.000000000 -0500
+++ cygwin-1.3.10-1/winsup/cygwin/thread.h 2002-06-28 15:33:54.000000000 -0400
@@ -336,6 +336,7 @@
class semaphore * next;
int shared;
long currentvalue;
+ void GetValue (long * value);
void Wait ();
void Post ();
int TryWait ();
diff -ruN /usr/src/cygwin-1.3.10-1/winsup/doc/calls.texinfo cygwin-1.3.10-1/winsup/doc/calls.texinfo
--- /usr/src/cygwin-1.3.10-1/winsup/doc/calls.texinfo 2000-07-21 19:28:23.000000000 -0400
+++ cygwin-1.3.10-1/winsup/doc/calls.texinfo 2002-06-28 15:30:48.000000000 -0400
@@ -422,7 +422,7 @@
@item pthread_mutex_unlock: P96 11.3.3.1
@item sem_close: P96 11.2.4.1 -- unimplemented
@item sem_destroy: P96 11.2.2.1
-@item sem_getvalue: P96 11.2.8.1 -- unimplemented
+@item sem_getvalue: P96 11.2.8.1
@item sem_init: P96 11.2.1.1
@item sem_open: P96 11.2.3.1 -- unimplemented
@item sem_post: P96 11.2.7.1
More information about the Cygwin-patches
mailing list