Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/thread.h')
-rw-r--r--winsup/cygwin/thread.h60
1 files changed, 49 insertions, 11 deletions
diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h
index ad4208f5d..05bf9793c 100644
--- a/winsup/cygwin/thread.h
+++ b/winsup/cygwin/thread.h
@@ -183,9 +183,10 @@ public:
class pthread_key *next;
int set (const void *);
- void *get ();
+ void *get () const;
+ void run_destructor () const;
- pthread_key (void (*)(void *));
+ pthread_key (void (*)(void *));
~pthread_key ();
static void fixup_before_fork();
static void fixup_after_fork();
@@ -194,8 +195,53 @@ private:
static pthread_key * keys;
void saveKeyToBuffer ();
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
* for efficiency */
class pthread_key_destructor
@@ -211,21 +257,13 @@ public:
pthread_key *key;
};
-class pthread_key_destructor_list
+class pthread_key_destructor_list : public List<pthread_key_destructor>
{
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);
void IterateNull ();
-private:
- pthread_key_destructor * head;
};
-
class pthread_attr:public verifyable_object
{
public: