diff options
| -rw-r--r-- | test/poll.c | 86 | 
1 files changed, 35 insertions, 51 deletions
| diff --git a/test/poll.c b/test/poll.c index c3800d6..ee1f8ec 100644 --- a/test/poll.c +++ b/test/poll.c @@ -1,28 +1,34 @@  /*   * Description: test io_uring poll handling   * - * Based on 22.t from libaio   */  #include <errno.h>  #include <stdio.h>  #include <unistd.h>  #include <stdlib.h>  #include <string.h> +#include <signal.h>  #include <sys/poll.h>  #include <sys/wait.h>  #include "../src/liburing.h" +static void sig_alrm(int sig) +{ +	printf("Timed out!\n"); +	exit(1); +} +  int main(int argc, char *argv[])  {  	pid_t parent = getpid(), p; -	int pipe1[2], pipe2[2]; -	struct io_uring cring, pring;  	struct io_uring_cqe *cqe;  	struct io_uring_sqe *sqe; +	struct io_uring ring; +	int pipe1[2];  	int ret; -	if (pipe(pipe1) != 0 || pipe(pipe2) != 0) { +	if (pipe(pipe1) != 0) {  		printf("pipe failed\n");  		return 1;  	} @@ -32,25 +38,31 @@ int main(int argc, char *argv[])  	case -1:  		printf("fork failed\n");  		exit(2); -	case 0: -		close(pipe1[1]); -		close(pipe2[0]); +	case 0: { +		struct sigaction act; -		ret = io_uring_queue_init(1, &cring, 0); +		ret = io_uring_queue_init(1, &ring, 0);  		if (ret) {  			printf("child: ring setup failed\n");  			return 1;  		} -		sqe = io_uring_get_sqe(&cring); +		memset(&act, 0, sizeof(act)); +		act.sa_handler = sig_alrm; +		act.sa_flags = SA_RESTART; +		sigaction(SIGALRM, &act, NULL); +		alarm(1); + +		sqe = io_uring_get_sqe(&ring);  		if (!sqe) {  			printf("child: get sqe failed\n");  			return 1;  		}  		io_uring_prep_poll_add(sqe, pipe1[0], POLLIN); +		io_uring_sqe_set_data(sqe, sqe); -		ret = io_uring_submit(&cring); +		ret = io_uring_submit(&ring);  		if (ret <= 0) {  			printf("child: sqe submit failed\n");  			return 1; @@ -61,61 +73,33 @@ int main(int argc, char *argv[])  				printf("parent died\n");  				exit(2);  			} -			ret = io_uring_wait_completion(&cring, &cqe); +			ret = io_uring_wait_completion(&ring, &cqe);  		} while (ret != 0);  		if (ret < 0) {  			printf("child: completion get failed\n");  			return 1;  		} - -		do { -			errno = 0; -			ret = write(pipe2[1], "foo", 3); -		} while (ret == -1 && errno == EINTR); - -		exit(0); -	default: -		close(pipe1[0]); -		close(pipe2[1]); - -		ret = io_uring_queue_init(1, &pring, 0); -		if (ret) { -			printf("parent: ring setup failed\n"); +		if (cqe->user_data != (unsigned long) sqe) { +			printf("child: cqe doesn't match sqe\n");  			return 1;  		} - -		sqe = io_uring_get_sqe(&pring); -		if (!sqe) { -			printf("parent: get sqe failed\n"); +		if ((cqe->res & POLLIN) != POLLIN) { +			printf("child: bad return value %ld\n", (long) cqe->res);  			return 1;  		} - -		io_uring_prep_poll_add(sqe, pipe2[0], POLLIN); -		io_uring_sqe_set_data(sqe, sqe); - -		ret = io_uring_submit(&pring); -		if (ret <= 0) { -			printf("parent: sqe submit failed\n"); -			return 1; +		exit(0);  		} +	default: +		do { +			errno = 0; +			ret = write(pipe1[1], "foo", 3); +		} while (ret == -1 && errno == EINTR); -		kill(p, SIGUSR1); - -		ret = io_uring_wait_completion(&pring, &cqe); -		if (ret < 0) { -			printf("parent: cqe get failed\n"); -			return 1; -		} -		if (cqe->user_data != (unsigned long) sqe) { -			printf("parent: cqe wrong fd\n"); +		if (ret != 3) { +			printf("parent: bad write return %d\n", ret);  			return 1;  		} -		if ((cqe->res & POLLIN) != POLLIN) { -			printf("parent: cqe did not report readable fd\n"); -			return 1; -		} -  		return 0;  	}  } | 
