Home | History | Annotate | Download | only in citrus

Lines Matching refs:ci

139 close_shared(struct _citrus_iconv_shared *ci)
141 if (ci) {
142 if (ci->ci_module) {
143 if (ci->ci_ops) {
144 if (ci->ci_closure)
145 (*ci->ci_ops->io_uninit_shared)(ci);
146 free(ci->ci_ops);
148 _citrus_unload_module(ci->ci_module);
150 free(ci);
160 struct _citrus_iconv_shared *ci;
181 ci = malloc(sizeof(*ci)+len_convname+1);
182 if (!ci) {
186 ci->ci_module = NULL;
187 ci->ci_ops = NULL;
188 ci->ci_closure = NULL;
189 ci->ci_convname = (void *)&ci[1];
190 memcpy(ci->ci_convname, convname, len_convname+1);
193 ret = _citrus_load_module(&ci->ci_module, module);
199 _citrus_find_getops(ci->ci_module, module, "iconv");
204 ci->ci_ops = malloc(sizeof(*ci->ci_ops));
205 if (!ci->ci_ops) {
209 ret = (*getops)(ci->ci_ops, sizeof(*ci->ci_ops),
215 if (ci->ci_ops->io_abi_version == 1) {
221 if (ci->ci_ops->io_init_shared == NULL ||
222 ci->ci_ops->io_uninit_shared == NULL ||
223 ci->ci_ops->io_init_context == NULL ||
224 ci->ci_ops->io_uninit_context == NULL ||
225 ci->ci_ops->io_convert == NULL) {
231 ret = (*ci->ci_ops->io_init_shared)(ci, basedir, src, dst,
237 *rci = ci;
241 close_shared(ci);
252 match_func(struct _citrus_iconv_shared * __restrict ci,
255 return strcmp(ci->ci_convname, key);
264 struct _citrus_iconv_shared * ci;
273 _CITRUS_HASH_SEARCH(&shared_pool, ci, ci_hash_entry, match_func,
275 if (ci != NULL) {
277 if (ci->ci_used_count == 0) {
278 TAILQ_REMOVE(&shared_unused, ci, ci_tailq_entry);
281 ci->ci_used_count++;
282 *rci = ci;
287 ret = open_shared(&ci, basedir, convname, src, dst);
291 _CITRUS_HASH_INSERT(&shared_pool, ci, ci_hash_entry, hashval);
292 ci->ci_used_count = 1;
293 *rci = ci;
302 release_shared(struct _citrus_iconv_shared * __restrict ci)
306 ci->ci_used_count--;
307 if (ci->ci_used_count == 0) {
310 TAILQ_INSERT_TAIL(&shared_unused, ci, ci_tailq_entry);
313 ci = TAILQ_FIRST(&shared_unused);
314 _DIAGASSERT(ci != NULL);
315 TAILQ_REMOVE(&shared_unused, ci, ci_tailq_entry);
316 _CITRUS_HASH_REMOVE(ci, ci_hash_entry);
318 close_shared(ci);
335 struct _citrus_iconv_shared *ci = NULL;
358 ret = get_shared(&ci, basedir, realsrc, realdst);
366 release_shared(ci);
369 cv->cv_shared = ci;
370 ret = (*ci->ci_ops->io_init_context)(cv);
372 release_shared(ci);