DD_LIST_APPEND(bdev->op_queue, op);
th_manager[thread_id].op_len++;
- if (th_manager[thread_id].op_len == 1 && !start_th)
+ if (th_manager[thread_id].op_len == 1 && start_th)
pthread_cond_signal(&(th_manager[thread_id].cond));
pthread_mutex_unlock(&(th_manager[thread_id].mutex));
/* UNLOCK */
- if (start_th) {
+ if (!start_th) {
_D("Start New thread for block device");
- th_manager[thread_id].start_th = false;
+ th_manager[thread_id].start_th = true;
ret = pthread_create(&(th_manager[thread_id].th), NULL, block_th_start, &th_manager[thread_id]);
if (ret != 0) {
_E("fail to create thread for %s", bdev->data->devnode);
for (i = 0; i < THREAD_MAX; i++) {
th_manager[i].num_dev = 0;
th_manager[i].op_len = 0;
- th_manager[i].start_th = true;
+ th_manager[i].start_th = false;
th_manager[i].thread_id = i;
pthread_mutex_init(&(th_manager[i].mutex), NULL);
pthread_cond_init(&(th_manager[i].cond), NULL);
block_poweroff, NULL, NULL);
}
-static void block_exit(void *data)
+static void terminate_threads(void)
{
dd_list *elem, *elem_next;
char *temp;
- int ret, i;
+ int i, count;
+ const int WAIT_TIME = 10;
+
+ for (i = 0; i < THREAD_MAX; i++) {
+ if (th_manager[i].start_th) {
+ count = 0;
+ while ((th_manager[i].op_len != 0) && (count < WAIT_TIME)) {
+ _I("Thread(%d) job is not finished. Wait a second.", th_manager[i].thread_id);
+ usleep(200*1000);
+ count++;
+ }
+ pthread_cancel(th_manager[i].th);
+ pthread_join(th_manager[i].th, NULL);
+ }
+ DD_LIST_FOREACH_SAFE(th_manager[i].th_node_list, elem, elem_next, temp) {
+ DD_LIST_REMOVE(th_manager[i].th_node_list, temp);
+ free(temp);
+ }
+ }
+}
+
+static void block_exit(void *data)
+{
+ int ret;
udev_exit(NULL);
/* remove remaining blocks */
remove_whole_block_device();
- for (i = 0; i < THREAD_MAX; i++) {
- if (!th_manager[i].start_th)
- pthread_cancel(th_manager[i].th);
- DD_LIST_FOREACH_SAFE(th_manager[i].th_node_list, elem, elem_next, temp) {
- DD_LIST_REMOVE(th_manager[i].th_node_list, temp);
- free(temp);
- }
- }
+ terminate_threads();
/* exit pipe */
pipe_exit();