* Taeheon Kim <th908.kim@samsung.com>,
* YoungJun Cho <yj44.cho@samsung.com>,
* SooChan Lim <sc1.lim@samsung.com>,
- * Boram Park <sc1.lim@samsung.com>
+ * Boram Park <boram1288.park@samsung.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
#define TDM_CONFIG_FILENAME "tdm.ini"
#define TDM_CONFIG_GENERAL_SECTION "general"
+static pthread_mutex_t g_dic_lock = PTHREAD_MUTEX_INITIALIZER;
static dictionary *g_dic = NULL;
-static pthread_mutex_t g_dic_lock;
+static int init_dic = 0;
static int
_tdm_config_check_file_owner(const char *filepath)
const char *path;
int level;
- level = tdm_config_get_int(TDM_CONFIG_KEY_DEBUG_LOG_LEVEL, 3);
+ pthread_mutex_unlock(&g_dic_lock);
+
+ level = tdm_config_get_int(TDM_CONFIG_KEY_DEBUG_LOG_LEVEL, -1);
+ if (level == -1) {
+ const char *str = getenv("TDM_DEBUG_LEVEL");
+ if (str)
+ level = str[0] - '0';
+ else
+ level = 3;
+ }
tdm_log_set_debug_level(level);
- level = tdm_config_get_int(TDM_CONFIG_KEY_DEBUG_ASSERT_LEVEL, 0);
+ level = tdm_config_get_int(TDM_CONFIG_KEY_DEBUG_ASSERT_LEVEL, -1);
+ if (level == -1) {
+ const char *str = getenv("TDM_ASSERT_LEVEL");
+ if (str)
+ level = str[0] - '0';
+ else
+ level = 0;
+ }
tdm_log_set_assert_level(level);
/* if TDM_CONFIG_KEY_DEBUG_LOG_PATH is setted, TDM_CONFIG_KEY_DEBUG_DLOG will be ignored. */
tdm_log_enable_dlog(0);
tdm_log_set_path(path);
} else {
- int dlog = tdm_config_get_int(TDM_CONFIG_KEY_DEBUG_DLOG, 1);
+ int dlog = tdm_config_get_int(TDM_CONFIG_KEY_DEBUG_DLOG, -1);
+ if (dlog == -1) {
+ const char *str = getenv("TDM_DLOG");
+ if (str)
+ dlog = (str[0] == '1') ? 1 : 0;
+ else
+ dlog = 1;
+ }
tdm_log_enable_dlog(dlog);
}
+
+ pthread_mutex_lock(&g_dic_lock);
}
-INTERN tdm_error
-tdm_config_init(void)
+static void
+_tdm_config_check_init(void)
{
- if (g_dic) {
- TDM_ERR("init failed: twice");
- return TDM_ERROR_OPERATION_FAILED;
- }
+ if (init_dic)
+ return;
- if (pthread_mutex_init(&g_dic_lock, NULL)) {
- TDM_ERR("mutex init failed: %m");
- return TDM_ERROR_OUT_OF_MEMORY;
- }
+ init_dic = 1;
g_dic = _tdm_config_load_file(TDM_DATA_PATH, TDM_CONFIG_FILENAME);
_tdm_config_check_logs();
- TDM_INFO("tdm config init done (%p)", g_dic);
-
- return TDM_ERROR_NONE;
+ TDM_INFO("tdm config init %s (%p)", (g_dic) ? "successed" : "failed", g_dic);
}
INTERN void
tdm_config_deinit(void)
{
+ pthread_mutex_lock(&g_dic_lock);
+
if (!g_dic) {
+ pthread_mutex_unlock(&g_dic_lock);
return;
}
iniparser_freedict(g_dic);
g_dic = NULL;
-
- /* we don't need to lock/unlock here because we come here
- * after tdm_thread has been destroyed
- */
- pthread_mutex_destroy(&g_dic_lock);
+ init_dic = 0;
TDM_INFO("tdm config deinit done");
+
+ pthread_mutex_unlock(&g_dic_lock);
}
static const char*
return result;
}
-INTERN int
+EXTERN int
tdm_config_get_int(const char *key, int default_value)
{
const char *result;
TDM_RETURN_VAL_IF_FAIL(key != NULL, default_value);
+ pthread_mutex_lock(&g_dic_lock);
+
+ _tdm_config_check_init();
if (!g_dic) {
TDM_INFO("%s = %d: default", key, default_value);
+ pthread_mutex_unlock(&g_dic_lock);
return default_value;
}
- pthread_mutex_lock(&g_dic_lock);
result = _tdm_config_get_string_internal(g_dic, key, NULL);
pthread_mutex_unlock(&g_dic_lock);
return value;
}
-INTERN const char*
+EXTERN const char*
tdm_config_get_string(const char *key, const char *default_value)
{
const char *result;
TDM_RETURN_VAL_IF_FAIL(key != NULL, default_value);
+ pthread_mutex_lock(&g_dic_lock);
+
+ _tdm_config_check_init();
if (!g_dic) {
TDM_INFO("%s = %s: default", key, default_value);
+ pthread_mutex_unlock(&g_dic_lock);
return default_value;
}
- pthread_mutex_lock(&g_dic_lock);
result = _tdm_config_get_string_internal(g_dic, key, default_value);
pthread_mutex_unlock(&g_dic_lock);
return result;
}
-INTERN tdm_error
+EXTERN tdm_error
tdm_config_set_int(const char *key, int value)
{
char temp[TDM_NAME_LEN];
TDM_RETURN_VAL_IF_FAIL(key != NULL, TDM_ERROR_INVALID_PARAMETER);
+ snprintf(temp, sizeof temp, "%d", value);
+
+ pthread_mutex_lock(&g_dic_lock);
+
+ _tdm_config_check_init();
if (!g_dic) {
TDM_INFO("%s = %d set failed", key, value);
+ pthread_mutex_unlock(&g_dic_lock);
return TDM_ERROR_BAD_REQUEST;
}
- snprintf(temp, sizeof temp, "%d", value);
-
- pthread_mutex_lock(&g_dic_lock);
ret = iniparser_set(g_dic, key, (const char*)temp);
- _tdm_config_check_logs();
-
pthread_mutex_unlock(&g_dic_lock);
TDM_RETURN_VAL_IF_FAIL(ret == 0, TDM_ERROR_OPERATION_FAILED);
return TDM_ERROR_NONE;
}
-INTERN tdm_error
+EXTERN tdm_error
tdm_config_set_string(const char *key, const char *value)
{
int ret;
TDM_RETURN_VAL_IF_FAIL(key != NULL, TDM_ERROR_INVALID_PARAMETER);
+ pthread_mutex_lock(&g_dic_lock);
+
+ _tdm_config_check_init();
if (!g_dic) {
TDM_INFO("%s = %s set failed", key, value);
+ pthread_mutex_unlock(&g_dic_lock);
return TDM_ERROR_BAD_REQUEST;
}
- pthread_mutex_lock(&g_dic_lock);
ret = iniparser_set(g_dic, key, value);
- _tdm_config_check_logs();
-
pthread_mutex_unlock(&g_dic_lock);
TDM_RETURN_VAL_IF_FAIL(ret == 0, TDM_ERROR_OPERATION_FAILED);