2002-09-21 Robert Collins <rbtcollins@hotmail.com>
* thread.cc: Partial refactoring of pthread_key destructor handling. Loosely based on Thomas Pfaff's work. (pthread_key_destructor_list::Insert): Remove. (pthread_key_destructor_list::Pop): Remove. (pthread_key_destructor_list::IterateNull): Call the key's run_destructor method. (pthread_key::pthread_key): Initialize new member. (pthread_key::get): Mark as const for correctness. (pthread_key::run_destructor): Implement. * thread.h (pthread_key::get): Mark as const for correctness. (pthread_key::run_destructor): Declare. (List): New template class that implements a generic list. (pthread_key_destructor_list): Inherit from List, and remove now duplicate functions.
This commit is contained in:
parent
8b1978c30c
commit
20b94ee904
|
@ -1,3 +1,20 @@
|
||||||
|
2002-09-21 Robert Collins <rbtcollins@hotmail.com>
|
||||||
|
|
||||||
|
* thread.cc: Partial refactoring of pthread_key destructor
|
||||||
|
handling. Loosely based on Thomas Pfaff's work.
|
||||||
|
(pthread_key_destructor_list::Insert): Remove.
|
||||||
|
(pthread_key_destructor_list::Pop): Remove.
|
||||||
|
(pthread_key_destructor_list::IterateNull): Call the key's
|
||||||
|
run_destructor method.
|
||||||
|
(pthread_key::pthread_key): Initialize new member.
|
||||||
|
(pthread_key::get): Mark as const for correctness.
|
||||||
|
(pthread_key::run_destructor): Implement.
|
||||||
|
* thread.h (pthread_key::get): Mark as const for correctness.
|
||||||
|
(pthread_key::run_destructor): Declare.
|
||||||
|
(List): New template class that implements a generic list.
|
||||||
|
(pthread_key_destructor_list): Inherit from List, and remove
|
||||||
|
now duplicate functions.
|
||||||
|
|
||||||
2002-09-21 Robert Collins <rbtcollins@hotmail.com>
|
2002-09-21 Robert Collins <rbtcollins@hotmail.com>
|
||||||
|
|
||||||
* thread.cc: Change verifyable_object_isvalid calls with
|
* thread.cc: Change verifyable_object_isvalid calls with
|
||||||
|
|
|
@ -73,16 +73,6 @@ pthread_key_destructor::Next ()
|
||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
pthread_key_destructor_list::Insert (pthread_key_destructor *node)
|
|
||||||
{
|
|
||||||
if (!node)
|
|
||||||
return;
|
|
||||||
head = node->InsertAfter (head);
|
|
||||||
if (!head)
|
|
||||||
head = node; /*first node special case */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*remove a given dataitem, wherever in the list it is */
|
/*remove a given dataitem, wherever in the list it is */
|
||||||
pthread_key_destructor *
|
pthread_key_destructor *
|
||||||
pthread_key_destructor_list::Remove (pthread_key *key)
|
pthread_key_destructor_list::Remove (pthread_key *key)
|
||||||
|
@ -103,15 +93,6 @@ pthread_key_destructor_list::Remove (pthread_key *key)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*get the first item and remove at the same time */
|
|
||||||
pthread_key_destructor *
|
|
||||||
pthread_key_destructor_list::Pop ()
|
|
||||||
{
|
|
||||||
pthread_key_destructor *temp = head;
|
|
||||||
head = head->Next ();
|
|
||||||
return temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_key_destructor::
|
pthread_key_destructor::
|
||||||
pthread_key_destructor (void (*thedestructor) (void *), pthread_key *key)
|
pthread_key_destructor (void (*thedestructor) (void *), pthread_key *key)
|
||||||
{
|
{
|
||||||
|
@ -126,7 +107,7 @@ pthread_key_destructor_list::IterateNull ()
|
||||||
pthread_key_destructor *temp = head;
|
pthread_key_destructor *temp = head;
|
||||||
while (temp)
|
while (temp)
|
||||||
{
|
{
|
||||||
temp->destructor ((temp->key)->get ());
|
temp->key->run_destructor ();
|
||||||
temp = temp->Next ();
|
temp = temp->Next ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1056,7 +1037,7 @@ pthread_key::isGoodObject (pthread_key_t const *key)
|
||||||
|
|
||||||
/* non-static members */
|
/* non-static members */
|
||||||
|
|
||||||
pthread_key::pthread_key (void (*destructor) (void *)):verifyable_object (PTHREAD_KEY_MAGIC)
|
pthread_key::pthread_key (void (*aDestructor) (void *)):verifyable_object (PTHREAD_KEY_MAGIC), destructor (aDestructor)
|
||||||
{
|
{
|
||||||
dwTlsIndex = TlsAlloc ();
|
dwTlsIndex = TlsAlloc ();
|
||||||
if (dwTlsIndex == TLS_OUT_OF_INDEXES)
|
if (dwTlsIndex == TLS_OUT_OF_INDEXES)
|
||||||
|
@ -1098,7 +1079,7 @@ pthread_key::set (const void *value)
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
pthread_key::get ()
|
pthread_key::get () const
|
||||||
{
|
{
|
||||||
int savedError = ::GetLastError();
|
int savedError = ::GetLastError();
|
||||||
void *result = TlsGetValue (dwTlsIndex);
|
void *result = TlsGetValue (dwTlsIndex);
|
||||||
|
@ -1121,6 +1102,13 @@ pthread_key::recreateKeyFromBuffer ()
|
||||||
set (fork_buf);
|
set (fork_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pthread_key::run_destructor () const
|
||||||
|
{
|
||||||
|
if (destructor)
|
||||||
|
destructor (get());
|
||||||
|
}
|
||||||
|
|
||||||
/*pshared mutexs:
|
/*pshared mutexs:
|
||||||
|
|
||||||
* REMOVED FROM CURRENT. These can be reinstated with the daemon, when all the
|
* REMOVED FROM CURRENT. These can be reinstated with the daemon, when all the
|
||||||
|
|
|
@ -183,7 +183,8 @@ public:
|
||||||
class pthread_key *next;
|
class pthread_key *next;
|
||||||
|
|
||||||
int set (const void *);
|
int set (const void *);
|
||||||
void *get ();
|
void *get () const;
|
||||||
|
void run_destructor () const;
|
||||||
|
|
||||||
pthread_key (void (*)(void *));
|
pthread_key (void (*)(void *));
|
||||||
~pthread_key ();
|
~pthread_key ();
|
||||||
|
@ -194,8 +195,53 @@ private:
|
||||||
static pthread_key * keys;
|
static pthread_key * keys;
|
||||||
void saveKeyToBuffer ();
|
void saveKeyToBuffer ();
|
||||||
void recreateKeyFromBuffer ();
|
void recreateKeyFromBuffer ();
|
||||||
|
void (*destructor) (void *);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* interface */
|
||||||
|
template <class ListNode> class List {
|
||||||
|
public:
|
||||||
|
void Insert (ListNode *aNode);
|
||||||
|
ListNode *Remove ( ListNode *aNode);
|
||||||
|
ListNode *Pop ();
|
||||||
|
protected:
|
||||||
|
ListNode *head;
|
||||||
|
};
|
||||||
|
/* implementation */
|
||||||
|
template <class ListNode> void
|
||||||
|
List<ListNode>::Insert (ListNode *aNode)
|
||||||
|
{
|
||||||
|
if (!aNode)
|
||||||
|
return;
|
||||||
|
head = aNode->InsertAfter (head);
|
||||||
|
if (!head)
|
||||||
|
head = aNode; /*first node special case */
|
||||||
|
}
|
||||||
|
template <class ListNode> ListNode *
|
||||||
|
List<ListNode>::Remove ( ListNode *aNode)
|
||||||
|
{
|
||||||
|
if (!aNode)
|
||||||
|
return NULL;
|
||||||
|
if (!head)
|
||||||
|
return NULL;
|
||||||
|
if (aNode == head)
|
||||||
|
return Pop ();
|
||||||
|
ListNode *resultPrev = head;
|
||||||
|
while (resultPrev && resultPrev->Next() && !(aNode == resultPrev->Next()))
|
||||||
|
resultPrev = resultprev->Next();
|
||||||
|
if (resultPrev)
|
||||||
|
return resultPrev->UnlinkNext ();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
template <class ListNode> ListNode *
|
||||||
|
List<ListNode>::Pop ()
|
||||||
|
{
|
||||||
|
ListNode *result = head;
|
||||||
|
head = head->Next();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* FIXME: test using multiple inheritance and merging key_destructor into pthread_key
|
/* FIXME: test using multiple inheritance and merging key_destructor into pthread_key
|
||||||
* for efficiency */
|
* for efficiency */
|
||||||
class pthread_key_destructor
|
class pthread_key_destructor
|
||||||
|
@ -211,21 +257,13 @@ public:
|
||||||
pthread_key *key;
|
pthread_key *key;
|
||||||
};
|
};
|
||||||
|
|
||||||
class pthread_key_destructor_list
|
class pthread_key_destructor_list : public List<pthread_key_destructor>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void Insert (pthread_key_destructor * node);
|
|
||||||
/* remove a given dataitem, wherever in the list it is */
|
|
||||||
pthread_key_destructor *Remove (pthread_key_destructor * item);
|
|
||||||
/* get the first item and remove at the same time */
|
|
||||||
pthread_key_destructor *Pop ();
|
|
||||||
pthread_key_destructor *Remove (pthread_key * key);
|
pthread_key_destructor *Remove (pthread_key * key);
|
||||||
void IterateNull ();
|
void IterateNull ();
|
||||||
private:
|
|
||||||
pthread_key_destructor * head;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class pthread_attr:public verifyable_object
|
class pthread_attr:public verifyable_object
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in New Issue