Commit 50c4a935 authored by Geoff Simmons's avatar Geoff Simmons

vcl_init PRIV_TASK only needs to save the PRIV_VCL object once.

parent 749b0a4a
...@@ -108,12 +108,18 @@ struct set_init_task { ...@@ -108,12 +108,18 @@ struct set_init_task {
#define SET_INIT_TASK_MAGIC 0xeae8c785 #define SET_INIT_TASK_MAGIC 0xeae8c785
VSLIST_ENTRY(set_init_task) list; VSLIST_ENTRY(set_init_task) list;
struct vmod_selector_set *set; struct vmod_selector_set *set;
struct vsc_head *vsc_head;
unsigned create_stats; unsigned create_stats;
}; };
VSLIST_HEAD(set_init_head, set_init_task); VSLIST_HEAD(set_init_head, set_init_task);
struct set_init_priv {
unsigned magic;
#define SET_INIT_PRIV_MAGIC 0x525e8fef
struct set_init_head *task_head;
struct vsc_head *vsc_head;
};
/* Event function */ /* Event function */
int int
...@@ -340,27 +346,28 @@ create_stats(VRT_CTX, struct vmod_selector_set *set, struct vsc_head *vsc_head) ...@@ -340,27 +346,28 @@ create_stats(VRT_CTX, struct vmod_selector_set *set, struct vsc_head *vsc_head)
} }
static void static void
set_complete_init(VRT_CTX, void *priv) set_complete_init(VRT_CTX, void *priv_task)
{ {
struct set_init_head *head; struct set_init_priv *priv;
struct set_init_task *task; struct set_init_task *task;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
AN(priv); priv = priv_task;
head = priv; CHECK_OBJ_NOTNULL(priv, SET_INIT_PRIV_MAGIC);
AZ(VSLIST_EMPTY(head)); AN(priv->vsc_head);
AN(priv->task_head);
AZ(VSLIST_EMPTY(priv->task_head));
VSLIST_FOREACH(task, head, list) { VSLIST_FOREACH(task, priv->task_head, list) {
CHECK_OBJ_NOTNULL(task, SET_INIT_TASK_MAGIC); CHECK_OBJ_NOTNULL(task, SET_INIT_TASK_MAGIC);
CHECK_OBJ_NOTNULL(task->set, VMOD_SELECTOR_SET_MAGIC); CHECK_OBJ_NOTNULL(task->set, VMOD_SELECTOR_SET_MAGIC);
AN(task->vsc_head);
if (task->set->hash == NULL) if (task->set->hash == NULL)
if (compile(ctx, task->set, " set initialization") != 0) if (compile(ctx, task->set, " set initialization") != 0)
return; return;
if (task->create_stats) if (task->create_stats)
create_stats(ctx, task->set, task->vsc_head); create_stats(ctx, task->set, priv->vsc_head);
} }
} }
...@@ -376,7 +383,7 @@ vmod_set__init(VRT_CTX, struct vmod_selector_set **setp, const char *vcl_name, ...@@ -376,7 +383,7 @@ vmod_set__init(VRT_CTX, struct vmod_selector_set **setp, const char *vcl_name,
VCL_BOOL case_sensitive, VCL_BOOL allow_overlaps) VCL_BOOL case_sensitive, VCL_BOOL allow_overlaps)
{ {
struct vmod_selector_set *set; struct vmod_selector_set *set;
struct set_init_head *task_head; struct set_init_priv *init_priv;
struct set_init_task *task; struct set_init_task *task;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
...@@ -404,20 +411,31 @@ vmod_set__init(VRT_CTX, struct vmod_selector_set **setp, const char *vcl_name, ...@@ -404,20 +411,31 @@ vmod_set__init(VRT_CTX, struct vmod_selector_set **setp, const char *vcl_name,
} }
if (priv_task->priv == NULL) { if (priv_task->priv == NULL) {
if ((task_head = WS_Alloc(ctx->ws, sizeof(*task_head))) if ((init_priv = WS_Alloc(ctx->ws, sizeof(*init_priv)))
== NULL) {
VERRNOMEM(ctx, "insufficient workspace for task "
"private data initializing %s", vcl_name);
return;
}
INIT_OBJ(init_priv, SET_INIT_PRIV_MAGIC);
if ((init_priv->task_head
= WS_Alloc(ctx->ws, sizeof(*init_priv->task_head)))
== NULL) { == NULL) {
VERRNOMEM(ctx, "insufficient workspace for task " VERRNOMEM(ctx, "insufficient workspace for task "
"head initializing %s", vcl_name); "head initializing %s", vcl_name);
return; return;
} }
VSLIST_INIT(task_head); VSLIST_INIT(init_priv->task_head);
priv_task->priv = task_head; init_priv->vsc_head = priv_vcl->priv;
priv_task->len = sizeof(*task); priv_task->priv = init_priv;
priv_task->len = sizeof(*init_priv);
priv_task->methods = set_init; priv_task->methods = set_init;
} }
else { else {
AN(priv_task->methods); init_priv = priv_task->priv;
task_head = priv_task->priv; CHECK_OBJ_NOTNULL(init_priv, SET_INIT_PRIV_MAGIC);
AN(init_priv->task_head);
AN(init_priv->vsc_head);
} }
if ((task = WS_Alloc(ctx->ws, sizeof(*task))) == NULL) { if ((task = WS_Alloc(ctx->ws, sizeof(*task))) == NULL) {
...@@ -425,11 +443,10 @@ vmod_set__init(VRT_CTX, struct vmod_selector_set **setp, const char *vcl_name, ...@@ -425,11 +443,10 @@ vmod_set__init(VRT_CTX, struct vmod_selector_set **setp, const char *vcl_name,
vcl_name); vcl_name);
return; return;
} }
task->magic = SET_INIT_TASK_MAGIC; INIT_OBJ(task, SET_INIT_TASK_MAGIC);
task->set = set; task->set = set;
task->vsc_head = priv_vcl->priv; AZ(task->create_stats);
task->create_stats = 0; VSLIST_INSERT_HEAD(init_priv->task_head, task, list);
VSLIST_INSERT_HEAD(task_head, task, list);
AZ(set->table); AZ(set->table);
AZ(set->members); AZ(set->members);
...@@ -1060,8 +1077,8 @@ VCL_VOID ...@@ -1060,8 +1077,8 @@ VCL_VOID
vmod_set_create_stats(VRT_CTX, struct vmod_selector_set *set, vmod_set_create_stats(VRT_CTX, struct vmod_selector_set *set,
struct vmod_priv *priv) struct vmod_priv *priv)
{ {
struct set_init_task *task; struct set_init_priv *init_priv;
struct set_init_head *task_head; struct set_init_task *task = NULL;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(set, VMOD_SELECTOR_SET_MAGIC); CHECK_OBJ_NOTNULL(set, VMOD_SELECTOR_SET_MAGIC);
...@@ -1073,10 +1090,11 @@ vmod_set_create_stats(VRT_CTX, struct vmod_selector_set *set, ...@@ -1073,10 +1090,11 @@ vmod_set_create_stats(VRT_CTX, struct vmod_selector_set *set,
} }
AN(priv); AN(priv);
AN(priv->priv); AN(priv->priv);
task_head = priv->priv; init_priv = priv->priv;
AZ(VSLIST_EMPTY(task_head)); CHECK_OBJ_NOTNULL(init_priv, SET_INIT_PRIV_MAGIC);
AZ(VSLIST_EMPTY(init_priv->task_head));
VSLIST_FOREACH(task, task_head, list) { VSLIST_FOREACH(task, init_priv->task_head, list) {
CHECK_OBJ_NOTNULL(task, SET_INIT_TASK_MAGIC); CHECK_OBJ_NOTNULL(task, SET_INIT_TASK_MAGIC);
CHECK_OBJ_NOTNULL(task->set, VMOD_SELECTOR_SET_MAGIC); CHECK_OBJ_NOTNULL(task->set, VMOD_SELECTOR_SET_MAGIC);
if (task->set == set) if (task->set == set)
......
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