参照元

説明

引数

返り値

参考

実装

void *snd_dlobj_cache_get(const char *lib, const char *name,
			  const char *version, int verbose)
{
	struct list_head *p;
	struct dlobj_cache *c;
	void *func, *dlobj;
	snd_dlobj_lock();
	list_for_each(p, &pcm_dlobj_list) {
		c = list_entry(p, struct dlobj_cache, list);
		if (c->lib && lib && strcmp(c->lib, lib) != 0)
			continue;
		if (!c->lib && lib)
			continue;
		if (!lib && c->lib)
			continue;
		if (strcmp(c->name, name) == 0) {
			c->refcnt++;
			func = c->func;
			snd_dlobj_unlock();
			return func;
		}
	}
	dlobj = snd_dlopen(lib, RTLD_NOW);
	if (dlobj == NULL) {
		if (verbose)
			SNDERR("Cannot open shared library %s",
						lib ? lib : "[builtin]");
		snd_dlobj_unlock();
		return NULL;
	}
	func = snd_dlsym(dlobj, name, version);
	if (func == NULL) {
		if (verbose)
			SNDERR("symbol %s is not defined inside %s",
					name, lib ? lib : "[builtin]");
		goto __err;
	}
	c = malloc(sizeof(*c));
	if (! c)
		goto __err;
	c->refcnt = 1;
	c->lib = lib ? strdup(lib) : NULL;
	c->name = strdup(name);
	if ((lib && ! c->lib) || ! c->name) {
		free((void *)c->name);
		free((void *)c->lib);
		free(c);
	      __err:
		snd_dlclose(dlobj);
		snd_dlobj_unlock();
		return NULL;
	}
	c->dlobj = dlobj;
	c->func = func;
	list_add_tail(&c->list, &pcm_dlobj_list);
	snd_dlobj_unlock();
	return func;
}

コメント


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-09-13 (土) 08:26:38