Lines Matching refs:ctx

58 errno_t sss_nss_check_header(struct sss_cli_mc_ctx *ctx)
69 (struct sss_mc_header *)ctx->mmap_base,
88 if (ctx->data_table == NULL) {
89 ctx->seed = h.seed;
90 ctx->data_table = MC_PTR_ADD(ctx->mmap_base, h.data_table);
91 ctx->hash_table = MC_PTR_ADD(ctx->mmap_base, h.hash_table);
92 ctx->dt_size = h.dt_size;
93 ctx->ht_size = h.ht_size;
95 if (ctx->seed != h.seed ||
96 ctx->data_table != MC_PTR_ADD(ctx->mmap_base, h.data_table) ||
97 ctx->hash_table != MC_PTR_ADD(ctx->mmap_base, h.hash_table) ||
98 ctx->dt_size != h.dt_size ||
99 ctx->ht_size != h.ht_size) {
104 ret = fstat(ctx->fd, &fdstat);
117 static void sss_nss_mc_destroy_ctx(struct sss_cli_mc_ctx *ctx)
119 uint32_t active_threads = ctx->active_threads;
121 if ((ctx->mmap_base != NULL) && (ctx->mmap_size != 0)) {
122 munmap(ctx->mmap_base, ctx->mmap_size);
124 if (ctx->fd != -1) {
125 close(ctx->fd);
127 memset(ctx, 0, sizeof(struct sss_cli_mc_ctx));
128 ctx->fd = -1;
131 ctx->active_threads = active_threads;
135 struct sss_cli_mc_ctx *ctx)
142 /* check if ctx is initialised by previous thread. */
143 if (ctx->initialized != UNINITIALIZED) {
144 ret = sss_nss_check_header(ctx);
154 ctx->fd = sss_open_cloexec(file, O_RDONLY, &ret);
155 if (ctx->fd == -1) {
159 ret = fstat(ctx->fd, &fdstat);
169 ctx->mmap_size = fdstat.st_size;
171 ctx->mmap_base = mmap(NULL, ctx->mmap_size,
172 PROT_READ, MAP_SHARED, ctx->fd, 0);
173 if (ctx->mmap_base == MAP_FAILED) {
178 ret = sss_nss_check_header(ctx);
183 ctx->initialized = INITIALIZED;
189 sss_nss_mc_destroy_ctx(ctx);
197 errno_t sss_nss_mc_get_ctx(const char *name, struct sss_cli_mc_ctx *ctx)
208 switch (ctx->initialized) {
210 __sync_add_and_fetch(&ctx->active_threads, 1);
211 ret = sss_nss_mc_init_ctx(name, ctx);
217 __sync_add_and_fetch(&ctx->active_threads, 1);
218 ret = sss_nss_check_header(ctx);
232 if (ctx->initialized == INITIALIZED) {
233 ctx->initialized = RECYCLED;
235 if (ctx->initialized == RECYCLED && ctx->active_threads == 0) {
238 if (ctx->initialized == RECYCLED) {
239 sss_nss_mc_destroy_ctx(ctx);
245 __sync_sub_and_fetch(&ctx->active_threads, 1);
251 uint32_t sss_nss_mc_hash(struct sss_cli_mc_ctx *ctx,
254 return murmurhash3(key, len, ctx->seed) % MC_HT_ELEMS(ctx->ht_size);
257 errno_t sss_nss_mc_get_record(struct sss_cli_mc_ctx *ctx,
272 rec = MC_SLOT_TO_PTR(ctx->data_table, slot, struct sss_mc_rec);
285 if (!MC_CHECK_RECORD_LENGTH(ctx, rec)) {