[Spice-devel] [PATCH 14/14] Use simpler classes for mutex handling
Frediano Ziglio
fziglio at redhat.com
Thu Sep 1 12:00:56 UTC 2016
Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
common/vdcommon.h | 39 +++++++++++++++++++++++++++++++++++----
vdagent/desktop_layout.cpp | 1 -
vdagent/desktop_layout.h | 4 ++--
vdagent/vdagent.cpp | 17 +++++------------
vdservice/vdservice.cpp | 11 +++--------
5 files changed, 45 insertions(+), 27 deletions(-)
diff --git a/common/vdcommon.h b/common/vdcommon.h
index f4859e2..c1920e9 100644
--- a/common/vdcommon.h
+++ b/common/vdcommon.h
@@ -27,11 +27,42 @@
#include "spice/vd_agent.h"
#include "vdlog.h"
-typedef CRITICAL_SECTION mutex_t;
+class Mutex {
+public:
+ Mutex() {
+ InitializeCriticalSection(&_crit);
+ }
+ ~Mutex() {
+ DeleteCriticalSection(&_crit);
+ }
+ void lock() {
+ EnterCriticalSection(&_crit);
+ }
+ void unlock() {
+ LeaveCriticalSection(&_crit);
+ }
+private:
+ CRITICAL_SECTION _crit;
+ // no copy
+ Mutex(const Mutex&);
+ void operator=(const Mutex&);
+};
-#define MUTEX_INIT(mutex) InitializeCriticalSection(&mutex)
-#define MUTEX_LOCK(mutex) EnterCriticalSection(&mutex)
-#define MUTEX_UNLOCK(mutex) LeaveCriticalSection(&mutex)
+class MutexLocker {
+public:
+ MutexLocker(Mutex &mtx):_mtx(mtx) {
+ _mtx.lock();
+ }
+ ~MutexLocker() {
+ _mtx.unlock();
+ }
+private:
+ Mutex &_mtx;
+ // no copy
+ MutexLocker(const MutexLocker&);
+ void operator=(const MutexLocker&);
+};
+typedef Mutex mutex_t;
#define VD_AGENT_REGISTRY_KEY "SOFTWARE\\Red Hat\\Spice\\vdagent\\"
#define VD_AGENT_STOP_EVENT TEXT("Global\\vdagent_stop_event")
diff --git a/vdagent/desktop_layout.cpp b/vdagent/desktop_layout.cpp
index 65f06c1..11ad009 100644
--- a/vdagent/desktop_layout.cpp
+++ b/vdagent/desktop_layout.cpp
@@ -38,7 +38,6 @@ DesktopLayout::DesktopLayout()
, _total_height (0)
, _display_config (NULL)
{
- MUTEX_INIT(_mutex);
_display_config = DisplayConfig::create_config();
get_displays();
}
diff --git a/vdagent/desktop_layout.h b/vdagent/desktop_layout.h
index 34bec0d..690b34f 100644
--- a/vdagent/desktop_layout.h
+++ b/vdagent/desktop_layout.h
@@ -68,8 +68,8 @@ public:
~DesktopLayout();
void get_displays();
void set_displays();
- void lock() { MUTEX_LOCK(_mutex);}
- void unlock() { MUTEX_UNLOCK(_mutex);}
+ void lock() { _mutex.lock(); }
+ void unlock() { _mutex.unlock(); }
DisplayMode* get_display(int i) { return _displays.at(i);}
size_t get_display_count() { return _displays.size();}
DWORD get_total_width() { return _total_width;}
diff --git a/vdagent/vdagent.cpp b/vdagent/vdagent.cpp
index 45f2c68..e3ba14b 100644
--- a/vdagent/vdagent.cpp
+++ b/vdagent/vdagent.cpp
@@ -235,8 +235,6 @@ VDAgent::VDAgent()
ZeroMemory(&_read_overlapped, sizeof(_read_overlapped));
ZeroMemory(&_write_overlapped, sizeof(_write_overlapped));
ZeroMemory(_read_buf, sizeof(_read_buf));
- MUTEX_INIT(_control_mutex);
- MUTEX_INIT(_message_mutex);
_singleton = this;
}
@@ -366,17 +364,16 @@ void VDAgent::cleanup()
void VDAgent::set_control_event(int control_command)
{
- MUTEX_LOCK(_control_mutex);
+ MutexLocker lock(_control_mutex);
_control_queue.push(control_command);
if (_control_event && !SetEvent(_control_event)) {
vd_printf("SetEvent() failed: %lu", GetLastError());
}
- MUTEX_UNLOCK(_control_mutex);
}
void VDAgent::handle_control_event()
{
- MUTEX_LOCK(_control_mutex);
+ MutexLocker lock(_control_mutex);
while (_control_queue.size()) {
int control_command = _control_queue.front();
_control_queue.pop();
@@ -406,7 +403,6 @@ void VDAgent::handle_control_event()
vd_printf("Unsupported control command %u", control_command);
}
}
- MUTEX_UNLOCK(_control_mutex);
}
void VDAgent::input_desktop_message_loop()
@@ -936,7 +932,7 @@ bool VDAgent::write_clipboard(VDAgentMessage* msg, uint32_t size)
ASSERT(msg && size);
//FIXME: do it smarter - no loop, no memcopy
- MUTEX_LOCK(_message_mutex);
+ MutexLocker lock(_message_mutex);
while (pos < size) {
DWORD n = MIN(sizeof(VDIChunk) + size - pos, VD_AGENT_MAX_DATA_SIZE);
VDIChunk* chunk = new_chunk(n);
@@ -950,7 +946,6 @@ bool VDAgent::write_clipboard(VDAgentMessage* msg, uint32_t size)
enqueue_chunk(chunk);
pos += (n - sizeof(VDIChunk));
}
- MUTEX_UNLOCK(_message_mutex);
return ret;
}
@@ -1438,7 +1433,7 @@ void VDAgent::write_completion(DWORD err, DWORD bytes, LPOVERLAPPED overlapped)
a->_running = false;
return;
}
- MUTEX_LOCK(a->_message_mutex);
+ MutexLocker lock(a->_message_mutex);
a->_write_pos += bytes;
chunk = a->_message_queue.front();
count = sizeof(VDIChunk) + chunk->hdr.size - a->_write_pos;
@@ -1458,7 +1453,6 @@ void VDAgent::write_completion(DWORD err, DWORD bytes, LPOVERLAPPED overlapped)
a->_running = false;
}
}
- MUTEX_UNLOCK(a->_message_mutex);
}
VDIChunk* VDAgent::new_chunk(DWORD bytes)
@@ -1468,12 +1462,11 @@ VDIChunk* VDAgent::new_chunk(DWORD bytes)
void VDAgent::enqueue_chunk(VDIChunk* chunk)
{
- MUTEX_LOCK(_message_mutex);
+ MutexLocker lock(_message_mutex);
_message_queue.push(chunk);
if (_message_queue.size() == 1) {
write_completion(0, 0, &_write_overlapped);
}
- MUTEX_UNLOCK(_message_mutex);
}
LRESULT CALLBACK VDAgent::wnd_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
diff --git a/vdservice/vdservice.cpp b/vdservice/vdservice.cpp
index 2d7b5b9..1892b72 100644
--- a/vdservice/vdservice.cpp
+++ b/vdservice/vdservice.cpp
@@ -124,8 +124,6 @@ VDService::VDService()
_control_event = CreateEvent(NULL, FALSE, FALSE, NULL);
_agent_stop_event = CreateEvent(NULL, FALSE, FALSE, VD_AGENT_STOP_EVENT);
_agent_path[0] = wchar_t('\0');
- MUTEX_INIT(_agent_mutex);
- MUTEX_INIT(_control_mutex);
}
VDService::~VDService()
@@ -240,17 +238,16 @@ static const char* const session_events[] = {
void VDService::set_control_event(int control_command)
{
- MUTEX_LOCK(_control_mutex);
+ MutexLocker lock(_control_mutex);
_control_queue.push(control_command);
if (_control_event && !SetEvent(_control_event)) {
vd_printf("SetEvent() failed: %lu", GetLastError());
}
- MUTEX_UNLOCK(_control_mutex);
}
void VDService::handle_control_event()
{
- MUTEX_LOCK(_control_mutex);
+ MutexLocker lock(_control_mutex);
while (_control_queue.size()) {
int control_command = _control_queue.front();
_control_queue.pop();
@@ -265,7 +262,6 @@ void VDService::handle_control_event()
vd_printf("Unsupported control command %u", control_command);
}
}
- MUTEX_UNLOCK(_control_mutex);
}
DWORD WINAPI VDService::control_handler(DWORD control, DWORD event_type, LPVOID event_data,
@@ -781,7 +777,7 @@ bool VDService::restart_agent(bool normal_restart)
DWORD time = GetTickCount();
bool ret = true;
- MUTEX_LOCK(_agent_mutex);
+ MutexLocker lock(_agent_mutex);
if (!normal_restart && ++_agent_restarts > VD_AGENT_MAX_RESTARTS) {
vd_printf("Agent restarted too many times");
ret = false;
@@ -794,7 +790,6 @@ bool VDService::restart_agent(bool normal_restart)
_last_agent_restart_time = time;
ret = true;
}
- MUTEX_UNLOCK(_agent_mutex);
return ret;
}
--
2.7.4
More information about the Spice-devel
mailing list