dp_interface_slot g_interface_slots[MAX_DOWNLOAD_HANDLE];
static pthread_mutex_t g_function_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t g_clear_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t g_dp_event_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_t g_dp_event_thread_id = 0;
//////////// defines functions /////////////////
static int __bp_disconnect(const char *funcname)
{
TRACE_DEBUG("%s", funcname);
+ CLIENT_MUTEX_LOCK(&g_dp_event_mutex);
if (g_dp_event_thread_id > 0 &&
pthread_kill(g_dp_event_thread_id, 0) != ESRCH) {
if (pthread_cancel(g_dp_event_thread_id) != 0)
TRACE_ERROR("pthread:%d", (int)g_dp_event_thread_id);
g_dp_event_thread_id = 0;
}
+ CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex);
__clear_interface();
return DP_ERROR_NONE;
}
g_dp_client->notify = open(notify_fifo, O_RDONLY, 0600);
if (g_dp_client->notify < 0) {
TRACE_ERROR("[CRITICAL] failed to ESTABILISH IPC %s", notify_fifo);
+ CLIENT_MUTEX_LOCK(&g_dp_event_mutex);
g_dp_event_thread_id = 0;
+ CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex);
CLIENT_MUTEX_LOCK(&g_function_mutex);
__clear_interface();
CLIENT_MUTEX_UNLOCK(&g_function_mutex);
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
while (g_dp_client != NULL && g_dp_client->notify >= 0) {
+ CLIENT_MUTEX_LOCK(&g_dp_event_mutex);
if (g_dp_event_thread_id <= 0 ||
pthread_self() != g_dp_event_thread_id) {
TRACE_ERROR("competitive threads self:%lu global:%lu",
pthread_self(), g_dp_event_thread_id);
// another thread may work. just terminate
+ CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex);
break;
}
+ CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex);
// blocking fifo.
dp_ipc_event_fmt eventinfo;
(eventinfo.id <= 0 &&
eventinfo.errorcode == DP_ERROR_CLIENT_DOWN)) {
TRACE_INFO("expelled by provider");
+ CLIENT_MUTEX_LOCK(&g_dp_event_mutex);
g_dp_event_thread_id = 0;
+ CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex);
CLIENT_MUTEX_LOCK(&g_function_mutex);
__clear_interface();
CLIENT_MUTEX_UNLOCK(&g_function_mutex);
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
} // while
+ CLIENT_MUTEX_LOCK(&g_dp_event_mutex);
g_dp_event_thread_id = 0; // set 0 to not call pthread_cancel
+ CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex);
TRACE_DEBUG("thread end by itself");
return 0;
}
-1, DP_SEC_INIT, DP_PROP_NONE, NULL);
}
+ CLIENT_MUTEX_LOCK(&g_dp_event_mutex);
if (errorcode == DP_ERROR_NONE && g_dp_event_thread_id <= 0) {
if (pthread_create(&g_dp_event_thread_id, NULL,
__dp_event_manager, g_dp_client) != 0) {
pthread_detach(g_dp_event_thread_id);
}
}
+ CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex);
}