if (!ref)
WILL_LJMP(luaL_error(L, "'del_acl': unknown acl file '%s'", name));
- HA_SPIN_LOCK(PATREF_LOCK, &ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ref->lock);
pat_ref_delete(ref, key);
- HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ref->lock);
return 0;
}
if (!ref)
WILL_LJMP(luaL_error(L, "'del_map': unknown acl file '%s'", name));
- HA_SPIN_LOCK(PATREF_LOCK, &ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ref->lock);
pat_ref_delete(ref, key);
- HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ref->lock);
return 0;
}
if (!ref)
WILL_LJMP(luaL_error(L, "'add_acl': unknown acl file '%s'", name));
- HA_SPIN_LOCK(PATREF_LOCK, &ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ref->lock);
if (pat_ref_find_elt(ref, key) == NULL)
pat_ref_add(ref, key, NULL, NULL);
- HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ref->lock);
return 0;
}
if (!ref)
WILL_LJMP(luaL_error(L, "'set_map': unknown map file '%s'", name));
- HA_SPIN_LOCK(PATREF_LOCK, &ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ref->lock);
if (pat_ref_find_elt(ref, key) != NULL)
pat_ref_set(ref, key, value, NULL, NULL);
else
pat_ref_add(ref, key, value, NULL);
- HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ref->lock);
return 0;
}
switch (rule->action) {
case 0: // add-acl
/* add entry only if it does not already exist */
- HA_SPIN_LOCK(PATREF_LOCK, &ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ref->lock);
if (pat_ref_find_elt(ref, key->area) == NULL)
pat_ref_add(ref, key->area, NULL, NULL);
- HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ref->lock);
break;
case 1: // set-map
value->data = build_logline(s, value->area, value->size, &rule->arg.map.value);
value->area[value->data] = '\0';
- HA_SPIN_LOCK(PATREF_LOCK, &ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ref->lock);
elt = pat_ref_find_elt(ref, key->area);
if (elt) {
/* update entry if it exists */
/* insert a new entry */
pat_ref_add(ref, key->area, value->area, NULL);
}
- HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ref->lock);
break;
}
case 2: // del-acl
case 3: // del-map
/* returned code: 1=ok, 0=ko */
- HA_SPIN_LOCK(PATREF_LOCK, &ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ref->lock);
pat_ref_delete(ref, key->area);
- HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ref->lock);
break;
default:
* reference to the last ref_elt being dumped.
*/
if (!LIST_ISEMPTY(&ctx->bref.users)) {
- HA_SPIN_LOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ctx->ref->lock);
LIST_DEL_INIT(&ctx->bref.users);
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ctx->ref->lock);
}
return 1;
}
__fallthrough;
case STATE_LIST:
- HA_SPIN_LOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ctx->ref->lock);
if (!LIST_ISEMPTY(&ctx->bref.users)) {
LIST_DELETE(&ctx->bref.users);
* this stream's users so that it can remove us upon termination.
*/
LIST_APPEND(&elt->back_refs, &ctx->bref.users);
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ctx->ref->lock);
return 0;
}
skip:
/* get next list entry and check the end of the list */
ctx->bref.ref = elt->list.n;
}
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ctx->ref->lock);
__fallthrough;
default:
__fallthrough;
case STATE_LIST:
- HA_SPIN_LOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_RDLOCK(PATREF_LOCK, &ctx->ref->lock);
/* for each lookup type */
while (ctx->expr) {
/* initialise chunk to build new message */
/* let's try again later from this stream. We add ourselves into
* this stream's users so that it can remove us upon termination.
*/
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_RDUNLOCK(PATREF_LOCK, &ctx->ref->lock);
return 0;
}
ctx->expr = pat_expr_get_next(ctx->expr,
&ctx->ref->pat);
}
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_RDUNLOCK(PATREF_LOCK, &ctx->ref->lock);
__fallthrough;
default:
struct show_map_ctx *ctx = appctx->svcctx;
if (!LIST_ISEMPTY(&ctx->bref.users)) {
- HA_SPIN_LOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ctx->ref->lock);
LIST_DEL_INIT(&ctx->bref.users);
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ctx->ref->lock);
}
}
/* Try to modify the entry. */
err = NULL;
- HA_SPIN_LOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ctx->ref->lock);
if (!pat_ref_set_by_id(ctx->ref, ref, args[4], &err)) {
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ctx->ref->lock);
if (err)
return cli_dynerr(appctx, memprintf(&err, "%s.\n", err));
else
return cli_err(appctx, "Failed to update an entry.\n");
}
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ctx->ref->lock);
}
else {
/* Else, use the entry identifier as pattern
* string, and update the value.
*/
err = NULL;
- HA_SPIN_LOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ctx->ref->lock);
if (!pat_ref_set(ctx->ref, args[3], args[4], &err, NULL)) {
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ctx->ref->lock);
if (err)
return cli_dynerr(appctx, memprintf(&err, "%s.\n", err));
else
return cli_err(appctx, "Failed to update an entry.\n");
}
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ctx->ref->lock);
}
/* The set is done, send message. */
if (ctx->display_flags != PAT_REF_MAP)
value = NULL;
- HA_SPIN_LOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ctx->ref->lock);
ret = !!pat_ref_load(ctx->ref, gen ? genid : ctx->ref->curr_gen, key, value, -1, &err);
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ctx->ref->lock);
if (!ret) {
if (err)
return cli_err(appctx, "Malformed identifier. Please use #<id> or <file>.\n");
/* Try to delete the entry. */
- HA_SPIN_LOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ctx->ref->lock);
if (!pat_ref_delete_by_id(ctx->ref, ref)) {
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ctx->ref->lock);
/* The entry is not found, send message. */
return cli_err(appctx, "Key not found.\n");
}
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ctx->ref->lock);
}
else {
/* Else, use the entry identifier as pattern
* string and try to delete the entry.
*/
- HA_SPIN_LOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ctx->ref->lock);
if (!pat_ref_delete(ctx->ref, args[3])) {
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ctx->ref->lock);
/* The entry is not found, send message. */
return cli_err(appctx, "Key not found.\n");
}
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ctx->ref->lock);
}
/* The deletion is done, send message. */
struct show_map_ctx *ctx = appctx->svcctx;
int finished;
- HA_SPIN_LOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ctx->ref->lock);
finished = pat_ref_purge_range(ctx->ref, ctx->curr_gen, ctx->prev_gen, 100);
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ctx->ref->lock);
if (!finished) {
/* let's come back later */
return cli_err(appctx, "Unknown ACL identifier. Please use #<id> or <file>.\n");
}
- HA_SPIN_LOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRLOCK(PATREF_LOCK, &ctx->ref->lock);
if (genid - (ctx->ref->curr_gen + 1) <
ctx->ref->next_gen - ctx->ref->curr_gen)
ret = pat_ref_commit(ctx->ref, genid);
else
ret = 1;
- HA_SPIN_UNLOCK(PATREF_LOCK, &ctx->ref->lock);
+ HA_RWLOCK_WRUNLOCK(PATREF_LOCK, &ctx->ref->lock);
if (ret != 0)
return cli_err(appctx, "Version number out of range.\n");