0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-11-08 12:18:42 +00:00

Conf: Yielding from cf_read

This commit is contained in:
Jan Maria Matejka 2018-09-14 14:17:25 +02:00
parent 4ec43aa137
commit 4cf2818c98
3 changed files with 23 additions and 5 deletions

View File

@ -215,11 +215,17 @@ config_parse(struct conf_order *order)
coro_resume(ctx->coro);
}
void config_yield(struct cf_context *ctx)
void config_yield(struct conf_order *order)
{
DBG("Conf: Yield\n");
ev_schedule(ctx->ev_resume);
DBG("Conf: Yield resumed\n");
if (order->flags & CO_SYNC)
return;
ASSERT(order->ctx);
ASSERT(order->ctx->ev_resume);
DBG("Conf %p: Yield\n", order);
ev_schedule(order->ctx->ev_resume);
coro_suspend();
DBG("Conf %p: Resumed\n", order);
}
/**

View File

@ -104,6 +104,9 @@ void config_parse(struct conf_order *order);
/** Callback for returning error from parser hooks */
void cf_error(struct cf_context *, const char *msg, ...) NORET;
/** Yield callable from conf_order callbacks */
void config_yield(struct conf_order *order);
void config_free(struct config *);
int config_commit(struct config *, int type, uint timeout);
int config_confirm(void);

View File

@ -110,6 +110,7 @@ sysdep_commit(struct config *new, struct config *old UNUSED)
#define MAX_INCLUDE_DEPTH 8
#define UCO struct unix_conf_order *uco = (struct unix_conf_order *) co
#define YIELD_AFTER 1048576
struct unix_conf_order {
struct conf_order co; /* First field of struct conf_order is resource r; */
@ -119,6 +120,7 @@ struct unix_conf_order {
event *ev; /* Start event if called from CLI */
int type; /* Type of reconfig */
uint timeout; /* Config timeout */
uint bytecount; /* Have read this number of bytes since last yield */
};
static void
@ -150,9 +152,14 @@ static int
unix_cf_read(struct conf_order *co, byte *dest, uint len)
{
UCO;
ASSERT(uco->ifs->state == co->state);
if (uco->bytecount > YIELD_AFTER)
{
uco->bytecount -= YIELD_AFTER;
config_yield(co);
}
if (uco->ifs->fd == -1)
uco->ifs->fd = open(co->state->name, O_RDONLY);
@ -169,6 +176,8 @@ unix_cf_read(struct conf_order *co, byte *dest, uint len)
int l = read(uco->ifs->fd, dest, len);
if (l < 0)
cf_error(co->ctx, "Read error: %m");
uco->bytecount += l;
return l;
}