diff -u -r uwsgi-0.9.6.6/async.c uwsgi-0.9.6.7/async.c
--- uwsgi-0.9.6.6/async.c	2010-12-30 04:29:22.000000000 +0100
+++ uwsgi-0.9.6.7/async.c	2011-01-11 07:51:34.000000000 +0100
@@ -322,6 +322,7 @@
 				wsgi_req->async_timeout_expired = 1 ;
 				if (wsgi_req->async_waiting_fd != -1) {
                                         async_del(uwsgi->async_queue, wsgi_req->async_waiting_fd, wsgi_req->async_waiting_fd_type);
+					uwsgi->async_waiting_fd_table[wsgi_req->async_waiting_fd] = -1;
                                         wsgi_req->async_waiting_fd = -1;
                                         wsgi_req->async_waiting_fd_monitored = 0;
                                 }
@@ -357,25 +358,14 @@
 
 struct wsgi_request *find_wsgi_req_by_fd(struct uwsgi_server *uwsgi, int fd, int etype) {
 
-        struct wsgi_request* wsgi_req = uwsgi->wsgi_requests ;
-        int i ;
+        struct wsgi_request* wsgi_req = NULL ;
+	int core_id = uwsgi->async_waiting_fd_table[fd];
 
-	if (etype != -1) {
-        	for(i=0;i<uwsgi->async;i++) {
-                	if (wsgi_req->async_waiting_fd == fd && wsgi_req->async_waiting_fd_type == etype) {
-                        	return wsgi_req ;
-                	}
-                	wsgi_req = next_wsgi_req(uwsgi, wsgi_req) ;
-        	}
-	}
-	else {
-        	for(i=0;i<uwsgi->async;i++) {
-                	if (wsgi_req->async_waiting_fd == fd) {
-                        	return wsgi_req ;
-                	}
-                	wsgi_req = next_wsgi_req(uwsgi, wsgi_req) ;
-        	}
-	}
+	if (core_id == -1) return NULL;
+
+
+	wsgi_req = &uwsgi->wsgi_requests[core_id];
+        if (wsgi_req->async_waiting_fd_type == etype) return wsgi_req ;
 
         return NULL ;
 
@@ -439,6 +429,7 @@
 					wsgi_req->async_status = UWSGI_OK ;
 					return wsgi_req;
 				}
+				uwsgi->async_waiting_fd_table[wsgi_req->async_waiting_fd] = wsgi_req->async_id;
 				wsgi_req->async_waiting_fd_monitored = 1;
 				wsgi_req->async_status = UWSGI_AGAIN;
 			}
diff -u -r uwsgi-0.9.6.6/uwsgi.c uwsgi-0.9.6.7/uwsgi.c
--- uwsgi-0.9.6.6/uwsgi.c	2010-12-30 05:28:42.000000000 +0100
+++ uwsgi-0.9.6.7/uwsgi.c	2011-01-11 07:49:17.000000000 +0100
@@ -867,6 +867,7 @@
 	
 	if (uwsgi.async > 1) {
 		if (!getrlimit(RLIMIT_NOFILE, &uwsgi.rl)) {
+			// no need to check for RLIM_INFINITY as lowring the fd max size is always allowed
 			if ( (unsigned long) uwsgi.rl.rlim_cur < (unsigned long) uwsgi.async) {
 				uwsgi_log("- your current max open files limit is %lu, this is lower than requested async cores !!! -\n", (unsigned long) uwsgi.rl.rlim_cur);
 				if (uwsgi.rl.rlim_cur < uwsgi.rl.rlim_max && (unsigned long) uwsgi.rl.rlim_max > (unsigned long) uwsgi.async) {
@@ -903,6 +904,14 @@
 		exit(1);
 	}
 
+	// uwsgi.rl.rlim_cur contains the maxium number of file descriptor
+	if (uwsgi.rl.rlim_cur == RLIM_INFINITY) uwsgi.rl.rlim_cur = uwsgi.async;
+	uwsgi.async_waiting_fd_table = malloc( sizeof(int) * uwsgi.rl.rlim_cur);
+	if (!uwsgi.async_waiting_fd_table) {
+		uwsgi_error("malloc()");
+		exit(1);
+	}
+
 	if (uwsgi.post_buffering > 0) {
 		uwsgi.async_post_buf = malloc( sizeof(char *) * uwsgi.async);
 		if (!uwsgi.async_post_buf) {
@@ -1953,6 +1962,7 @@
 				uwsgi.wsgi_req = find_wsgi_req_by_fd(&uwsgi, uwsgi.async_events[i].ASYNC_FD, uwsgi.async_events[i].ASYNC_EV);
 				if (uwsgi.wsgi_req) {
 					uwsgi.wsgi_req->async_status = UWSGI_AGAIN ;
+					uwsgi.async_waiting_fd_table[uwsgi.async_events[i].ASYNC_FD] = -1;
 					uwsgi.wsgi_req->async_waiting_fd = -1 ;
 					uwsgi.wsgi_req->async_waiting_fd_monitored = 0 ;
 					uwsgi.wsgi_req->async_timeout = 0;
diff -u -r uwsgi-0.9.6.6/uwsgi.h uwsgi-0.9.6.7/uwsgi.h
--- uwsgi-0.9.6.6/uwsgi.h	2010-12-30 05:28:55.000000000 +0100
+++ uwsgi-0.9.6.7/uwsgi.h	2011-01-11 07:30:13.000000000 +0100
@@ -516,6 +516,8 @@
 	char **async_buf;
 	char **async_post_buf;
 
+	int *async_waiting_fd_table;
+
 #ifdef UWSGI_ROUTING
 	int **async_ovector;
 #endif
diff -u -r uwsgi-0.9.6.6/wsgi_handlers.c uwsgi-0.9.6.7/wsgi_handlers.c
--- uwsgi-0.9.6.6/wsgi_handlers.c	2010-12-30 04:24:15.000000000 +0100
+++ uwsgi-0.9.6.7/wsgi_handlers.c	2011-01-11 07:40:08.000000000 +0100
@@ -42,7 +42,7 @@
         }
 
         if (fd >= 0) {
-                wsgi_req->async_waiting_fd = fd ;
+		wsgi_req->async_waiting_fd = fd;
                 wsgi_req->async_waiting_fd_type = ASYNC_IN ;
                 wsgi_req->async_waiting_fd_monitored = 0 ;
 		if (timeout) {
@@ -64,7 +64,7 @@
         }
 
         if (fd >= 0) {
-                wsgi_req->async_waiting_fd = fd ;
+		wsgi_req->async_waiting_fd = fd;
                 wsgi_req->async_waiting_fd_type = ASYNC_OUT ;
                 wsgi_req->async_waiting_fd_monitored = 0 ;
 		if (timeout) {
