Index: uspace/lib/c/generic/thread/fibril_synch.c
===================================================================
--- uspace/lib/c/generic/thread/fibril_synch.c	(revision 1a374967997b33e560720544b0b126a5f689f6b3)
+++ uspace/lib/c/generic/thread/fibril_synch.c	(revision 3ede4402c7e2d73cb84f9c62c9e9207062cf813c)
@@ -165,5 +165,5 @@
 {
 	fm->oi.owned_by = NULL;
-	fm->counter = 1;
+	fm->counter = 0;
 	list_initialize(&fm->waiters);
 }
@@ -175,5 +175,8 @@
 	futex_lock(&fibril_synch_futex);
 
-	if (fm->counter-- > 0) {
+	fm->counter++;
+
+	if (fm->counter == 1) {
+		/* I am the only one here. */
 		fm->oi.owned_by = f;
 		futex_unlock(&fibril_synch_futex);
@@ -196,6 +199,6 @@
 
 	futex_lock(&fibril_synch_futex);
-	if (fm->counter > 0) {
-		fm->counter--;
+	if (fm->counter == 0) {
+		fm->counter++;
 		fm->oi.owned_by = (fibril_t *) fibril_get_id();
 		locked = true;
@@ -209,6 +212,9 @@
 {
 	assert(fm->oi.owned_by == (fibril_t *) fibril_get_id());
-
-	if (fm->counter++ < 0) {
+	assert(fm->counter > 0);
+
+	fm->counter--;
+
+	if (fm->counter > 0) {
 		awaiter_t *wdp = list_pop(&fm->waiters, awaiter_t, link);
 		assert(wdp);
Index: uspace/lib/c/include/fibril_synch.h
===================================================================
--- uspace/lib/c/include/fibril_synch.h	(revision 1a374967997b33e560720544b0b126a5f689f6b3)
+++ uspace/lib/c/include/fibril_synch.h	(revision 3ede4402c7e2d73cb84f9c62c9e9207062cf813c)
@@ -44,5 +44,5 @@
 typedef struct {
 	fibril_owner_info_t oi;  /**< Keep this the first thing. */
-	int counter;
+	int counter;  /**< # of fibrils currently waiting for or running in the critical section. */
 	list_t waiters;
 } fibril_mutex_t;
@@ -53,5 +53,5 @@
 			.owned_by = NULL \
 		}, \
-		.counter = 1, \
+		.counter = 0, \
 		.waiters = LIST_INITIALIZER((name).waiters), \
 	}
