diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index ac6124745..1bdcdd9b5 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +2013-01-07 Christopher Faylor + + * 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 * 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 ba3221cc9..3dd0255e5 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 a0412e1d0..1c7b7c62a 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 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);