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:
-rw-r--r--winsup/cygwin/ChangeLog12
-rw-r--r--winsup/cygwin/thread.cc31
-rw-r--r--winsup/cygwin/thread.h3
3 files changed, 27 insertions, 19 deletions
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 <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 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<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);