pipes and ringbuffers should have two wait queues
This commit is contained in:
parent
b09c08e48b
commit
2a53068ddc
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user