Index: uspace/lib/c/generic/libc.c
===================================================================
--- uspace/lib/c/generic/libc.c	(revision 1b7eec9d6a4ae85223280afbf0d3b7a82de447cb)
+++ uspace/lib/c/generic/libc.c	(revision 9a3b469cd564c15f66773195299043ec3ceb4e26)
@@ -51,4 +51,5 @@
 #include "private/malloc.h"
 #include "private/io.h"
+#include "private/thread.h"
 
 #ifdef CONFIG_RTLD
@@ -72,4 +73,6 @@
 	/* Save the PCB pointer */
 	__pcb = (pcb_t *) pcb_ptr;
+	
+	atomic_inc(&_created_thread_cnt);
 	
 	/* The basic run-time environment is setup */
Index: uspace/lib/c/generic/malloc.c
===================================================================
--- uspace/lib/c/generic/malloc.c	(revision 1b7eec9d6a4ae85223280afbf0d3b7a82de447cb)
+++ uspace/lib/c/generic/malloc.c	(revision 9a3b469cd564c15f66773195299043ec3ceb4e26)
@@ -47,4 +47,5 @@
 #include <adt/gcdlcm.h>
 #include "private/malloc.h"
+#include "private/thread.h"
 
 /** Magic used in heap headers. */
@@ -785,9 +786,13 @@
 void *malloc(const size_t size)
 {
-	futex_down(&malloc_futex);
-	void *block = malloc_internal(size, BASE_ALIGN);
-	futex_up(&malloc_futex);
-	
-	return block;
+	/* Do not use futexes for allocations during main thread initialization. */
+	if (0 == atomic_get(&_created_thread_cnt)) {
+		return malloc_internal(size, BASE_ALIGN);
+	} else {
+		futex_down(&malloc_futex);
+		void *block = malloc_internal(size, BASE_ALIGN);
+		futex_up(&malloc_futex);
+		return block;
+	}
 }
 
@@ -807,10 +812,15 @@
 	size_t palign =
 	    1 << (fnzb(max(sizeof(void *), align) - 1) + 1);
-	
-	futex_down(&malloc_futex);
-	void *block = malloc_internal(size, palign);
-	futex_up(&malloc_futex);
-	
-	return block;
+
+	/* Do not use futexes for allocations during main thread initialization. */
+	if (0 == atomic_get(&_created_thread_cnt)) {
+		return malloc_internal(size, palign);
+	} else {
+		futex_down(&malloc_futex);
+		void *block = malloc_internal(size, palign);
+		futex_up(&malloc_futex);
+
+		return block;
+	}
 }
 
Index: uspace/lib/c/generic/private/thread.h
===================================================================
--- uspace/lib/c/generic/private/thread.h	(revision 1b7eec9d6a4ae85223280afbf0d3b7a82de447cb)
+++ uspace/lib/c/generic/private/thread.h	(revision 9a3b469cd564c15f66773195299043ec3ceb4e26)
@@ -41,4 +41,7 @@
 extern void __thread_main(uspace_arg_t *);
 
+struct atomic;
+extern struct atomic _created_thread_cnt;
+
 #endif
 
Index: uspace/lib/c/generic/thread.c
===================================================================
--- uspace/lib/c/generic/thread.c	(revision 1b7eec9d6a4ae85223280afbf0d3b7a82de447cb)
+++ uspace/lib/c/generic/thread.c	(revision 9a3b469cd564c15f66773195299043ec3ceb4e26)
@@ -46,4 +46,10 @@
 #include "private/thread.h"
 
+/** 
+ * The number of threads that have been created and initialized since 
+ * the start of the program. 
+ */
+atomic_t _created_thread_cnt = {0};
+
 /** Main thread function.
  *
@@ -62,4 +68,6 @@
 	
 	__tcb_set(fibril->tcb);
+	
+	atomic_inc(&_created_thread_cnt);
 	
 	uarg->uspace_thread_function(uarg->uspace_thread_arg);
