Commit 78efba06 authored by Alessandro Rubini's avatar Alessandro Rubini

timeout: add pp_timeout_z and centralized logging

By zeroing the timeout whenever it expires, a number of
state files get simplified a little. So pp_timeout_z() returns
1 or 0 like pp_timeout(), but also clears the timeout when it is
expired.

Moreover, when a timeout expires a message is printed if the
build-time option pp_verbose_time is set (and run-time verbosity is at
level 2). In this way all timeouts are reported, or none of them.
Signed-off-by: Alessandro Rubini's avatarAlessandro Rubini <rubini@gnudd.com>
parent 805b7a8b
......@@ -318,12 +318,26 @@ static inline void pp_timeout_clr(struct pp_instance *ppi, int index)
ppi->timeouts[index] = 0;
}
extern void pp_timeout_log(struct pp_instance *ppi, int index);
static inline int pp_timeout(struct pp_instance *ppi, int index)
{
return ppi->timeouts[index] &&
int ret = ppi->timeouts[index] &&
time_after_eq(pp_calc_timeout(0), ppi->timeouts[index]);
if (ret && pp_verbose_time)
pp_timeout_log(ppi, index);
return ret;
}
static inline int pp_timeout_z(struct pp_instance *ppi, int index)
{
int ret = pp_timeout(ppi, index);
if (ret)
pp_timeout_clr(ppi, index);
return ret;
}
/* This functions are generic, not architecture-specific */
extern void pp_timeout_set(struct pp_instance *ppi, int index, int millisec);
......
......@@ -17,17 +17,17 @@ int wr_calibrated(struct pp_instance *ppi, unsigned char *pkt, int plen)
WR_DSPOR(ppi)->wrStateTimeout);
}
if (pp_timeout(ppi, PP_TO_EXT_0)) {
if (pp_timeout_z(ppi, PP_TO_EXT_0)) {
if (WR_DSPOR(ppi)->wrMode == WR_MASTER)
ppi->next_state = PPS_MASTER;
else
ppi->next_state = PPS_LISTENING;
WR_DSPOR(ppi)->wrPortState = WRS_IDLE;
goto state_updated;
goto out;
}
if (plen == 0)
goto ret;
goto out;
if (ppi->msg_tmp_header.messageType == PPM_SIGNALING) {
msg_unpack_wrsig(ppi, pkt, &wrsig_msg,
......@@ -41,11 +41,7 @@ int wr_calibrated(struct pp_instance *ppi, unsigned char *pkt, int plen)
ppi->next_state = WRS_WR_LINK_ON;
}
state_updated:
if (ppi->next_state != ppi->state)
pp_timeout_clr(ppi, PP_TO_EXT_0);
ret:
out:
ppi->next_delay = WR_DSPOR(ppi)->wrStateTimeout;
return 0;
}
......@@ -22,13 +22,13 @@ int wr_calibration(struct pp_instance *ppi, unsigned char *pkt, int plen)
WR_DSPOR(ppi)->wrPortState = WRS_CALIBRATION_2;
}
if (pp_timeout(ppi, PP_TO_EXT_0)) {
if (pp_timeout_z(ppi, PP_TO_EXT_0)) {
if (WR_DSPOR(ppi)->wrMode == WR_MASTER)
ppi->next_state = PPS_MASTER;
else
ppi->next_state = PPS_LISTENING;
WR_DSPOR(ppi)->wrPortState = WRS_IDLE;
goto state_updated;
goto out;
}
switch (WR_DSPOR(ppi)->wrPortState) {
......@@ -125,10 +125,7 @@ int wr_calibration(struct pp_instance *ppi, unsigned char *pkt, int plen)
break;
}
state_updated:
if (ppi->next_state != ppi->state)
pp_timeout_clr(ppi, PP_TO_EXT_0);
out:
ppi->next_delay = WR_DSPOR(ppi)->wrStateTimeout;
return e;
......
......@@ -21,15 +21,15 @@ int wr_locked(struct pp_instance *ppi, unsigned char *pkt, int plen)
e = msg_issue_wrsig(ppi, LOCKED);
}
if (pp_timeout(ppi, PP_TO_EXT_0)) {
if (pp_timeout_z(ppi, PP_TO_EXT_0)) {
ppi->next_state = PPS_LISTENING;
WR_DSPOR(ppi)->wrMode = NON_WR;
WR_DSPOR(ppi)->wrPortState = WRS_IDLE;
goto state_updated;
goto out;
}
if (plen == 0)
goto no_incoming_msg;
goto out;
if (ppi->msg_tmp_header.messageType == PPM_SIGNALING) {
......@@ -40,14 +40,9 @@ int wr_locked(struct pp_instance *ppi, unsigned char *pkt, int plen)
ppi->next_state = WRS_RESP_CALIB_REQ;
}
no_incoming_msg:
out:
if (e != 0)
ppi->next_state = PPS_FAULTY;
state_updated:
if (ppi->next_state != ppi->state)
pp_timeout_clr(ppi, PP_TO_EXT_0);
ppi->next_delay = WR_DSPOR(ppi)->wrStateTimeout;
return e;
......
......@@ -19,14 +19,14 @@ int wr_m_lock(struct pp_instance *ppi, unsigned char *pkt, int plen)
pp_timeout_set(ppi, PP_TO_EXT_0, WR_M_LOCK_TIMEOUT_MS);
}
if (pp_timeout(ppi, PP_TO_EXT_0)) {
if (pp_timeout_z(ppi, PP_TO_EXT_0)) {
ppi->next_state = PPS_MASTER;
WR_DSPOR(ppi)->wrPortState = WRS_IDLE;
goto state_updated;
goto out;
}
if (plen == 0)
goto no_incoming_msg;
goto out;
if (ppi->msg_tmp_header.messageType == PPM_SIGNALING) {
......@@ -37,14 +37,9 @@ int wr_m_lock(struct pp_instance *ppi, unsigned char *pkt, int plen)
ppi->next_state = WRS_CALIBRATION;
}
no_incoming_msg:
out:
if (e != 0)
ppi->next_state = PPS_FAULTY;
state_updated:
if (ppi->next_state != ppi->state)
pp_timeout_clr(ppi, PP_TO_EXT_0);
ppi->next_delay = WR_DSPOR(ppi)->wrStateTimeout;
return e;
......
......@@ -23,15 +23,15 @@ int wr_present(struct pp_instance *ppi, unsigned char *pkt, int plen)
e = msg_issue_wrsig(ppi, SLAVE_PRESENT);
}
if (pp_timeout(ppi, PP_TO_EXT_0)) {
if (pp_timeout_z(ppi, PP_TO_EXT_0)) {
ppi->next_state = PPS_LISTENING;
WR_DSPOR(ppi)->wrMode = NON_WR;
WR_DSPOR(ppi)->wrPortState = WRS_IDLE;
goto state_updated;
goto out;
}
if (plen == 0)
goto no_incoming_msg;
goto out;
if (ppi->msg_tmp_header.messageType == PPM_SIGNALING) {
......@@ -42,17 +42,14 @@ int wr_present(struct pp_instance *ppi, unsigned char *pkt, int plen)
ppi->next_state = WRS_S_LOCK;
}
no_incoming_msg:
out:
if (e == 0)
st_com_execute_slave(ppi, 0);
else
ppi->next_state = PPS_FAULTY;
state_updated:
if (ppi->next_state != ppi->state) {
pp_timeout_clr(ppi, PP_TO_EXT_0);
if (ppi->next_state != ppi->state)
pp_timeout_clr(ppi, PP_TO_ANN_RECEIPT);
}
ppi->next_delay = WR_DSPOR(ppi)->wrStateTimeout;
......
......@@ -23,17 +23,17 @@ int wr_resp_calib_req(struct pp_instance *ppi, unsigned char *pkt, int plen)
}
if ((WR_DSPOR(ppi)->otherNodeCalSendPattern) &&
(pp_timeout(ppi, PP_TO_EXT_0))) {
(pp_timeout_z(ppi, PP_TO_EXT_0))) {
if (WR_DSPOR(ppi)->wrMode == WR_MASTER)
ppi->next_state = PPS_MASTER;
else
ppi->next_state = PPS_LISTENING;
WR_DSPOR(ppi)->wrPortState = WRS_IDLE;
goto state_updated;
goto out;
}
if (plen == 0)
goto state_updated;
goto out;
if (ppi->msg_tmp_header.messageType == PPM_SIGNALING) {
......@@ -51,11 +51,7 @@ int wr_resp_calib_req(struct pp_instance *ppi, unsigned char *pkt, int plen)
}
}
state_updated:
if (ppi->next_state != ppi->state)
pp_timeout_clr(ppi, PP_TO_EXT_0);
out:
ppi->next_delay = WR_DSPOR(ppi)->wrStateTimeout;
return e;
}
......@@ -17,11 +17,11 @@ int wr_s_lock(struct pp_instance *ppi, unsigned char *pkt, int plen)
pp_timeout_set(ppi, PP_TO_EXT_0, WR_S_LOCK_TIMEOUT_MS);
}
if (pp_timeout(ppi, PP_TO_EXT_0)) {
if (pp_timeout_z(ppi, PP_TO_EXT_0)) {
ppi->next_state = PPS_FAULTY;
WR_DSPOR(ppi)->wrPortState = WRS_IDLE;
WR_DSPOR(ppi)->wrMode = NON_WR;
goto state_updated;
goto out;
}
if (wr_locking_poll(ppi) == WR_SPLL_READY) {
......@@ -29,11 +29,7 @@ int wr_s_lock(struct pp_instance *ppi, unsigned char *pkt, int plen)
wr_locking_disable(ppi);
}
state_updated:
if (ppi->next_state != ppi->state)
pp_timeout_clr(ppi, PP_TO_EXT_0);
out:
ppi->next_delay = WR_DSPOR(ppi)->wrStateTimeout;
return e;
}
......@@ -23,6 +23,7 @@ OBJ-libstd := $D/fsm-table.o \
$D/arith.o \
$D/servo.o \
$D/hooks.o \
$D/timeout.o \
$D/open-close.o
$(TARGET).o: $(LIBSTD)
......
......@@ -18,8 +18,7 @@ int st_com_execute_slave(struct pp_instance *ppi, int check_delayreq)
if (ret < 0)
return ret;
if (pp_timeout(ppi, PP_TO_ANN_RECEIPT)) {
PP_VPRINTF("event ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES\n");
if (pp_timeout_z(ppi, PP_TO_ANN_RECEIPT)) {
ppi->number_foreign_records = 0;
ppi->foreign_record_i = 0;
if (!DSDEF(ppi)->slaveOnly &&
......@@ -35,10 +34,7 @@ int st_com_execute_slave(struct pp_instance *ppi, int check_delayreq)
if (!check_delayreq)
return 0;
if (pp_timeout(ppi, PP_TO_DELAYREQ)) {
pp_timeout_clr(ppi, PP_TO_DELAYREQ);
PP_VPRINTF("event DELAYREQ_INTERVAL_TIMEOUT_EXPIRES\n");
if (pp_timeout_z(ppi, PP_TO_DELAYREQ)) {
ret = msg_issue_delay_req(ppi);
ppi->delay_req_send_time = ppi->last_snt_time;
......
......@@ -32,8 +32,7 @@ int pp_master(struct pp_instance *ppi, unsigned char *pkt, int plen)
if (st_com_check_record_update(ppi))
goto state_updated;
if (pp_timeout(ppi, PP_TO_SYNC)) {
PP_VPRINTF("event SYNC_INTERVAL_TIMEOUT_EXPIRES\n");
if (pp_timeout_z(ppi, PP_TO_SYNC)) {
if (msg_issue_sync(ppi) < 0)
goto out;
......@@ -44,8 +43,7 @@ int pp_master(struct pp_instance *ppi, unsigned char *pkt, int plen)
goto out;
}
if (pp_timeout(ppi, PP_TO_ANN_INTERVAL)) {
PP_VPRINTF("event ANNOUNCE_INTERVAL_TIMEOUT_EXPIRES\n");
if (pp_timeout_z(ppi, PP_TO_ANN_INTERVAL)) {
if (msg_issue_announce(ppi) < 0)
goto out;
}
......
/*
* Alessandro Rubini for CERN, 2013 -- GNU LGPL v2.1 or later
*/
#include <ppsi/ppsi.h>
#include <ppsi/diag.h>
#include <ppsi/diag-macros.h>
#define N(n) [n] = #n
static char *timeout_names[__PP_TO_ARRAY_SIZE] __attribute__((used)) = {
N(PP_TO_DELAYREQ),
N(PP_TO_SYNC),
N(PP_TO_ANN_RECEIPT),
N(PP_TO_ANN_INTERVAL),
N(PP_TO_EXT_0),
N(PP_TO_EXT_1),
N(PP_TO_EXT_2),
N(PP_TO_EXT_3),
};
/*
* Log means messages
*/
void pp_timeout_log(struct pp_instance *ppi, int index)
{
PP_VPRINTF("timeout expire event: %s\n", timeout_names[index]);
}
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