Index: uspace/srv/bd/hr/fge.c
===================================================================
--- uspace/srv/bd/hr/fge.c	(revision 95158dac9177125617b97aec642b7998df7a04d8)
+++ uspace/srv/bd/hr/fge.c	(revision f3b74d1f4844a457542edfd3753dc67fbd3ed14c)
@@ -41,4 +41,5 @@
 
 #include <adt/bitmap.h>
+#include <adt/circ_buf.h>
 #include <assert.h>
 #include <errno.h>
@@ -60,6 +61,6 @@
 static errno_t fge_fibril(void *);
 static errno_t wu_queue_init(wu_queue_t *, size_t);
-static void wu_queue_push(wu_queue_t *, fge_fibril_data_t);
-static fge_fibril_data_t wu_queue_pop(wu_queue_t *);
+static void wu_queue_push(wu_queue_t *, fge_fibril_data_t *);
+static void wu_queue_pop(wu_queue_t *, fge_fibril_data_t *);
 static ssize_t hr_fpool_get_free_slot(hr_fpool_t *);
 
@@ -76,8 +77,5 @@
 	fibril_condvar_t not_full;
 	fge_fibril_data_t *fexecs;
-	size_t capacity;
-	size_t size;
-	size_t front;
-	size_t back;
+	circ_buf_t cbuf;
 } wu_queue_t;
 
@@ -312,5 +310,5 @@
 	fibril_mutex_unlock(&group->lock);
 
-	wu_queue_push(&group->pool->queue, executor);
+	wu_queue_push(&group->pool->queue, &executor);
 }
 
@@ -366,15 +364,15 @@
 		fibril_mutex_lock(&pool->lock);
 
-		while (pool->queue.size == 0 && !pool->stop) {
+		while (circ_buf_nused(&pool->queue.cbuf) == 0 && !pool->stop) {
 			fibril_condvar_wait(&pool->queue.not_empty,
 			    &pool->lock);
 		}
 
-		if (pool->stop && pool->queue.size == 0) {
+		if (pool->stop && circ_buf_nused(&pool->queue.cbuf) == 0) {
 			fibril_mutex_unlock(&pool->lock);
 			break;
 		}
 
-		executor = wu_queue_pop(&pool->queue);
+		wu_queue_pop(&pool->queue, &executor);
 
 		fibril_mutex_unlock(&pool->lock);
@@ -410,14 +408,13 @@
 }
 
-static errno_t wu_queue_init(wu_queue_t *queue, size_t capacity)
-{
-	queue->fexecs = malloc(sizeof(fge_fibril_data_t) * capacity);
+static errno_t wu_queue_init(wu_queue_t *queue, size_t nmemb)
+{
+	queue->fexecs = malloc(sizeof(fge_fibril_data_t) * nmemb);
 	if (queue->fexecs == NULL)
 		return ENOMEM;
 
-	queue->capacity = capacity;
-	queue->size = 0;
-	queue->front = 0;
-	queue->back = 0;
+	circ_buf_init(&queue->cbuf, queue->fexecs, nmemb,
+	    sizeof(fge_fibril_data_t));
+
 	fibril_mutex_initialize(&queue->lock);
 	fibril_condvar_initialize(&queue->not_empty);
@@ -427,15 +424,11 @@
 }
 
-static void wu_queue_push(wu_queue_t *queue, fge_fibril_data_t executor)
+static void wu_queue_push(wu_queue_t *queue, fge_fibril_data_t *executor)
 {
 	fibril_mutex_lock(&queue->lock);
 
-	while (queue->size == queue->capacity)
+	while (circ_buf_push(&queue->cbuf, executor) == EAGAIN)
 		fibril_condvar_wait(&queue->not_full, &queue->lock);
 
-	queue->fexecs[queue->back] = executor;
-	queue->back = (queue->back + 1) % queue->capacity;
-	queue->size++;
-
 	fibril_condvar_signal(&queue->not_empty);
 
@@ -443,19 +436,14 @@
 }
 
-static fge_fibril_data_t wu_queue_pop(wu_queue_t *queue)
+static void wu_queue_pop(wu_queue_t *queue, fge_fibril_data_t *executor)
 {
 	fibril_mutex_lock(&queue->lock);
 
-	while (queue->size == 0)
+	while (circ_buf_pop(&queue->cbuf, executor) == EAGAIN)
 		fibril_condvar_wait(&queue->not_empty, &queue->lock);
 
-	fge_fibril_data_t wu = queue->fexecs[queue->front];
-	queue->front = (queue->front + 1) % queue->capacity;
-	queue->size--;
-
 	fibril_condvar_signal(&queue->not_full);
 
 	fibril_mutex_unlock(&queue->lock);
-	return wu;
 }
 
Index: uspace/srv/bd/hr/fge.h
===================================================================
--- uspace/srv/bd/hr/fge.h	(revision 95158dac9177125617b97aec642b7998df7a04d8)
+++ uspace/srv/bd/hr/fge.h	(revision f3b74d1f4844a457542edfd3753dc67fbd3ed14c)
@@ -33,9 +33,4 @@
 /**
  * @file
- * @brief Fibril group executor
- *
- * Fibril pool with pre-allocated storage allowing
- * execution of groups consisting of multiple work
- * units.
  */
 
