|
@@ -619,15 +619,27 @@ static ssize_t sq_write(struct file *file, const char __user *src, size_t uLeft,
|
|
|
}
|
|
|
|
|
|
while (uLeft) {
|
|
|
+ DEFINE_WAIT(wait);
|
|
|
+
|
|
|
while (write_sq.count >= write_sq.max_active) {
|
|
|
+ prepare_to_wait(&write_sq.action_queue, &wait, TASK_INTERRUPTIBLE);
|
|
|
sq_play();
|
|
|
- if (write_sq.non_blocking)
|
|
|
+ if (write_sq.non_blocking) {
|
|
|
+ finish_wait(&write_sq.action_queue, &wait);
|
|
|
return uWritten > 0 ? uWritten : -EAGAIN;
|
|
|
- SLEEP(write_sq.action_queue);
|
|
|
- if (signal_pending(current))
|
|
|
+ }
|
|
|
+ if (write_sq.count < write_sq.max_active)
|
|
|
+ break;
|
|
|
+
|
|
|
+ schedule_timeout(HZ);
|
|
|
+ if (signal_pending(current)) {
|
|
|
+ finish_wait(&write_sq.action_queue, &wait);
|
|
|
return uWritten > 0 ? uWritten : -EINTR;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ finish_wait(&write_sq.action_queue, &wait);
|
|
|
+
|
|
|
/* Here, we can avoid disabling the interrupt by first
|
|
|
* copying and translating the data, and then updating
|
|
|
* the write_sq variables. Until this is done, the interrupt
|
|
@@ -707,11 +719,8 @@ static int sq_open2(struct sound_queue *sq, struct file *file, fmode_t mode,
|
|
|
if (file->f_flags & O_NONBLOCK)
|
|
|
return rc;
|
|
|
rc = -EINTR;
|
|
|
- while (sq->busy) {
|
|
|
- SLEEP(sq->open_queue);
|
|
|
- if (signal_pending(current))
|
|
|
- return rc;
|
|
|
- }
|
|
|
+ if (wait_event_interruptible(sq->open_queue, !sq->busy))
|
|
|
+ return rc;
|
|
|
rc = 0;
|
|
|
#else
|
|
|
/* OSS manual says we will return EBUSY regardless
|
|
@@ -844,7 +853,8 @@ static int sq_fsync(void)
|
|
|
sq_play(); /* there may be an incomplete frame waiting */
|
|
|
|
|
|
while (write_sq.active) {
|
|
|
- SLEEP(write_sq.sync_queue);
|
|
|
+ wait_event_interruptible_timeout(write_sq.sync_queue,
|
|
|
+ !write_sq.active, HZ);
|
|
|
if (signal_pending(current)) {
|
|
|
/* While waiting for audio output to drain, an
|
|
|
* interrupt occurred. Stop audio output immediately
|