summaryrefslogtreecommitdiff
path: root/drivers/media/video/pvrusb2/pvrusb2-context.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/pvrusb2/pvrusb2-context.c')
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-context.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/media/video/pvrusb2/pvrusb2-context.c b/drivers/media/video/pvrusb2/pvrusb2-context.c
index e7a2ed58bde2..a2ce022c515a 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-context.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-context.c
@@ -35,6 +35,9 @@ static struct pvr2_context *pvr2_context_notify_first;
static struct pvr2_context *pvr2_context_notify_last;
static DEFINE_MUTEX(pvr2_context_mutex);
static DECLARE_WAIT_QUEUE_HEAD(pvr2_context_sync_data);
+static DECLARE_WAIT_QUEUE_HEAD(pvr2_context_cleanup_data);
+static int pvr2_context_cleanup_flag;
+static int pvr2_context_cleaned_flag;
static struct task_struct *pvr2_context_thread_ptr;
@@ -153,7 +156,7 @@ static void pvr2_context_check(struct pvr2_context *mp)
static int pvr2_context_shutok(void)
{
- return kthread_should_stop() && (pvr2_context_exist_first == NULL);
+ return pvr2_context_cleanup_flag && (pvr2_context_exist_first == NULL);
}
@@ -174,6 +177,15 @@ static int pvr2_context_thread_func(void *foo)
pvr2_context_shutok()));
} while (!pvr2_context_shutok());
+ pvr2_context_cleaned_flag = !0;
+ wake_up(&pvr2_context_cleanup_data);
+
+ pvr2_trace(PVR2_TRACE_CTXT,"pvr2_context thread cleaned up");
+
+ wait_event_interruptible(
+ pvr2_context_sync_data,
+ kthread_should_stop());
+
pvr2_trace(PVR2_TRACE_CTXT,"pvr2_context thread end");
return 0;
@@ -191,6 +203,11 @@ int pvr2_context_global_init(void)
void pvr2_context_global_done(void)
{
+ pvr2_context_cleanup_flag = !0;
+ wake_up(&pvr2_context_sync_data);
+ wait_event_interruptible(
+ pvr2_context_cleanup_data,
+ pvr2_context_cleaned_flag);
kthread_stop(pvr2_context_thread_ptr);
}