summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbje <bje>1998-07-24 12:06:28 +0000
committerbje <bje>1998-07-24 12:06:28 +0000
commit44a56b7d9a229b18b9f9886888eb344ee3f1ff99 (patch)
tree7d04b7e2105cc9363746b1cb74babc33a54c2323
parent21e7d43d69e592cf909e4ae66971fc387b3bfc3b (diff)
1998-07-24 Ben Elliston <bje@cygnus.com>
* pthread.h (SIG_BLOCK): Define if not already defined. (SIG_UNBLOCK): Likewise. (SIG_SETMASK): Likewise. (pthread_attr_t): Add signal mask member. (pthread_sigmask): Add function prototype. * signal.c (pthread_sigmask): Implement. * create.c: #include <string.h> to get a prototype for memcpy(). (pthread_create): New threads inherit their creator's signal mask. Copy the signal mask to the new thread structure.
-rw-r--r--ChangeLog16
-rw-r--r--create.c3
-rw-r--r--pthread.h26
-rw-r--r--signal.c65
4 files changed, 110 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index bd2acf9..a7109c8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+1998-07-24 Ben Elliston <bje@cygnus.com>
+
+ * pthread.h (SIG_BLOCK): Define if not already defined.
+ (SIG_UNBLOCK): Likewise.
+ (SIG_SETMASK): Likewise.
+ (pthread_attr_t): Add signal mask member.
+ (pthread_sigmask): Add function prototype.
+
+ * signal.c (pthread_sigmask): Implement.
+
+ * create.c: #include <string.h> to get a prototype for memcpy().
+ (pthread_create): New threads inherit their creator's signal
+ mask. Copy the signal mask to the new thread structure.
+
+
+
Fri Jul 24 16:33:17 1998 Ross Johnson <rpj@swan.canberra.edu.au>
* fork.c (pthread_atfork): Add all the necessary push calls.
diff --git a/create.c b/create.c
index 45b1570..e8fd1c1 100644
--- a/create.c
+++ b/create.c
@@ -8,6 +8,8 @@
#include <windows.h>
#include <process.h>
+#include <string.h>
+
#include "pthread.h"
#include "implement.h"
@@ -84,6 +86,7 @@ pthread_create(pthread_t *thread,
attr_copy->canceltype = attr->canceltype;
attr_copy->detached = attr->detached;
attr_copy->priority = attr->priority;
+ memcpy(attr_copy.sigmask, attr.sigmask, sizeof(sigset_t));
}
/* Start running, not suspended. */
diff --git a/pthread.h b/pthread.h
index 8f6fdc5..43b9594 100644
--- a/pthread.h
+++ b/pthread.h
@@ -22,6 +22,22 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifndef _PTHREADS_H
#define _PTHREADS_H
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif /* HAVE_SIGNAL_H */
+
+#ifndef SIG_BLOCK
+#define SIG_BLOCK 0
+#endif /* SIG_BLOCK */
+
+#ifndef SIG_UNBLOCK
+#define SIG_BLOCK 1
+#endif /* SIG_UNBLOCK */
+
+#ifndef SIG_SETMASK
+#define SIG_SETMASK 2
+#endif /* SIG_SETMASK */
+
#define PTHREAD_THREADS_MAX 128
#define PTHREAD_STACK_MIN 65535
@@ -72,6 +88,10 @@ typedef struct {
int canceltype; /* PTHREAD_CANCEL_ASYNCHRONOUS
PTHREAD_CANCEL_DEFERRED */
+#ifdef HAVE_SIGSET_T
+ sigset_t sigmask;
+#endif /* HAVE_SIGSET_T */
+
int priority;
} pthread_attr_t;
@@ -243,6 +263,12 @@ void *pthread_getspecific(pthread_key_t key);
int pthread_key_delete(pthread_key_t key);
+/* Signal handling. */
+
+int pthread_sigmask(int how,
+ const sigset_t *set,
+ sigset_t *oset);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/signal.c b/signal.c
new file mode 100644
index 0000000..e0a41ca
--- /dev/null
+++ b/signal.c
@@ -0,0 +1,65 @@
+/*
+ * signal.c
+ *
+ * Description:
+ * POSIX thread-aware signal functions.
+ */
+
+#include "pthread.h"
+
+int
+pthread_sigmask(int how, const sigset_t *set, sigset_t *oset)
+{
+ /* Validate the `how' argument.*/
+ if (set != NULL)
+ {
+ switch (how)
+ {
+ case SIG_BLOCK:
+ break;
+ case SIG_UNBLOCK:
+ break;
+ case SIG_SETMASK:
+ break;
+ default:
+ /* Invalid `how' argument. */
+ return EINVAL;
+ }
+ }
+
+ /* Copy the old mask before modifying it. */
+ if (oset != NULL)
+ {
+ memcpy(oset, this->attr->sigmask, sizeof(sigset_t));
+ }
+
+ if (set != NULL)
+ {
+ int i;
+ unsigned long *src = set;
+ unsigned long *dest = this->attr->sigmask;
+
+ switch (how)
+ {
+ case SIG_BLOCK:
+ for (i = 0; i < (sizeof(sigset_t) / sizeof(unsigned long)); i++)
+ {
+ /* OR the bit field longword-wise. */
+ *src++ |= *dest++;
+ }
+ break;
+ case SIG_UNBLOCK:
+ for (i = 0; i < (sizeof(sigset_t) / sizeof(unsigned long)); i++)
+ {
+ /* XOR the bitfield longword-wise. */
+ *src++ ^= *dest++;
+ }
+ case SIG_SET:
+ /* Replace the whole sigmask. */
+ memcpy(this->attr.sigmask, set, sizeof(sigset_t));
+ break;
+ }
+ }
+
+ return 0;
+}