Commit 9ad7080e authored by Adam Wujek's avatar Adam Wujek 💬

Merge branch 'adam-rtud' into master

Make rtud and rtu_stat to be able to start in parallel with hal and ppsi.
(wait for hal in rtud, wait for hal and rtud in stu_stat)
Signed-off-by: Adam Wujek's avatarAdam Wujek <adam.wujek@cern.ch>
parents 59122563 c97eab53
......@@ -28,21 +28,8 @@ export WR_HOME="/wr"
eval $WR_HOME/bin/wrsw_hal $LOGPIPE_HAL \&
eval $WR_HOME/bin/wrsw_rtud $LOGPIPE_RTU \&
if [ ! -x $WR_HOME/bin/ppsi ]; then
echo "No WR-PTP daemon found" >&2
exit 1
fi
# Fire ppsi. Unfortinately the hal takes a while to start, and
# until ppsi waits by itself (not in this submodule commit, yet),
# wait here... This is the last script of the wr startup, and it can wait
for i in $(seq 1 10); do
if [ -S /tmp/.minipc/wrsw_hal ]; then break; fi
sleep 1
done
eval $WR_HOME/bin/ppsi $LOGPIPE_PTP \&
eval $WR_HOME/bin/ppsi $LOGPIPE_PTP \&
# ensure we receive UDP PTP frames, since ppsi supports UDP too.
(sleep 4; $WR_HOME/bin/rtu_stat add 01:00:5e:00:01:81 18 0) &
$WR_HOME/bin/rtu_stat add 01:00:5e:00:01:81 18 0 &
......@@ -133,12 +133,43 @@ int get_nports_from_hal(void)
struct hal_shmem_header *h;
struct wrs_shm_head *hal_head;
int hal_nports_local; /* local copy of number of ports */
int ii;
int n_wait = 0;
/* wait forever for HAL */
while (!(hal_head = wrs_shm_get(wrs_shm_hal, "",
WRS_SHM_READ | WRS_SHM_LOCKED))) {
if (n_wait > 5) {
/* print if waiting more than 5 seconds, some waiting
* is expected since hal requires few seconds to start
*/
fprintf(stderr, "rtu_stat: unable to open shm for "
"HAL!\n");
}
n_wait++;
sleep(1);
}
hal_head = wrs_shm_get(wrs_shm_hal, "", WRS_SHM_READ);
if (!hal_head) {
fprintf(stderr, "unable to open shm for HAL!\n");
exit(-1);
h = (void *)hal_head + hal_head->data_off;
n_wait = 0;
while (1) { /* wait forever for HAL to produce consistent nports */
ii = wrs_shm_seqbegin(hal_head);
/* Assume number of ports does not change in runtime */
hal_nports_local = h->nports;
if (!wrs_shm_seqretry(hal_head, ii))
break;
if (n_wait > 5) {
/* print if waiting more than 5 seconds, some waiting
* is expected since hal requires few seconds to start
*/
fprintf(stderr, "rtu_stat: Wait for HAL.\n");
}
n_wait++;
sleep(1);
}
/* check hal's shm version */
if (hal_head->version != HAL_SHMEM_VERSION) {
fprintf(stderr, "rtu_stat: unknown hal's shm version %i "
......@@ -146,11 +177,9 @@ int get_nports_from_hal(void)
hal_head->version, HAL_SHMEM_VERSION);
exit(-1);
}
h = (void *)hal_head + hal_head->data_off;
/* Assume number of ports does not change in runtime */
hal_nports_local = h->nports;
if (hal_nports_local > HAL_MAX_PORTS) {
fprintf(stderr, "Too many ports reported by HAL. "
fprintf(stderr, "rtu_stat: Too many ports reported by HAL. "
"%d vs %d supported\n",
hal_nports_local, HAL_MAX_PORTS);
exit(-1);
......@@ -232,15 +261,16 @@ int open_rtu_shm(void)
/* open rtu shm */
rtu_port_shmem = wrs_shm_get(wrs_shm_rtu, "", WRS_SHM_READ);
if (!rtu_port_shmem) {
printf("rtu_stat: %s: Can't join shmem: %s\n", __func__,
strerror(errno));
fprintf(stderr, "rtu_stat: %s: Can't join rtud's shmem: %s\n",
__func__, strerror(errno));
return -1;
}
/* check rtu shm version */
if (rtu_port_shmem->version != RTU_SHMEM_VERSION) {
printf("dump rtu: unknown version %i (known is %i)\n",
rtu_port_shmem->version, RTU_SHMEM_VERSION);
fprintf(stderr, "rtu_stat: unknown rtud's version %i "
"(known is %i)\n", rtu_port_shmem->version,
RTU_SHMEM_VERSION);
return -1;
}
return 0;
......@@ -253,21 +283,27 @@ int main(int argc, char **argv)
int htab_read_entries;
int vid_active = 0;
char mac_buf[ETH_ALEN_STR];
int n_wait = 0;
nports = get_nports_from_hal();
rtud_ch = minipc_client_create("rtud", 0);
if (!rtud_ch)
while (!(rtud_ch = minipc_client_create("rtud", 0)))
{
printf("Can't connect to RTUd mini-rpc server\n");
return -1;
if (n_wait > 5) {
/* Don't print first 5 times, it may take few seconds
* for rtud to start */
fprintf(stderr, "rtu_stat: Can't connect to RTUd "
"mini-rpc server\n");
}
n_wait++;
sleep(1);
}
minipc_set_logfile(rtud_ch,stderr);
/* Open rtud's shmem */
/* Open rtud's shmem, it should be available after connecting rtud's
* minipc */
if (open_rtu_shm()) {
printf("Can't open RTUd shmem\n");
fprintf(stderr, "rtu_stat: Can't open RTUd shmem\n");
return -1;
}
......
......@@ -75,12 +75,19 @@ void init_shm(void)
{
struct hal_shmem_header *h;
int ii;
int n_wait = 0;
/* wait forever for HAL */
while ((hal_head = wrs_shm_get(wrs_shm_hal, "",
WRS_SHM_READ | WRS_SHM_LOCKED))
== NULL) {
pr_info("unable to open shm for HAL!\n");
WRS_SHM_READ | WRS_SHM_LOCKED))) {
if (n_wait > 5) {
/* print if waiting more than 5 seconds, some waiting
* is expected since hal requires few seconds to start
*/
pr_error("unable to open shm for HAL!\n");
}
n_wait++;
sleep(1);
}
h = (void *)hal_head + hal_head->data_off;
......@@ -91,13 +98,19 @@ void init_shm(void)
hal_nports_local = h->nports;
if (!wrs_shm_seqretry(hal_head, ii))
break;
pr_error("Wait for HAL.\n");
if (n_wait > 5) {
/* print if waiting more than 10 seconds, some wait
* is expected since hal requires few seconds to start
*/
pr_error("Wait for HAL.\n");
}
n_wait++;
sleep(1);
}
/* check hal's shm version */
if (hal_head->version != HAL_SHMEM_VERSION) {
fprintf(stderr, "rtu_drv: unknown hal's shm version %i "
pr_error("unknown hal's shm version %i "
"(known is %i)\n",
hal_head->version, HAL_SHMEM_VERSION);
exit(-1);
......
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