1#ifndef FPMAS_MUTEX_CLIENT_H
2#define FPMAS_MUTEX_CLIENT_H
10#include "../data_update_pack.h"
13namespace fpmas {
namespace synchro {
namespace hard {
54 id_mpi(id_mpi), data_mpi(data_mpi), data_update_mpi(data_update_mpi),
55 server_pack(server_pack) {}
72 FPMAS_LOGD(this->comm.getRank(),
"MUTEX_CLIENT",
"reading node %s from %i",
FPMAS_C_STR(
id), location);
75 this->id_mpi.Issend(
id, location, server_pack.getEpoch() | Tag::READ, req);
79 server_pack.waitSendRequest(req);
85 server_pack.waitResponse(data_mpi, location, Tag::READ_RESPONSE, read_response_status);
87 return data_mpi.recv(read_response_status.
source, read_response_status.
tag);
92 FPMAS_LOGV(this->comm.getRank(),
"MUTEX_CLIENT",
"releasing read node %s from %i",
FPMAS_C_STR(
id), location);
95 id_mpi.Issend(
id, location, server_pack.getEpoch() | Tag::UNLOCK_SHARED, req);
97 server_pack.waitSendRequest(req);
102 FPMAS_LOGD(this->comm.getRank(),
"MUTEX_CLIENT",
"acquiring node %s from %i",
FPMAS_C_STR(
id), location);
105 this->id_mpi.Issend(
id, location, server_pack.getEpoch() | Tag::ACQUIRE, req);
107 server_pack.waitSendRequest(req);
113 server_pack.waitResponse(data_mpi, location, Tag::ACQUIRE_RESPONSE, acquire_response_status);
115 return data_mpi.recv(acquire_response_status.
source, acquire_response_status.
tag);
120 FPMAS_LOGV(this->comm.getRank(),
"MUTEX_CLIENT",
"releasing acquired node %s from %i",
FPMAS_C_STR(
id), location);
124 data_update_mpi.Issend(update, location, server_pack.getEpoch() | Tag::RELEASE_ACQUIRE, req);
126 server_pack.waitSendRequest(req);
131 FPMAS_LOGD(this->comm.getRank(),
"MUTEX_CLIENT",
"locking node %s from %i",
FPMAS_C_STR(
id), location);
134 this->id_mpi.Issend(
id, location, server_pack.getEpoch() | Tag::LOCK, req);
136 server_pack.waitSendRequest(req);
142 server_pack.waitVoidResponse(comm, location, Tag::LOCK_RESPONSE, lock_response_status);
144 comm.recv(lock_response_status.
source, lock_response_status.
tag);
149 FPMAS_LOGV(this->comm.getRank(),
"MUTEX_CLIENT",
"unlocking node %s from %i",
FPMAS_C_STR(
id), location);
152 this->id_mpi.Issend(
id, location, server_pack.getEpoch() | Tag::UNLOCK, req);
154 server_pack.waitSendRequest(req);
159 FPMAS_LOGD(this->comm.getRank(),
"MUTEX_CLIENT",
"share locking node %s from %i",
FPMAS_C_STR(
id), location);
162 this->id_mpi.Issend(
id, location, server_pack.getEpoch() | Tag::LOCK_SHARED, req);
164 server_pack.waitSendRequest(req);
169 server_pack.waitVoidResponse(comm, location, Tag::LOCK_SHARED_RESPONSE, lock_response_status);
171 comm.recv(lock_response_status.
source, lock_response_status.
tag);
176 FPMAS_LOGV(this->comm.getRank(),
"MUTEX_CLIENT",
"share unlocking node %s from %i",
FPMAS_C_STR(
id), location);
179 this->id_mpi.Issend(
id, location, server_pack.getEpoch() | Tag::UNLOCK_SHARED, req);
181 server_pack.waitSendRequest(req);
Definition: communication.h:251
Definition: communication.h:637
Definition: distributed_id.h:89
Definition: mutex_client.h:22
T acquire(DistributedId, int location) override
Definition: mutex_client.h:101
MutexClient(MpiCommunicator &comm, IdMpi &id_mpi, DataMpi &data_mpi, DataUpdateMpi &data_update_mpi, ServerPackBase &server_pack)
Definition: mutex_client.h:49
void releaseRead(DistributedId, int location) override
Definition: mutex_client.h:91
T read(DistributedId, int location) override
Definition: mutex_client.h:71
void lockShared(DistributedId, int location) override
Definition: mutex_client.h:158
void releaseAcquire(DistributedId, const T &updated_data, int location) override
Definition: mutex_client.h:119
void unlock(DistributedId, int location) override
Definition: mutex_client.h:148
void lock(DistributedId, int location) override
Definition: mutex_client.h:130
void unlockShared(DistributedId, int location) override
Definition: mutex_client.h:175
Definition: server_pack.h:39
Definition: hard_sync_mode.h:24
Definition: client_server.h:73
Definition: client_server.h:208
#define FPMAS_C_STR(arg)
Definition: macros.h:24
Epoch
Definition: enums.h:15
Tag
Definition: enums.h:23
Definition: communication.h:162
Definition: communication.h:215
int tag
Definition: communication.h:236
int source
Definition: communication.h:232
Definition: data_update_pack.h:16
Definition: client_server.h:15