0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-11-15 07:38:43 +00:00

CLI: Sleep

Sometimes CLI waits for another routine to finish. In these cases,
we shouldn't resume its run until it is explicitly woken up.

Adding the appropriate calls.
This commit is contained in:
Jan Maria Matejka 2018-09-13 13:24:49 +02:00
parent a0bd04c04a
commit d1f33012e1
2 changed files with 24 additions and 2 deletions

View File

@ -64,7 +64,7 @@
* and its outpos field is the position of the read head. * and its outpos field is the position of the read head.
*/ */
#define LOCAL_DEBUG 1 #undef LOCAL_DEBUG
#include "nest/bird.h" #include "nest/bird.h"
#include "nest/cli.h" #include "nest/cli.h"
@ -243,6 +243,7 @@ cli_free_out(cli *c)
static void static void
cli_write(cli *c) cli_write(cli *c)
{ {
DBG("CLI write begin\n");
sock *s = c->socket; sock *s = c->socket;
while (c->tx_pos) while (c->tx_pos)
@ -261,7 +262,7 @@ cli_write(cli *c)
/* Everything is written */ /* Everything is written */
s->tbuf = NULL; s->tbuf = NULL;
cli_free_out(c); cli_free_out(c);
ev_schedule(c->event); DBG("CLI write done\n");
} }
void void
@ -484,6 +485,24 @@ cli_yield(cli *c)
DBG("CLI: Yield resumed\n"); DBG("CLI: Yield resumed\n");
} }
void
cli_sleep(cli *c)
{
c->state = CLI_STATE_SLEEP;
DBG("CLI: Sleeping\n");
coro_suspend();
c->state = CLI_STATE_RUN;
DBG("CLI: Woken up\n");
}
void
cli_wakeup(cli *c)
{
ASSERT(c->state == CLI_STATE_SLEEP);
c->state = CLI_STATE_YIELD;
ev_schedule(c->event);
}
static void static void
cli_coroutine(void *_c) cli_coroutine(void *_c)
{ {

View File

@ -33,6 +33,7 @@ enum cli_state {
CLI_STATE_WAIT_RX, CLI_STATE_WAIT_RX,
CLI_STATE_WAIT_TX, CLI_STATE_WAIT_TX,
CLI_STATE_YIELD, CLI_STATE_YIELD,
CLI_STATE_SLEEP,
}; };
typedef struct cli { typedef struct cli {
@ -79,6 +80,8 @@ void cli_printf(cli *, int, char *, ...);
void cli_write_trigger(cli *c); void cli_write_trigger(cli *c);
void cli_set_log_echo(cli *, uint mask, uint size); void cli_set_log_echo(cli *, uint mask, uint size);
void cli_yield(cli *c); void cli_yield(cli *c);
void cli_sleep(cli *c);
void cli_wakeup(cli *c);
/* Functions provided to sysdep layer */ /* Functions provided to sysdep layer */