Lines Matching full:ci
93 close_shared(struct _citrus_iconv_shared *ci) in close_shared() argument
96 if (ci) { in close_shared()
97 if (ci->ci_module) { in close_shared()
98 if (ci->ci_ops) { in close_shared()
99 if (ci->ci_closure) in close_shared()
100 (*ci->ci_ops->io_uninit_shared)(ci); in close_shared()
101 free(ci->ci_ops); in close_shared()
103 _citrus_unload_module(ci->ci_module); in close_shared()
105 free(ci); in close_shared()
114 struct _citrus_iconv_shared *ci; in open_shared() local
142 ci = calloc(1, sizeof(*ci) + len_convname + 1); in open_shared()
143 if (!ci) { in open_shared()
147 ci->ci_convname = (void *)&ci[1]; in open_shared()
148 memcpy(ci->ci_convname, convname, len_convname + 1); in open_shared()
151 ret = _citrus_load_module(&ci->ci_module, module); in open_shared()
156 getops = (_citrus_iconv_getops_t)_citrus_find_getops(ci->ci_module, in open_shared()
162 ci->ci_ops = malloc(sizeof(*ci->ci_ops)); in open_shared()
163 if (!ci->ci_ops) { in open_shared()
167 ret = (*getops)(ci->ci_ops); in open_shared()
171 if (ci->ci_ops->io_init_shared == NULL || in open_shared()
172 ci->ci_ops->io_uninit_shared == NULL || in open_shared()
173 ci->ci_ops->io_init_context == NULL || in open_shared()
174 ci->ci_ops->io_uninit_context == NULL || in open_shared()
175 ci->ci_ops->io_convert == NULL) { in open_shared()
181 ret = (*ci->ci_ops->io_init_shared)(ci, src, dst); in open_shared()
185 *rci = ci; in open_shared()
189 close_shared(ci); in open_shared()
201 match_func(struct _citrus_iconv_shared * __restrict ci, in match_func() argument
205 return (strcmp(ci->ci_convname, key)); in match_func()
212 struct _citrus_iconv_shared * ci; in get_shared() local
222 _CITRUS_HASH_SEARCH(&shared_pool, ci, ci_hash_entry, match_func, in get_shared()
224 if (ci != NULL) { in get_shared()
226 if (ci->ci_used_count == 0) { in get_shared()
227 TAILQ_REMOVE(&shared_unused, ci, ci_tailq_entry); in get_shared()
230 ci->ci_used_count++; in get_shared()
231 *rci = ci; in get_shared()
236 ret = open_shared(&ci, convname, src, dst); in get_shared()
240 _CITRUS_HASH_INSERT(&shared_pool, ci, ci_hash_entry, hashval); in get_shared()
241 ci->ci_used_count = 1; in get_shared()
242 *rci = ci; in get_shared()
251 release_shared(struct _citrus_iconv_shared * __restrict ci) in release_shared() argument
255 ci->ci_used_count--; in release_shared()
256 if (ci->ci_used_count == 0) { in release_shared()
259 TAILQ_INSERT_TAIL(&shared_unused, ci, ci_tailq_entry); in release_shared()
262 ci = TAILQ_FIRST(&shared_unused); in release_shared()
263 TAILQ_REMOVE(&shared_unused, ci, ci_tailq_entry); in release_shared()
264 _CITRUS_HASH_REMOVE(ci, ci_hash_entry); in release_shared()
266 close_shared(ci); in release_shared()
282 struct _citrus_iconv_shared *ci = NULL; in _citrus_iconv_open() local
323 ret = get_shared(&ci, realsrc, realdst); in _citrus_iconv_open()
332 release_shared(ci); in _citrus_iconv_open()
337 (*rcv)->cv_shared = ci; in _citrus_iconv_open()
338 ret = (*ci->ci_ops->io_init_context)(*rcv); in _citrus_iconv_open()
340 release_shared(ci); in _citrus_iconv_open()