Index: benchmark/io/http/worker.cfa
===================================================================
--- benchmark/io/http/worker.cfa	(revision 10ba0125bc9d6e80f483f1c2ef162c040c1b0ed7)
+++ benchmark/io/http/worker.cfa	(revision c25338dbafc8e65874811701c5413f1e4a577e5e)
@@ -187,7 +187,11 @@
 }
 
+#define ACCEPT_SPIN
+
 void main( Acceptor & this ) {
 	park();
 	unsigned long long last = rdtscl();
+
+#if defined(ACCEPT_SPIN)
 	if( options.log ) sout | "=== Accepting connection ===";
 	for() {
@@ -236,3 +240,69 @@
 		if( options.log ) sout | "=== Accepting connection ===";
 	}
-}
+
+#elif define(ACCEPT_MANY)
+	const int nacc = 10;
+	io_future_t results[nacc];
+
+	for(i; nacc) {
+		io_future_t & res = results[i];
+		reset(res);
+		/* paranoid */ assert(!available(res));
+		if( options.log ) mutex(sout) sout | "=== Re-arming accept no" | i | " ===";
+		async_accept4(res, this.sockfd, this.[addr, addrlen, flags], CFA_IO_LAZY);
+	}
+
+	for() {
+		if (stats_thrd) {
+			unsigned long long next = rdtscl();
+			if(next > (last + 500000000)) {
+				if(try_lock(stats_thrd->stats.lock __cfaabi_dbg_ctx2)) {
+					push(this.stats, stats_thrd->stats.accpt);
+					unlock(stats_thrd->stats.lock);
+					last = next;
+				}
+			}
+		}
+
+		for(i; nacc) {
+			io_future_t & res = results[i];
+			if(available(res)) {
+				if( options.log ) mutex(sout) sout | "=== Accept no " | i | "completed with result" | res.result | "===";
+				int fd = get_res(res);
+				reset(res);
+				this.stats.accepts++;
+				if(fd < 0) {
+					if( errno == ECONNABORTED ) continue;
+					if( this.done && (errno == EINVAL || errno == EBADF) ) continue;
+					abort( "accept error: (%d) %s\n", (int)errno, strerror(errno) );
+				}
+				push_connection( this, fd );
+
+				/* paranoid */ assert(!available(res));
+				if( options.log ) mutex(sout) sout | "=== Re-arming accept no" | i | " ===";
+				async_accept4(res, this.sockfd, this.[addr, addrlen, flags], CFA_IO_LAZY);
+			}
+		}
+		if(this.done) return;
+
+		if( options.log ) mutex(sout) sout | "=== Waiting for any accept ===";
+		this.stats.eagains++;
+		wait_any(results, nacc);
+
+		if( options.log ) mutex(sout) {
+			sout | "=== Acceptor wake-up ===";
+			for(i; nacc) {
+				io_future_t & res = results[i];
+				sout | i | "available:" | available(res);
+			}
+		}
+
+	}
+
+	for(i; nacc) {
+		wait(results[i]);
+	}
+#else
+#error no accept algorithm specified
+#endif
+}
