Browse Source

Fixes bugs in AIO mode

Suren A. Chilingaryan 11 years ago
parent
commit
1e5e50e44d
1 changed files with 12 additions and 2 deletions
  1. 12 2
      seqreader.c

+ 12 - 2
seqreader.c

@@ -134,8 +134,17 @@ int main(int argc, char *argv[]) {
 	ready = 0;
 	while (1) {
 	    if (!done[curio%(AIO_MODE + EXTRA_BUFFERS)]) {
-    		err = io_getevents(aio, 1, AIO_MODE - events, &ev[events], NULL);
-		if (err < 0) perror("Error waiting for AIO\n");
+//		printf("%i,%i - %i [%i %i %i %i]\n", curio, schedio, events, done[0], done[1], done[2], done[3]);
+		
+		if (curio < schedio) {
+		    err = io_getevents(aio, 1, AIO_MODE + EXTRA_BUFFERS - events, &ev[events], NULL);
+		    if (err < 0) {
+			printf("Error waiting for AIO (%i)\n", -err);
+			exit(-1);
+		    }
+		} else {
+		    err = 0;
+		}
 		
 		if ((!ready)&&(err > 1)) {
 		    printf("*** Multiple read requests (%i of %i) are finished simultaneously. It is either:\n", err, AIO_MODE);
@@ -154,6 +163,7 @@ int main(int argc, char *argv[]) {
 		events += err;
 		
 		for (i = events - 1; (i >= 0)&&((schedio - curio) < (AIO_MODE + EXTRA_BUFFERS)); i--) {
+//		    printf("sched (%i): %i\n", i, schedio);
 		    struct iocb *newio = (struct iocb *)ev[i].obj;
 		    memset(newio, 0, sizeof(struct iocb));
 		    io_prep_pread(newio, fd, buffer + (schedio % (AIO_MODE + EXTRA_BUFFERS)) * BLOCK_SIZE, BLOCK_SIZE, schedio * BLOCK_SIZE);