Commit 92ab4c1f authored by Adam Wujek's avatar Adam Wujek 💬

userspace/tools: add waiting for hal and rtud to be ready in rtu_stat

rtu_stat has to wait for hal and rtud to be ready.
It waits for hal's shmem and rtud's minipc connection. There is no need to
wait for rtud's shmem since it is initialized before ipc server is available.

Additionally few minor changes in printouts.
Signed-off-by: Adam Wujek's avatarAdam Wujek <adam.wujek@cern.ch>
parent c552ec92
......@@ -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;
}
......
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