]> Pileus Git - ~andy/linux/blobdiff - sound/oss/dmasound/dmasound_core.c
Merge remote-tracking branch 'asoc/topic/dapm' into for-tiwai
[~andy/linux] / sound / oss / dmasound / dmasound_core.c
index bac43b5b6e95be36ff5fe4fffb955c7b7a078fd9..f4ee85a4c42fb910ae2a234ffb4de3bb815bc155 100644 (file)
@@ -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