#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
_tdm_config_check_file_owner(const char *filepath)
const char *path;
int level;
+ pthread_mutex_unlock(&g_dic_lock);
+
level = tdm_config_get_int(TDM_CONFIG_KEY_DEBUG_LOG_LEVEL, 3);
tdm_log_set_debug_level(level);
int dlog = tdm_config_get_int(TDM_CONFIG_KEY_DEBUG_DLOG, 1);
tdm_log_enable_dlog(dlog);
}
+
+ pthread_mutex_lock(&g_dic_lock);
}
-INTERN tdm_error
-tdm_config_init(void)
+static unsigned int
+_tdm_config_check_init(void)
{
- if (g_dic) {
- TDM_ERR("init failed: twice");
- return TDM_ERROR_OPERATION_FAILED;
- }
-
- if (pthread_mutex_init(&g_dic_lock, NULL)) {
- TDM_ERR("mutex init failed: %m");
- return TDM_ERROR_OUT_OF_MEMORY;
- }
+ if (g_dic)
+ return 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);
+ TDM_INFO("tdm config init %s (%p)", (g_dic) ? "successed" : "failed", g_dic);
- return TDM_ERROR_NONE;
+ return (g_dic) ? 1 : 0;
}
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);
-
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);
- if (!g_dic) {
+ pthread_mutex_lock(&g_dic_lock);
+
+ if (!_tdm_config_check_init()) {
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);
- if (!g_dic) {
+ pthread_mutex_lock(&g_dic_lock);
+
+ if (!_tdm_config_check_init()) {
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);
- if (!g_dic) {
+ snprintf(temp, sizeof temp, "%d", value);
+
+ pthread_mutex_lock(&g_dic_lock);
+
+ if (!_tdm_config_check_init()) {
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();
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);
- if (!g_dic) {
+ pthread_mutex_lock(&g_dic_lock);
+
+ if (!_tdm_config_check_init()) {
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();