diff options
author | Christopher Faylor <me@cgf.cx> | 2013-01-07 16:01:10 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2013-01-07 16:01:10 +0000 |
commit | 8f3f61eb961322d7b50be81fbe51195565967738 (patch) | |
tree | 93a543a2fe770e4174e56ae1469a9c0e53af2435 /winsup | |
parent | 6cb6ea9cb416fb38866e103678a7d27d15308348 (diff) | |
download | newlib-8f3f61eb961322d7b50be81fbe51195565967738.zip newlib-8f3f61eb961322d7b50be81fbe51195565967738.tar.gz newlib-8f3f61eb961322d7b50be81fbe51195565967738.tar.bz2 |
* thread.cc (pthread_rwlock::add_reader): Perform new operation here and return
pointer to allocated RWLOCK_READER structure.
(pthread_rwlock::rdlock): Reorganize to reflect new add_reader functionality.
(pthread_rwlock::tryrdlock): Ditto. Remove unneeded call to lookup_reader().
* thread.h (pthread_rwlock::RWLOCK_READER::RWLOCK_READER): New constructor.
(pthread_rwlock::add_reader): Reflect new functionality.
Diffstat (limited to 'winsup')
-rw-r--r-- | winsup/cygwin/ChangeLog | 12 | ||||
-rw-r--r-- | winsup/cygwin/thread.cc | 31 | ||||
-rw-r--r-- | winsup/cygwin/thread.h | 3 |
3 files changed, 27 insertions, 19 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index ac61247..1bdcdd9 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +2013-01-07 Christopher Faylor <me.cygwin2013@cgf.cx> + + * thread.cc (pthread_rwlock::add_reader): Perform new operation here + and return pointer to allocated RWLOCK_READER structure. + (pthread_rwlock::rdlock): Reorganize to reflect new add_reader + functionality. + (pthread_rwlock::tryrdlock): Ditto. Remove unneeded call to + lookup_reader(). + * thread.h (pthread_rwlock::RWLOCK_READER::RWLOCK_READER): New + constructor. + (pthread_rwlock::add_reader): Reflect new functionality. + 2013-01-03 Christopher Faylor <me.cygwin2013@cgf.cx> * globals.cc (exit_states): Renumber so that ES_EXIT_STARTING is first, diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc index ba3221c..3dd0255 100644 --- a/winsup/cygwin/thread.cc +++ b/winsup/cygwin/thread.cc @@ -1391,8 +1391,9 @@ pthread_rwlock::rdlock () goto DONE; } - reader = new struct RWLOCK_READER; - if (!reader) + if ((reader = add_reader ())) + ++reader->n; + else { result = EAGAIN; goto DONE; @@ -1409,9 +1410,6 @@ pthread_rwlock::rdlock () pthread_cleanup_pop (0); } - reader->thread = self; - reader->n = 1; - add_reader (reader); DONE: mtx.unlock (); @@ -1427,21 +1425,15 @@ pthread_rwlock::tryrdlock () mtx.lock (); - if (writer || waiting_writers || lookup_reader (self)) + if (writer || waiting_writers) result = EBUSY; else { - struct RWLOCK_READER *reader; - - reader = lookup_reader (self); + RWLOCK_READER *reader = lookup_reader (self); + if (!reader) + reader = add_reader (); if (reader && reader->n < ULONG_MAX) ++reader->n; - else if ((reader = new struct RWLOCK_READER)) - { - reader->thread = self; - reader->n = 1; - add_reader (reader); - } else result = EAGAIN; } @@ -1544,10 +1536,13 @@ pthread_rwlock::unlock () return result; } -void -pthread_rwlock::add_reader (struct RWLOCK_READER *rd) +pthread_rwlock::RWLOCK_READER * +pthread_rwlock::add_reader () { - List_insert (readers, rd); + RWLOCK_READER *rd = new RWLOCK_READER; + if (rd) + List_insert (readers, rd); + return rd; } void diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h index a0412e1..1c7b7c6 100644 --- a/winsup/cygwin/thread.h +++ b/winsup/cygwin/thread.h @@ -555,6 +555,7 @@ public: struct RWLOCK_READER *next; pthread_t thread; unsigned long n; + RWLOCK_READER (): next (NULL), thread (pthread::self ()), n (0) {} } *readers; fast_mutex readers_mx; @@ -583,7 +584,7 @@ public: private: static List<pthread_rwlock> rwlocks; - void add_reader (struct RWLOCK_READER *rd); + RWLOCK_READER *add_reader (); void remove_reader (struct RWLOCK_READER *rd); struct RWLOCK_READER *lookup_reader (pthread_t thread); |