Commit 48dc6a89 authored by Antoine Kaufmann's avatar Antoine Kaufmann
Browse files

lib/simbricks/base: add handling for incoming terminate messages

Includes setting a terminated flag and a call to detect this.
parent 96273b5f
...@@ -96,6 +96,8 @@ struct SimbricksBaseIf { ...@@ -96,6 +96,8 @@ struct SimbricksBaseIf {
size_t out_enum; size_t out_enum;
uint64_t out_timestamp; uint64_t out_timestamp;
bool in_terminated;
int conn_state; int conn_state;
int sync; int sync;
struct SimbricksBaseIfParams params; struct SimbricksBaseIfParams params;
...@@ -178,6 +180,19 @@ int SimBricksBaseIfEstablish(struct SimBricksBaseIfEstablishData *ifs, ...@@ -178,6 +180,19 @@ int SimBricksBaseIfEstablish(struct SimBricksBaseIfEstablishData *ifs,
void SimbricksBaseIfClose(struct SimbricksBaseIf *base_if); void SimbricksBaseIfClose(struct SimbricksBaseIf *base_if);
void SimbricksBaseIfUnlink(struct SimbricksBaseIf *base_if); void SimbricksBaseIfUnlink(struct SimbricksBaseIf *base_if);
/**
* Read message type from received message.
*
* @param base_if Base interface handle (connected).
* @param msg Pointer to the previously received message.
*/
static inline uint8_t SimbricksBaseIfInType(
struct SimbricksBaseIf *base_if,
volatile union SimbricksProtoBaseMsg *msg) {
return (msg->header.own_type & ~SIMBRICKS_PROTO_MSG_OWN_MASK);
}
/** /**
* Poll for an incoming message without advancing the position if one is found. * Poll for an incoming message without advancing the position if one is found.
* Message must be retrieved again with a call to `SimbricksBaseIfInPoll` * Message must be retrieved again with a call to `SimbricksBaseIfInPoll`
...@@ -223,22 +238,18 @@ static inline volatile union SimbricksProtoBaseMsg *SimbricksBaseIfInPoll( ...@@ -223,22 +238,18 @@ static inline volatile union SimbricksProtoBaseMsg *SimbricksBaseIfInPoll(
volatile union SimbricksProtoBaseMsg *msg = volatile union SimbricksProtoBaseMsg *msg =
SimbricksBaseIfInPeek(base_if, timestamp); SimbricksBaseIfInPeek(base_if, timestamp);
if (msg != NULL) if (msg != NULL) {
base_if->in_pos = (base_if->in_pos + 1) % base_if->in_enum; base_if->in_pos = (base_if->in_pos + 1) % base_if->in_enum;
return msg;
}
/**
* Read message type from received message.
*
* @param base_if Base interface handle (connected).
* @param msg Pointer to the previously received message.
*/
static inline uint8_t SimbricksBaseIfInType(
struct SimbricksBaseIf *base_if,
volatile union SimbricksProtoBaseMsg *msg) {
return (msg->header.own_type & ~SIMBRICKS_PROTO_MSG_OWN_MASK);
if (SimbricksBaseIfInType(base_if, msg) ==
SIMBRICKS_PROTO_MSG_TYPE_TERMINATE) {
base_if->in_terminated = true;
base_if->sync = false;
base_if->in_timestamp = UINT64_MAX;
base_if->out_timestamp = UINT64_MAX;
}
}
return msg;
} }
/** /**
...@@ -270,6 +281,16 @@ static inline uint64_t SimbricksBaseIfInTimestamp( ...@@ -270,6 +281,16 @@ static inline uint64_t SimbricksBaseIfInTimestamp(
return base_if->in_timestamp; return base_if->in_timestamp;
} }
/**
* Check if incoming channel has been terminated by peer.
*
* @param base_if Base interface handle (connected).
*/
static inline int SimbricksBaseIfInTerminated(
struct SimbricksBaseIf *base_if) {
return base_if->in_terminated;
}
/** /**
* Allocate a new message in the queue. Must be followed by a call to * Allocate a new message in the queue. Must be followed by a call to
* `SimbricksBaseIfOutSend`. * `SimbricksBaseIfOutSend`.
...@@ -351,6 +372,8 @@ static inline int SimbricksBaseIfOutSync(struct SimbricksBaseIf *base_if, ...@@ -351,6 +372,8 @@ static inline int SimbricksBaseIfOutSync(struct SimbricksBaseIf *base_if,
static inline uint64_t SimbricksBaseIfOutNextSync( static inline uint64_t SimbricksBaseIfOutNextSync(
struct SimbricksBaseIf *base_if) struct SimbricksBaseIf *base_if)
{ {
if (base_if->out_timestamp == UINT64_MAX)
return UINT64_MAX;
return base_if->out_timestamp + base_if->params.sync_interval; return base_if->out_timestamp + base_if->params.sync_interval;
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment