Index: uspace/lib/c/generic/async/server.c
===================================================================
--- uspace/lib/c/generic/async/server.c	(revision 5c76cc61bc720674ef5280816ea825e0fcea7a02)
+++ uspace/lib/c/generic/async/server.c	(revision 3bd1d7d463320209e0e6c9b13b10246ec05805c8)
@@ -240,6 +240,6 @@
 }
 
+static futex_t client_futex = FUTEX_INITIALIZER;
 static hash_table_t client_hash_table;
-static hash_table_t conn_hash_table;
 
 // TODO: lockfree notification_queue?
@@ -249,7 +249,9 @@
 static FIBRIL_SEMAPHORE_INITIALIZE(notification_semaphore, 0);
 
+static sysarg_t notification_avail = 0;
+
+/* The remaining structures are guarded by async_futex. */
+static hash_table_t conn_hash_table;
 static LIST_INITIALIZE(timeout_list);
-
-static sysarg_t notification_avail = 0;
 
 static size_t client_key_hash(void *key)
@@ -339,5 +341,5 @@
 	client_t *client = NULL;
 
-	futex_down(&async_futex);
+	futex_lock(&client_futex);
 	ht_link_t *link = hash_table_find(&client_hash_table, &client_id);
 	if (link) {
@@ -345,4 +347,5 @@
 		atomic_inc(&client->refcnt);
 	} else if (create) {
+		// TODO: move the malloc out of critical section
 		client = malloc(sizeof(client_t));
 		if (client) {
@@ -355,5 +358,5 @@
 	}
 
-	futex_up(&async_futex);
+	futex_unlock(&client_futex);
 	return client;
 }
@@ -363,5 +366,5 @@
 	bool destroy;
 
-	futex_down(&async_futex);
+	futex_lock(&client_futex);
 
 	if (atomic_predec(&client->refcnt) == 0) {
@@ -371,5 +374,5 @@
 		destroy = false;
 
-	futex_up(&async_futex);
+	futex_unlock(&client_futex);
 
 	if (destroy) {
