1#ifndef FPMAS_HARD_SYNC_MUTEX_H
2#define FPMAS_HARD_SYNC_MUTEX_H
10#include "../synchro.h"
12namespace fpmas {
namespace synchro {
namespace hard {
33 int _locked_shared = 0;
38 std::queue<Request> lock_requests;
39 std::queue<Request> lock_shared_requests;
41 void _lock()
override {_locked=
true;}
42 void _lockShared()
override {_locked_shared++;}
43 void _unlock()
override {_locked=
false;}
44 void _unlockShared()
override {_locked_shared--;}
59 : node(node), mutex_client(mutex_client), mutex_server(mutex_server) {}
71 const T&
data()
const override {
return node->
data();}
73 const T&
read()
override;
84 bool locked()
const override {
return _locked;}
116 mutex_server.wait(req);
123 mutex_client.read(node->getId(), node->location())
146 if(_locked_shared==0) {
147 mutex_server.notify(node->getId());
151 mutex_client.releaseRead(node->getId(), node->location());
171 if(_locked || _locked_shared > 0) {
174 mutex_server.wait(req);
176 this->_locked =
true;
182 mutex_client.acquire(node->getId(), node->location())
204 this->_locked =
false;
205 mutex_server.notify(node->getId());
208 mutex_client.releaseAcquire(node->getId(), node->data(), node->location());
228 if(_locked || _locked_shared > 0) {
231 mutex_server.wait(req);
233 this->_locked =
true;
236 mutex_client.lock(node->getId(), node->location());
256 this->_locked =
false;
257 mutex_server.notify(node->getId());
260 mutex_client.unlock(node->getId(), node->location());
283 mutex_server.wait(req);
288 mutex_client.lockShared(node->getId(), node->location());
309 if(_locked_shared==0) {
310 mutex_server.notify(node->getId());
314 mutex_client.unlockShared(node->getId(), node->location());
319 switch(request.
type) {
320 case MutexRequestType::READ :
321 lock_shared_requests.push(request);
323 case MutexRequestType::LOCK :
324 lock_requests.push(request);
326 case MutexRequestType::ACQUIRE :
327 lock_requests.push(request);
329 case MutexRequestType::LOCK_SHARED:
330 lock_shared_requests.push(request);
337 std::queue<Request> requests;
341 while(!lock_shared_requests.empty()) {
342 Request lock_shared_request = lock_shared_requests.front();
343 requests.push(lock_shared_request);
344 lock_shared_requests.pop();
351 if(!lock_requests.empty()) {
352 requests.push(lock_requests.front());
Definition: distributed_node.h:28
Definition: hard_sync_mutex.h:25
T & data() override
Definition: hard_sync_mutex.h:67
HardSyncMutex(fpmas::api::graph::DistributedNode< T > *node, MutexClient &mutex_client, MutexServer &mutex_server)
Definition: hard_sync_mutex.h:55
void lockShared() override
Definition: hard_sync_mutex.h:278
std::queue< Request > requestsToProcess() override
Definition: hard_sync_mutex.h:336
void lock() override
Definition: hard_sync_mutex.h:226
void pushRequest(Request request) override
Definition: hard_sync_mutex.h:318
int sharedLockCount() const override
Definition: hard_sync_mutex.h:91
void releaseRead() override
Definition: hard_sync_mutex.h:143
const T & data() const override
Definition: hard_sync_mutex.h:71
void unlock() override
Definition: hard_sync_mutex.h:253
void synchronize() override
Definition: hard_sync_mutex.h:93
void releaseAcquire() override
Definition: hard_sync_mutex.h:202
void unlockShared() override
Definition: hard_sync_mutex.h:306
const T & read() override
Definition: hard_sync_mutex.h:111
bool locked() const override
Definition: hard_sync_mutex.h:84
T & acquire() override
Definition: hard_sync_mutex.h:169
Definition: hard_sync_mode.h:24
Definition: client_server.h:73
Definition: client_server.h:208
LocationState
Definition: location_state.h:15
@ LOCAL
Definition: location_state.h:21
MutexRequestType
Definition: enums.h:54
static void update(T &local_data, T &&updated_data)
Definition: synchro.h:35
Definition: client_server.h:15
MutexRequestType type
Definition: client_server.h:32
int source
Definition: client_server.h:28