示例#1
0
struct pvr2_context *pvr2_context_create(
    struct usb_interface *intf,
    const struct usb_device_id *devid,
    void (*setup_func)(struct pvr2_context *))
{
    struct pvr2_context *mp = NULL;
    mp = kzalloc(sizeof(*mp),GFP_KERNEL);
    if (!mp) goto done;
    pvr2_trace(PVR2_TRACE_CTXT,"pvr2_context %p (create)",mp);
    mp->setup_func = setup_func;
    mutex_init(&mp->mutex);
    mutex_lock(&pvr2_context_mutex);
    mp->exist_prev = pvr2_context_exist_last;
    mp->exist_next = NULL;
    pvr2_context_exist_last = mp;
    if (mp->exist_prev) {
        mp->exist_prev->exist_next = mp;
    } else {
        pvr2_context_exist_first = mp;
    }
    mutex_unlock(&pvr2_context_mutex);
    mp->hdw = pvr2_hdw_create(intf,devid);
    if (!mp->hdw) {
        pvr2_context_destroy(mp);
        mp = NULL;
        goto done;
    }
    pvr2_context_set_notify(mp, !0);
 done:
    return mp;
}
示例#2
0
static int pvr2_context_thread_func(void *foo)
{
    struct pvr2_context *mp;

    pvr2_trace(PVR2_TRACE_CTXT,"pvr2_context thread start");

    do {
        while ((mp = pvr2_context_notify_first) != NULL) {
            pvr2_context_set_notify(mp, 0);
            pvr2_context_check(mp);
        }
        wait_event_interruptible(
            pvr2_context_sync_data,
            ((pvr2_context_notify_first != NULL) ||
             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;
}
示例#3
0
static void pvr2_context_destroy(struct pvr2_context *mp)
{
    pvr2_trace(PVR2_TRACE_CTXT,"pvr2_context %p (destroy)",mp);
    if (mp->hdw) pvr2_hdw_destroy(mp->hdw);
    pvr2_context_set_notify(mp, 0);
    mutex_lock(&pvr2_context_mutex);
    if (mp->exist_next) {
        mp->exist_next->exist_prev = mp->exist_prev;
    } else {
        pvr2_context_exist_last = mp->exist_prev;
    }
    if (mp->exist_prev) {
        mp->exist_prev->exist_next = mp->exist_next;
    } else {
        pvr2_context_exist_first = mp->exist_next;
    }
    if (!pvr2_context_exist_first) {
        /* Trigger wakeup on control thread in case it is waiting
           for an exit condition. */
        wake_up(&pvr2_context_sync_data);
    }
    mutex_unlock(&pvr2_context_mutex);
    kfree(mp);
}
static void pvr2_context_destroy(struct pvr2_context *mp)
{
	pvr2_trace(PVR2_TRACE_CTXT,"pvr2_context %p (destroy)",mp);
	if (mp->hdw) pvr2_hdw_destroy(mp->hdw);
	pvr2_context_set_notify(mp, 0);
	mutex_lock(&pvr2_context_mutex);
	if (mp->exist_next) {
		mp->exist_next->exist_prev = mp->exist_prev;
	} else {
		pvr2_context_exist_last = mp->exist_prev;
	}
	if (mp->exist_prev) {
		mp->exist_prev->exist_next = mp->exist_next;
	} else {
		pvr2_context_exist_first = mp->exist_next;
	}
	if (!pvr2_context_exist_first) {
		/*                                                       
                            */
		wake_up(&pvr2_context_sync_data);
	}
	mutex_unlock(&pvr2_context_mutex);
	kfree(mp);
}
示例#5
0
static void pvr2_context_notify(struct pvr2_context *mp)
{
    pvr2_context_set_notify(mp,!0);
}