spin_unlock(&cam->urb_lock);
/* Wake up the user process */
- if (waitqueue_active(&cam->wait_queue))
- wake_up_interruptible(&cam->wait_queue);
+ wake_up_interruptible(&cam->wait_queue);
}
up(&cam->dev_sem);
return -EWOULDBLOCK;
}
+retry:
up(&cam->dev_sem);
err = wait_event_interruptible(cam->open, cam->disconnected ||
(cam->users == 0));
if (cam->disconnected)
return -ENODEV;
down(&cam->dev_sem);
+ /*recheck - there may be several waiters */
+ if (cam->users)
+ goto retry;
}
DBG(5, "Opening '%s', /dev/video%d ...",
cam->users--;
w9968cf_deallocate_memory(cam);
- if (waitqueue_active(&cam->open))
- wake_up_interruptible(&cam->open);
+ wake_up_interruptible(&cam->open);
DBG(5, "Video device closed.")
up(&cam->dev_sem);