r7954 - /trunk/licq/src/thread/readwritemutex_pthread.cpp

[email protected]
Newsgroups gmane.network.licq.cvs
Message-ID <20101031082900.5AB73224B82@thejon>
Author: erijo
Date: Sun Oct 31 17:28:59 2010
New Revision: 7954

Log:
Implementation of ReadWriteMutex using pthread's rwlock

Currently this implementation needs to be enabled by changing
readwritemutex.cpp to readwritemutex_pthread.cpp in licq/src/CMakeLists.txt.

Besides being possibly more effective than the old implementation, using
pthread's rwlock means that helgrind (a thread error detector that's part of
valgrind) can be used to find locking problems.

Currently this implementation does not implement any debug variant so possible
deadlocks are not detected in the same way as for the old implementation.

Added:
    trunk/licq/src/thread/readwritemutex_pthread.cpp

Added: trunk/licq/src/thread/readwritemutex_pthread.cpp
==============================================================================
--- trunk/licq/src/thread/readwritemutex_pthread.cpp (added)
+++ trunk/licq/src/thread/readwritemutex_pthread.cpp Sun Oct 31 17:28:59 2010
@@ -1,0 +1,83 @@
+/*
+ * This file is part of Licq, an instant messaging client for UNIX.
+ * Copyright (C) 2010 Licq Developers <[email protected]>
+ *
+ * Please refer to the COPYRIGHT file distributed with this source
+ * distribution for the names of the individual contributors.
+ *
+ * Licq is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Licq is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Licq; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <licq/thread/readwritemutex.h>
+
+#include <pthread.h>
+
+using Licq::ReadWriteMutex;
+
+class ReadWriteMutex::Private
+{
+public:
+  Private()
+  {
+    ::pthread_rwlock_init(&myReadWriteMutex, NULL);
+  }
+
+  ~Private()
+  {
+    ::pthread_rwlock_destroy(&myReadWriteMutex);
+  }
+
+  pthread_rwlock_t myReadWriteMutex;
+};
+
+ReadWriteMutex::ReadWriteMutex() :
+  myPrivate(new Private)
+{
+  // Empty
+}
+
+ReadWriteMutex::~ReadWriteMutex()
+{
+  delete myPrivate;
+}
+
+void ReadWriteMutex::lockRead()
+{
+  LICQ_D();
+  ::pthread_rwlock_rdlock(&d->myReadWriteMutex);
+}
+
+void ReadWriteMutex::unlockRead()
+{
+  LICQ_D();
+  ::pthread_rwlock_unlock(&d->myReadWriteMutex);
+}
+
+void ReadWriteMutex::lockWrite()
+{
+  LICQ_D();
+  ::pthread_rwlock_wrlock(&d->myReadWriteMutex);
+}
+
+void ReadWriteMutex::unlockWrite()
+{
+  LICQ_D();
+  ::pthread_rwlock_unlock(&d->myReadWriteMutex);
+}
+
+void ReadWriteMutex::setName(const std::string& /*name*/)
+{
+  // Empty
+}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.