#include <string.h>
#include <stdlib.h>
+#include <curl/curl.h>
+#include <openssl/crypto.h>
#include "download-agent-dl-info.h"
#include "download-agent-http-mgr.h"
static pthread_mutex_t mutex_da_info_list = PTHREAD_MUTEX_INITIALIZER;
+
+/* locking mechnism for safe use of openssl context */
+static void openssl_lock_callback(int mode, int type, char *file, int line)
+{
+ DA_LOGV("type [%d], mode [%d]", type, mode);
+ (void)file;
+ (void)line;
+
+ if (mode & CRYPTO_LOCK)
+ pthread_mutex_lock(&(g_openssl_locks_list[type]));
+ else
+ pthread_mutex_unlock(&(g_openssl_locks_list[type]));
+}
+
+static unsigned long thread_id(void)
+{
+ unsigned long ret = (unsigned long)pthread_self();
+ return ret;
+}
+
+da_ret_t init_openssl_locks(void)
+{
+ DA_LOGD("");
+ int index;
+ int crypto_num_locks = CRYPTO_num_locks();
+ DA_LOGD("crypto_num_locks [%d]", crypto_num_locks);
+ g_openssl_locks_list = (pthread_mutex_t *)OPENSSL_malloc(crypto_num_locks * sizeof(pthread_mutex_t));
+ if (g_openssl_locks_list == DA_NULL) {
+ DA_LOGE("Failed to OPENSSL_malloc");
+ return DA_ERR_FAIL_TO_MEMALLOC;
+ }
+ for (index = 0; index < crypto_num_locks; index++) {
+ pthread_mutex_init(&(g_openssl_locks_list[index]), NULL);
+ }
+ CRYPTO_set_id_callback((unsigned long (*)())thread_id);
+ CRYPTO_set_locking_callback((void (*)())openssl_lock_callback);
+
+ return DA_RESULT_OK;
+}
+da_ret_t deinit_openssl_locks(void)
+{
+ DA_LOGD("");
+ int index;
+ int crypto_num_locks = CRYPTO_num_locks();
+ for (index = 0; index < crypto_num_locks; index++) {
+ pthread_mutex_destroy(&(g_openssl_locks_list[index]));
+ }
+ CRYPTO_set_id_callback(NULL);
+ CRYPTO_set_locking_callback(NULL);
+ OPENSSL_free(g_openssl_locks_list);
+ g_openssl_locks_list = NULL;
+
+ return DA_RESULT_OK;
+}
+
static void __init_da_info(int id)
{
da_info_t *da_info = DA_NULL;
{
DA_LOGV("");
da_ret_t ret = DA_RESULT_OK;
+ ret = init_openssl_locks();
DA_LOGI("Return ret = %d", ret);
return ret;
}
DA_LOGV("");
destroy_da_info_list();
+ deinit_openssl_locks();
DA_LOGI("====== da_deint EXIT =====");
return ret;
}
int update_time;
} da_info_t;
+pthread_mutex_t *g_openssl_locks_list;
da_info_t *da_info_list[DA_MAX_ID];
#define GET_STATE_MUTEX(INFO) (INFO->mutex_state)
DA_MUTEX_UNLOCK (&GET_STATE_MUTEX(INFO));\
}
+da_ret_t init_openssl_locks(void);
+da_ret_t deinit_openssl_locks(void);
da_ret_t get_available_da_id(int *available_id);
da_ret_t copy_user_input_data(da_info_t *da_info, const char *url,
req_data_t *ext_data, da_cb_t *da_cb_data);
%define _ux_define tizen2.3
Name: download-provider
Summary: Download the contents in background
-Version: 2.1.23
+Version: 2.1.24
Release: 0
Group: Development/Libraries
License: Apache License, Version 2.0
if (g_dp_notification_manager_tid > 0 &&
pthread_kill(g_dp_notification_manager_tid, 0) != ESRCH) {
//send signal to notification thread
- g_dp_notification_manager_tid = 0;
+ int status;
+ pthread_t tid;
+ tid = g_dp_notification_manager_tid;
CLIENT_MUTEX_LOCK(&g_dp_notification_manager_mutex);
+ g_dp_notification_manager_tid = 0;
pthread_cond_signal(&g_dp_notification_manager_cond);
CLIENT_MUTEX_UNLOCK(&g_dp_notification_manager_mutex);
- pthread_cancel(g_dp_notification_manager_tid);
- int status;
- pthread_join(g_dp_notification_manager_tid, (void **)&status);
+ pthread_cancel(tid);
+ pthread_join(tid, (void **)&status);
}
}
#else
if (g_dp_queue_manager_tid > 0 &&
pthread_kill(g_dp_queue_manager_tid, 0) != ESRCH) {
//send signal to queue thread
- g_dp_queue_manager_tid = 0;
+ int status;
+ pthread_t tid;
+ tid = g_dp_queue_manager_tid;
CLIENT_MUTEX_LOCK(&g_dp_queue_manager_mutex);
+ g_dp_queue_manager_tid = 0;
pthread_cond_signal(&g_dp_queue_manager_cond);
CLIENT_MUTEX_UNLOCK(&g_dp_queue_manager_mutex);
- pthread_cancel(g_dp_queue_manager_tid);
- int status;
- pthread_join(g_dp_queue_manager_tid, (void **)&status);
+ pthread_cancel(tid);
+ pthread_join(tid, (void **)&status);
}
}