- Use ATF_REQUIRE_KERNEL_MDOULE to require aio(4)

- Don't use /tmp as a basis for temporary files as it's outside of the ATF
  sandbox
- Don't override MAX macro in sys/param.h

MFC after: 6 days
This commit is contained in:
Enji Cooper 2015-04-28 10:53:06 +00:00
parent c5dfa43a6c
commit 4e5f38d634
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=282136
2 changed files with 33 additions and 25 deletions

View File

@ -46,25 +46,29 @@
#include <string.h>
#include <unistd.h>
#define PATH_TEMPLATE "/tmp/aio.XXXXXXXXXX"
#include "freebsd_test_suite/macros.h"
#define MAX 128
#define PATH_TEMPLATE "aio.XXXXXXXXXX"
#define MAX_IOCBS 128
#define MAX_RUNS 300
/* #define DEBUG */
int
main (int argc, char *argv[])
{
int fd;
struct aiocb *iocb[MAX], *kq_iocb;
int i, result, run, error, j;
char buffer[32768];
int kq = kqueue();
struct aiocb *iocb[MAX_IOCBS], *kq_iocb;
char *file, pathname[sizeof(PATH_TEMPLATE)+1];
struct kevent ke, kq_returned;
struct timespec ts;
int cancel, pending, tmp_file = 0, failed = 0;
char *file, pathname[sizeof(PATH_TEMPLATE)+1];
char buffer[32768];
int cancel, error, failed = 0, fd, kq, pending, result, run;
int tmp_file = 0;
unsigned i, j;
PLAIN_REQUIRE_KERNEL_MODULE("aio", 0);
kq = kqueue();
if (kq < 0) {
perror("No kqeueue\n");
exit(1);
@ -86,7 +90,7 @@ main (int argc, char *argv[])
#ifdef DEBUG
printf("Run %d\n", run);
#endif
for (i = 0; i < MAX; i++) {
for (i = 0; i < nitems(iocb); i++) {
iocb[i] = (struct aiocb *)calloc(1,
sizeof(struct aiocb));
if (iocb[i] == NULL)
@ -94,7 +98,7 @@ main (int argc, char *argv[])
}
pending = 0;
for (i = 0; i < MAX; i++) {
for (i = 0; i < nitems(iocb); i++) {
pending++;
iocb[i]->aio_nbytes = sizeof(buffer);
iocb[i]->aio_buf = buffer;
@ -129,8 +133,8 @@ main (int argc, char *argv[])
}
}
}
cancel = MAX - pending;
cancel = nitems(iocb) - pending;
i = 0;
while (pending) {
@ -159,11 +163,11 @@ main (int argc, char *argv[])
break;
#ifdef DEBUG
printf("Try again left %d out of %d %d\n",
pending, MAX, cancel);
pending, nitems(iocb), cancel);
#endif
}
for (j = 0; j < MAX && iocb[j] != kq_iocb;
for (j = 0; j < nitems(iocb) && iocb[j] != kq_iocb;
j++) ;
#ifdef DEBUG
printf("kq_iocb %p\n", kq_iocb);
@ -190,7 +194,7 @@ main (int argc, char *argv[])
i++;
}
for (i = 0; i < MAX; i++)
for (i = 0; i < nitems(iocb); i++)
free(iocb[i]);
}

View File

@ -48,16 +48,18 @@
#include <string.h>
#include <unistd.h>
#define PATH_TEMPLATE "/tmp/aio.XXXXXXXXXX"
#include "freebsd_test_suite/macros.h"
#define PATH_TEMPLATE "aio.XXXXXXXXXX"
#define LIO_MAX 5
#define MAX LIO_MAX * 16
#define MAX_IOCBS LIO_MAX * 16
#define MAX_RUNS 300
int
main(int argc, char *argv[]){
int fd;
struct aiocb *iocb[MAX];
struct aiocb *iocb[MAX_IOCBS];
struct aiocb **lio[LIO_MAX], **lio_element, **kq_lio;
int i, result, run, error, j, k;
char buffer[32768];
@ -69,6 +71,8 @@ main(int argc, char *argv[]){
char *file, pathname[sizeof(PATH_TEMPLATE)-1];
int tmp_file = 0, failed = 0;
PLAIN_REQUIRE_KERNEL_MODULE("aio", 0);
if (kq < 0) {
perror("No kqeueue\n");
exit(1);
@ -99,9 +103,9 @@ main(int argc, char *argv[]){
#endif
for (j = 0; j < LIO_MAX; j++) {
lio[j] = (struct aiocb **)
malloc(sizeof(struct aiocb *) * MAX/LIO_MAX);
for(i = 0; i < MAX / LIO_MAX; i++) {
k = (MAX / LIO_MAX * j) + i;
malloc(sizeof(struct aiocb *) * MAX_IOCBS/LIO_MAX);
for(i = 0; i < MAX_IOCBS / LIO_MAX; i++) {
k = (MAX_IOCBS / LIO_MAX * j) + i;
lio_element = lio[j];
lio[j][i] = iocb[k] = (struct aiocb *)
malloc(sizeof(struct aiocb));
@ -123,7 +127,7 @@ main(int argc, char *argv[]){
sig.sigev_notify = SIGEV_KEVENT;
time(&time1);
result = lio_listio(LIO_NOWAIT, lio[j],
MAX / LIO_MAX, &sig);
MAX_IOCBS / LIO_MAX, &sig);
error = errno;
time(&time2);
#ifdef DEBUG
@ -203,7 +207,7 @@ main(int argc, char *argv[]){
} else {
printf("PASS: run %d, operation %d result %d \n", run, LIO_MAX - i -1, result);
}
for(k = 0; k < MAX / LIO_MAX; k++){
for(k = 0; k < MAX_IOCBS / LIO_MAX; k++){
result = aio_return(kq_lio[k]);
#ifdef DEBUG
printf("Return Resulto for %d %d is %d\n", j, k, result);
@ -220,7 +224,7 @@ main(int argc, char *argv[]){
printf("\n");
#endif
for(k = 0; k < MAX / LIO_MAX; k++) {
for(k = 0; k < MAX_IOCBS / LIO_MAX; k++) {
free(lio[j][k]);
}
free(lio[j]);