summaryrefslogtreecommitdiffstats
path: root/src/threads/mutex.cpp
diff options
context:
space:
mode:
authorLubos Dolezel <lubos@dolezel.info>2015-07-07 23:08:03 +0200
committerLubos Dolezel <lubos@dolezel.info>2015-07-07 23:08:03 +0200
commit38bb6b72da1d3f5cfa4c72d8bc9597229423c0e3 (patch)
tree14186c138dbd8c90dc94f41484c4d1b2ac1d7818 /src/threads/mutex.cpp
parentea71ccfcfab52f74469231cab4e70552333b590a (diff)
downloadtwinkle-38bb6b72da1d3f5cfa4c72d8bc9597229423c0e3.tar
twinkle-38bb6b72da1d3f5cfa4c72d8bc9597229423c0e3.tar.gz
twinkle-38bb6b72da1d3f5cfa4c72d8bc9597229423c0e3.tar.lz
twinkle-38bb6b72da1d3f5cfa4c72d8bc9597229423c0e3.tar.xz
twinkle-38bb6b72da1d3f5cfa4c72d8bc9597229423c0e3.zip
Partial lock rework in t_phone (#17). If the app starts crashing or freezing, this commit is probably to blame.
Diffstat (limited to 'src/threads/mutex.cpp')
-rw-r--r--src/threads/mutex.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/threads/mutex.cpp b/src/threads/mutex.cpp
index 0ae2a99..159f887 100644
--- a/src/threads/mutex.cpp
+++ b/src/threads/mutex.cpp
@@ -20,6 +20,7 @@
#include <iostream>
#include "mutex.h"
#include "thread.h"
+#include <stdexcept>
using namespace std;
@@ -88,3 +89,39 @@ t_mutex_guard::t_mutex_guard(t_mutex &mutex) : mutex_(mutex) {
t_mutex_guard::~t_mutex_guard() {
mutex_.unlock();
}
+
+
+///////////////////////////
+// t_rwmutex
+///////////////////////////
+
+t_rwmutex::t_rwmutex()
+{
+ int ret = pthread_rwlock_init(&_lock, nullptr);
+ if (ret != 0) throw string(
+ "t_rwmutex::t_rwmutex failed to create a r/w mutex.");
+}
+
+t_rwmutex::~t_rwmutex()
+{
+ pthread_rwlock_destroy(&_lock);
+}
+
+void t_rwmutex::lockRead()
+{
+ int err = pthread_rwlock_rdlock(&_lock);
+ if (err != 0)
+ throw std::logic_error("Mutex lock failed");
+}
+
+void t_rwmutex::lockWrite()
+{
+ int err = pthread_rwlock_wrlock(&_lock);
+ if (err != 0)
+ throw std::logic_error("Mutex lock failed");
+}
+
+void t_rwmutex::unlock()
+{
+ pthread_rwlock_unlock(&_lock);
+}