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);
}
/**
/** 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);
#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; */
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
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);
int l = read(uco->ifs->fd, dest, len);
if (l < 0)
cf_error(co->ctx, "Read error: %m");
+
+ uco->bytecount += l;
return l;
}