Skip to content

Commit 05e73b4

Browse files
committed
context UPDATE move some data from priv to shared
1 parent 12d0058 commit 05e73b4

File tree

8 files changed

+287
-115
lines changed

8 files changed

+287
-115
lines changed

src/context.c

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,7 @@ LIBYANG_API_DEF LY_ERR
614614
ly_ctx_set_options(struct ly_ctx *ctx, uint32_t option)
615615
{
616616
LY_ERR lyrc = LY_SUCCESS;
617-
struct ly_ctx_private_data *ctx_data;
617+
struct ly_ctx_shared_data *ctx_data;
618618
struct lys_module *mod;
619619
uint32_t i;
620620

@@ -637,7 +637,8 @@ ly_ctx_set_options(struct ly_ctx *ctx, uint32_t option)
637637
}
638638

639639
if (!(ctx->opts & LY_CTX_LEAFREF_LINKING) && (option & LY_CTX_LEAFREF_LINKING)) {
640-
ctx_data = ly_ctx_private_data_get(ctx);
640+
/* context is not printed (ctx data cant be shared with any other ctx), so no need to hold a lock */
641+
ctx_data = ly_ctx_shared_data_get(ctx);
641642
ctx_data->leafref_links_ht = lyht_new(1, sizeof(struct lyd_leafref_links_rec *), ly_ctx_ht_leafref_links_equal_cb, NULL, 1);
642643
LY_CHECK_ERR_RET(!ctx_data->leafref_links_ht, LOGARG(ctx, option), LY_EMEM);
643644
}
@@ -699,13 +700,14 @@ ly_ctx_unset_options(struct ly_ctx *ctx, uint32_t option)
699700
LY_ARRAY_COUNT_TYPE u, v;
700701
const struct lysc_ext_instance *ext;
701702
struct lysc_node *root;
702-
struct ly_ctx_private_data *ctx_data;
703+
struct ly_ctx_shared_data *ctx_data;
703704

704705
LY_CHECK_ARG_RET(ctx, ctx, !(ctx->opts & LY_CTX_INT_IMMUTABLE), LY_EINVAL);
705706
LY_CHECK_ERR_RET(option & LY_CTX_NO_YANGLIBRARY, LOGARG(ctx, option), LY_EINVAL);
706707

707708
if ((ctx->opts & LY_CTX_LEAFREF_LINKING) && (option & LY_CTX_LEAFREF_LINKING)) {
708-
ctx_data = ly_ctx_private_data_get(ctx);
709+
/* context is not printed (ctx data cant be shared with any other ctx), so no need to hold a lock */
710+
ctx_data = ly_ctx_shared_data_get(ctx);
709711
lyht_free(ctx_data->leafref_links_ht, ly_ctx_ht_leafref_links_rec_free);
710712
ctx_data->leafref_links_ht = NULL;
711713
}
@@ -828,16 +830,23 @@ ly_ctx_set_module_imp_clb(struct ly_ctx *ctx, ly_module_imp_clb clb, void *user_
828830
LIBYANG_API_DEF ly_ext_data_clb
829831
ly_ctx_set_ext_data_clb(const struct ly_ctx *ctx, ly_ext_data_clb clb, void *user_data)
830832
{
831-
struct ly_ctx_private_data *ctx_data;
833+
struct ly_ctx_shared_data *ctx_data;
832834
ly_ext_data_clb prev;
833835

834836
LY_CHECK_ARG_RET(ctx, ctx, NULL);
835837

836-
ctx_data = ly_ctx_private_data_get(ctx);
838+
ctx_data = ly_ctx_shared_data_get(ctx);
839+
840+
/* EXT CLB LOCK */
841+
pthread_mutex_lock(&ctx_data->ext_clb_lock);
842+
837843
prev = ctx_data->ext_clb;
838844
ctx_data->ext_clb = clb;
839845
ctx_data->ext_clb_data = user_data;
840846

847+
/* EXT CLB UNLOCK */
848+
pthread_mutex_unlock(&ctx_data->ext_clb_lock);
849+
841850
return prev;
842851
}
843852

src/log.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,8 @@ ly_err_first(const struct ly_ctx *ctx)
183183

184184
LY_CHECK_ARG_RET(NULL, ctx, NULL);
185185

186-
ctx_data = ly_ctx_private_data_get(ctx);
186+
ctx_data = ly_ctx_private_data_get_or_create(ctx);
187+
LY_CHECK_RET(!ctx_data, NULL);
187188
return ctx_data->errs;
188189
}
189190

@@ -194,7 +195,8 @@ ly_err_last(const struct ly_ctx *ctx)
194195

195196
LY_CHECK_ARG_RET(NULL, ctx, NULL);
196197

197-
ctx_data = ly_ctx_private_data_get(ctx);
198+
ctx_data = ly_ctx_private_data_get_or_create(ctx);
199+
LY_CHECK_RET(!ctx_data, NULL);
198200
return ctx_data->errs ? ctx_data->errs->prev : NULL;
199201
}
200202

@@ -205,12 +207,12 @@ ly_err_move(struct ly_ctx *src_ctx, struct ly_ctx *trg_ctx)
205207
struct ly_err_item *errs = NULL;
206208

207209
/* get src context errs */
208-
src_data = ly_ctx_private_data_get(src_ctx);
210+
src_data = ly_ctx_private_data_get_or_create(src_ctx);
209211
errs = src_data->errs;
210212
src_data->errs = NULL;
211213

212214
/* get and free the trg context errs */
213-
trg_data = ly_ctx_private_data_get(trg_ctx);
215+
trg_data = ly_ctx_private_data_get_or_create(trg_ctx);
214216
ly_err_free(trg_data->errs);
215217

216218
/* set them for trg */
@@ -243,7 +245,7 @@ ly_err_clean(const struct ly_ctx *ctx, struct ly_err_item *eitem)
243245
return;
244246
}
245247

246-
ctx_data = ly_ctx_private_data_get(ctx);
248+
ctx_data = ly_ctx_private_data_get_or_create(ctx);
247249
if (ctx_data->errs == eitem) {
248250
eitem = NULL;
249251
}
@@ -412,7 +414,8 @@ log_store(const struct ly_ctx *ctx, LY_LOG_LEVEL level, LY_ERR err, LY_VECODE ve
412414
assert(ctx && (level < LY_LLVRB));
413415

414416
/* get context private data */
415-
ctx_data = ly_ctx_private_data_get(ctx);
417+
ctx_data = ly_ctx_private_data_get_or_create(ctx);
418+
LY_CHECK_GOTO(!ctx_data, mem_fail);
416419

417420
e = ctx_data->errs;
418421
if (!e) {

0 commit comments

Comments
 (0)