summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrpj <rpj>1998-07-26 14:49:34 +0000
committerrpj <rpj>1998-07-26 14:49:34 +0000
commit537fe68bc5ca2dd75f4f54146a50a39c5b55b8e3 (patch)
tree25adc4da03898e307d43f8dcc3450b3b5260c867
parent779359d2cf050c2885a05b81774b87b82466a471 (diff)
Mon Jul 27 00:20:37 1998 Ross Johnson <rpj@ixobrychus.canberra.edu.au>
* private.c (_pthread_delete_thread_entry): Destroy the thread entry attribute object before deleting the thread entry itself. * attr.c (pthread_attr_init): Initialise cancel_pending = FALSE. (pthread_attr_setdetachstate): Rename "detached" to "detachedstate". (pthread_attr_getdetachstate): Ditto. * exit.c (_pthread_exit): Fix incorrect check for detachedstate. * implement.h (_pthread_call_t): Remove env member.
-rw-r--r--ChangeLog13
-rw-r--r--attr.c9
-rw-r--r--exit.c3
-rw-r--r--implement.h3
-rw-r--r--private.c3
5 files changed, 23 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 4f882d5..37a1c9c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+Mon Jul 27 00:20:37 1998 Ross Johnson <rpj@ixobrychus.canberra.edu.au>
+
+ * private.c (_pthread_delete_thread_entry): Destroy the thread
+ entry attribute object before deleting the thread entry itself.
+
+ * attr.c (pthread_attr_init): Initialise cancel_pending = FALSE.
+ (pthread_attr_setdetachstate): Rename "detached" to "detachedstate".
+ (pthread_attr_getdetachstate): Ditto.
+
+ * exit.c (_pthread_exit): Fix incorrect check for detachedstate.
+
+ * implement.h (_pthread_call_t): Remove env member.
+
Sun Jul 26 13:06:12 1998 Ross Johnson <rpj@ixobrychus.canberra.edu.au>
* implement.h (_pthread_new_thread_entry): Fix prototype.
diff --git a/attr.c b/attr.c
index 65c00a0..03c254b 100644
--- a/attr.c
+++ b/attr.c
@@ -100,13 +100,14 @@ pthread_attr_init(pthread_attr_t *attr)
attr->cancelstate = PTHREAD_CANCEL_ENABLE;
attr->canceltype = PTHREAD_CANCEL_DEFERRED;
+ attr->cancel_pending = FALSE;
attr->detachedstate = PTHREAD_CREATE_JOINABLE;
memset(&(attr->sigmask), 0, sizeof(sigset_t));
/* Priority uses Win32 priority values. */
int priority = THREAD_PRIORITY_NORMAL;
- attr->valid = 0;
+ attr->valid = _PTHREAD_ATTR_VALID;
return 0;
}
@@ -120,7 +121,7 @@ pthread_attr_destroy(pthread_attr_t *attr)
}
/* Set the attribute object to a specific invalid value. */
- attr->valid = _PTHREAD_ATTR_INVALID;
+ attr->valid = 0;
return 0;
}
@@ -134,7 +135,7 @@ pthread_attr_getdetachstate(const pthread_attr_t *attr,
return EINVAL;
}
- *detachstate = attr->detached;
+ *detachstate = attr->detachedstate;
return 0;
}
@@ -153,6 +154,6 @@ pthread_attr_setdetachstate(pthread_attr_t *attr,
return EINVAL;
}
- attr->detached = detachstate;
+ attr->detachedstate = detachstate;
return 0;
}
diff --git a/exit.c b/exit.c
index 429dfd2..4d0f42c 100644
--- a/exit.c
+++ b/exit.c
@@ -55,7 +55,8 @@ _pthread_exit(void * value, int return_code)
be deleted by the last waiting pthread_join() after this thread
has terminated. */
- if (us->detach == TRUE
+ if (pthread_attr_getdetachedstate(us, &detachstate) == 0
+ && detachstate == PTHREAD_CREATE_DETACHED
&& us->join_count == 0)
{
_pthread_delete_thread_entry(us);
diff --git a/implement.h b/implement.h
index 5cc0de6..e830293 100644
--- a/implement.h
+++ b/implement.h
@@ -20,7 +20,7 @@
enum { _PTHREAD_HANDLER_POP_LIFO, _PTHREAD_HANDLER_POP_FIFO };
/* Special value to mark attribute objects as valid. */
-#define _PTHREAD_ATTR_INVALID 0xC0FFEE
+#define _PTHREAD_ATTR_VALID 0xC0FFEE
/* General description of a handler function on a stack. */
typedef struct _pthread_handler_node _pthread_handler_node_t;
@@ -35,7 +35,6 @@ struct _pthread_handler_node {
typedef struct {
unsigned (*routine)(void *);
void * arg;
- jmpbuf env;
} _pthread_call_t;
/* Macro to return the address of the thread entry of the calling thread. */
diff --git a/private.c b/private.c
index cee84e9..8424277 100644
--- a/private.c
+++ b/private.c
@@ -109,8 +109,9 @@ _pthread_delete_thread_entry(_pthread_threads_thread_t * entry)
if (entry->thread != NULL)
{
+ pthread_attr_destroy(&(entry->attr));
entry->thread = NULL;
-
+
if (_pthread_threads_count > 0)
{
_pthread_threads_count--;