/* Queue structure. Consist of pointers to the first and the last elements of
* queue. */
-struct queue {
+struct queue_t {
struct swap_subbuffer *start_ptr;
struct swap_subbuffer *end_ptr;
unsigned int subbuffers_count;
};
/* Write queue */
-struct queue write_queue = {
+struct queue_t write_queue = {
.start_ptr = NULL,
.end_ptr = NULL,
.subbuffers_count = 0,
};
/* Read queue */
-struct queue read_queue = {
+struct queue_t read_queue = {
.start_ptr = NULL,
.end_ptr = NULL,
.subbuffers_count = 0,
return ((queue_subbuffer_size-subbuffer->full_buffer_part) >= size) ? 1 : 0;
}
+static void next_queue_element(struct queue_t *queue)
+{
+ /* If we reached the last elemenet, end pointer should point to NULL */
+ if (queue->start_ptr == queue->end_ptr)
+ queue->end_ptr = NULL;
+
+ queue->start_ptr = queue->start_ptr->next_in_queue;
+ --queue->subbuffers_count;
+}
+
/* Get first subbuffer from read list */
struct swap_subbuffer *get_from_read_list(void)
{
result = read_queue.start_ptr;
- /* If this is the last readable buffer, read_queue.start_ptr next time will
- * points to NULL and that case is handled in the beginning of function
- */
- if (read_queue.start_ptr == read_queue.end_ptr) {
- read_queue.end_ptr = NULL;
- }
- read_queue.start_ptr = read_queue.start_ptr->next_in_queue;
- --read_queue.subbuffers_count;
+ next_queue_element(&read_queue);
get_from_read_list_unlock:
/* Unlock read sync primitive */
struct swap_subbuffer *result = NULL;
/* Callbacks are called at the end of the function to prevent deadlocks */
- struct queue callback_queue = {
+ struct queue_t callback_queue = {
.start_ptr = NULL,
.end_ptr = NULL,
.queue_sync = {
} else {
result = write_queue.start_ptr;
- /* If we reached end of the list */
- if (write_queue.start_ptr == write_queue.end_ptr) {
- write_queue.end_ptr = NULL;
- }
-
- /* Move start write pointer */
- write_queue.start_ptr = write_queue.start_ptr->next_in_queue;
- --write_queue.subbuffers_count;
+ next_queue_element(&write_queue);
/* Add to callback list */
if (!callback_queue.start_ptr)
return result;
}
-/* Get subbuffers count in read list */
-/* XXX Think about locks */
-int get_full_buffers_count(void)
-{
- int result = 0;
- struct swap_subbuffer *buffer = read_queue.start_ptr;
-
- while (buffer && buffer->full_buffer_part) {
- result += 1;
- buffer = buffer->next_in_queue;
- }
-
- return result;
-}
-
/* Set all subbuffers in write list to read list */
void buffer_queue_flush(void)
{
sync_lock(&buffer->buffer_sync);
buffer = write_queue.start_ptr;
-
- /* If we reached end of the list */
- if (write_queue.start_ptr == write_queue.end_ptr) {
- write_queue.end_ptr = NULL;
- }
- write_queue.start_ptr = write_queue.start_ptr->next_in_queue;
- --write_queue.subbuffers_count;
-
+ next_queue_element(&write_queue);
add_to_read_list(buffer);
/* Unlock buffer sync primitive */