pipes and ringbuffers should have two wait queues

This commit is contained in:
Kevin Lange 2014-04-12 18:14:35 -07:00
parent b09c08e48b
commit 2a53068ddc
4 changed files with 19 additions and 14 deletions

View File

@ -53,12 +53,12 @@ size_t ring_buffer_read(ring_buffer_t * ring_buffer, size_t size, uint8_t * buff
collected++;
}
spin_unlock(&ring_buffer->lock);
wakeup_queue(ring_buffer->wait_queue_writers);
if (collected == 0) {
wakeup_queue(ring_buffer->wait_queue);
sleep_on(ring_buffer->wait_queue);
sleep_on(ring_buffer->wait_queue_readers);
}
}
wakeup_queue(ring_buffer->wait_queue);
wakeup_queue(ring_buffer->wait_queue_writers);
return collected;
}
@ -74,13 +74,13 @@ size_t ring_buffer_write(ring_buffer_t * ring_buffer, size_t size, uint8_t * buf
}
spin_unlock(&ring_buffer->lock);
wakeup_queue(ring_buffer->wait_queue_readers);
if (written < size) {
wakeup_queue(ring_buffer->wait_queue);
sleep_on(ring_buffer->wait_queue);
sleep_on(ring_buffer->wait_queue_writers);
}
}
wakeup_queue(ring_buffer->wait_queue);
wakeup_queue(ring_buffer->wait_queue_readers);
return written;
}
@ -91,8 +91,10 @@ ring_buffer_t * ring_buffer_create(size_t size) {
out->write_ptr = 0;
out->read_ptr = 0;
out->lock = 0;
out->wait_queue = list_create();
out->size = size;
out->wait_queue_readers = list_create();
out->wait_queue_writers = list_create();
return out;
}

View File

@ -99,10 +99,10 @@ uint32_t read_pipe(fs_node_t *node, uint32_t offset, uint32_t size, uint8_t *buf
collected++;
}
spin_unlock(&pipe->lock);
wakeup_queue(pipe->wait_queue);
wakeup_queue(pipe->wait_queue_writers);
/* Deschedule and switch */
if (collected == 0) {
sleep_on(pipe->wait_queue);
sleep_on(pipe->wait_queue_readers);
}
}
@ -160,9 +160,9 @@ uint32_t write_pipe(fs_node_t *node, uint32_t offset, uint32_t size, uint8_t *bu
#endif
spin_unlock(&pipe->lock);
wakeup_queue(pipe->wait_queue);
wakeup_queue(pipe->wait_queue_readers);
if (written < size) {
sleep_on(pipe->wait_queue);
sleep_on(pipe->wait_queue_writers);
}
}
@ -239,7 +239,8 @@ fs_node_t * make_pipe(size_t size) {
pipe->lock = 0;
pipe->dead = 0;
pipe->wait_queue = list_create();
pipe->wait_queue_writers = list_create();
pipe->wait_queue_readers = list_create();
return fnode;
}

View File

@ -15,7 +15,8 @@ typedef struct _pipe_device {
size_t size;
size_t refcount;
uint8_t volatile lock;
list_t * wait_queue;
list_t * wait_queue_readers;
list_t * wait_queue_writers;
int dead;
} pipe_device_t;

View File

@ -7,7 +7,8 @@ typedef struct {
size_t read_ptr;
size_t size;
uint8_t volatile lock;
list_t * wait_queue;
list_t * wait_queue_readers;
list_t * wait_queue_writers;
} ring_buffer_t;
size_t ring_buffer_unread(ring_buffer_t * ring_buffer);