97 #include <sys/types.h> 99 #if defined(solaris) || defined(linux) || defined(SCO_Unixware_gcc) 101 #include <sys/timers.h> 103 #include <sys/errno.h> 109 #include <sys/fs/vx_ioctl.h> 112 #if defined(OSFV5) || defined(linux) 122 #if (defined(solaris) && defined(__LP64__)) || defined(__s390x__) || defined(FreeBSD) 135 void mbcopy(
char *source,
char *dest,
size_t len);
138 #if !defined(solaris) && !defined(off64_t) && !defined(_OFF64_T) && !defined(__off64_t_defined) && !defined(SCO_Unixware_gcc) 153 char version[] =
"Libasync Version $Revision$";
156 #ifdef _LARGEFILE64_SOURCE 157 #if defined(__CrayX1__) 160 struct aiocb64 myaiocb64;
217 #if !defined(__LP64__) 234 ioctl(
fd,VX_SETCACHE,VX_DIRECT);
238 printf(
"Warning calling async_init two times ?\n");
241 *gc=(
struct cache *)malloc((
size_t)
sizeof(
struct cache));
244 printf(
"Malloc failed\n");
248 #if defined(__AIX__) || defined(SCO_Unixware_gcc) 273 #ifdef _LARGEFILE64_SOURCE 275 const struct aiocb *
const cblist[1] = {&ce->
myaiocb};
277 const struct aiocb64 *
const cblist[1] = {&ce->myaiocb64};
280 const struct aiocb *
const cblist[1] = {&ce->
myaiocb};
283 #ifdef _LARGEFILE64_SOURCE 285 return aio_suspend(cblist, 1, NULL);
287 return aio_suspend64(cblist, 1, NULL);
290 return aio_suspend(cblist, 1, NULL);
341 long long del_read=0;
350 #ifdef _LARGEFILE64_SOURCE 352 while((
ret=aio_error(&ce->
myaiocb))== EINPROGRESS)
357 while((
ret=aio_error64(&ce->myaiocb64))== EINPROGRESS)
363 while((
ret=aio_error(&ce->
myaiocb))== EINPROGRESS)
370 printf(
"aio_error 1: ret %d %d\n",
ret,
errno);
372 #ifdef _LARGEFILE64_SOURCE 376 #if defined(__CrayX1__) 377 retval=aio_return64((aiocb64_t *)&ce->myaiocb64);
379 retval=aio_return64((
struct aiocb64 *)&ce->myaiocb64);
388 #ifdef _LARGEFILE64_SOURCE 392 mbcopy((
char *)ce->myaiocb64.aio_buf,(
char *)ubuffer,(
size_t)
retval);
398 #ifdef _LARGEFILE64_SOURCE 400 if(retval < ce->
myaiocb.aio_nbytes)
402 if(retval < ce->myaiocb64.aio_nbytes)
405 if(retval < ce->
myaiocb.aio_nbytes)
408 printf(
"aio_return error1: ret %d %d\n",
retval,
errno);
409 #ifdef _LARGEFILE64_SOURCE 411 printf(
"aio_return error1: fd %d offset %ld buffer %lx size %d Opcode %d\n",
418 printf(
"aio_return error1: fd %d offset %lld buffer %lx size %d Opcode %d\n",
419 ce->myaiocb64.aio_fildes,
420 ce->myaiocb64.aio_offset,
421 (
long)(ce->myaiocb64.aio_buf),
422 ce->myaiocb64.aio_nbytes,
423 ce->myaiocb64.aio_lio_opcode
426 printf(
"aio_return error1: fd %d offset %d buffer %lx size %d Opcode %d\n",
446 #ifdef _LARGEFILE64_SOURCE 450 ret=aio_read64(&first_ce->myaiocb64);
460 printf(
"error returned from aio_read(). Ret %d errno %d\n",
ret,
errno);
467 if(a_offset+
size>max)
477 r_offset=a_offset+((
i+1)*(
stride*a_size));
480 if(r_offset+
size > max)
485 #ifdef _LARGEFILE64_SOURCE 489 ret=aio_read64(&ce->myaiocb64);
503 #ifdef _LARGEFILE64_SOURCE 505 while((
ret=aio_error(&first_ce->
myaiocb))== EINPROGRESS)
510 while((
ret=aio_error64(&first_ce->myaiocb64))== EINPROGRESS)
516 while((
ret=aio_error(&first_ce->
myaiocb))== EINPROGRESS)
522 printf(
"aio_error 2: ret %d %d\n",
ret,
errno);
523 #ifdef _LARGEFILE64_SOURCE 527 retval=aio_return64(&first_ce->myaiocb64);
532 #ifdef _LARGEFILE64_SOURCE 534 if(retval < first_ce->
myaiocb.aio_nbytes)
536 if(retval < first_ce->myaiocb64.aio_nbytes)
539 if(retval < first_ce->
myaiocb.aio_nbytes)
542 printf(
"aio_return error2: ret %d %d\n",
retval,
errno);
543 #ifdef _LARGEFILE64_SOURCE 545 printf(
"aio_return error2: fd %d offset %lld buffer %lx size %d Opcode %d\n",
548 (
long)(first_ce->
myaiocb.aio_buf),
550 first_ce->
myaiocb.aio_lio_opcode
552 printf(
"aio_return error2: fd %d offset %lld buffer %lx size %d Opcode %d\n",
553 first_ce->myaiocb64.aio_fildes,
554 first_ce->myaiocb64.aio_offset,
555 (
long)(first_ce->myaiocb64.aio_buf),
556 first_ce->myaiocb64.aio_nbytes,
557 first_ce->myaiocb64.aio_lio_opcode
560 printf(
"aio_return error2: fd %d offset %d buffer %lx size %d Opcode %d\n",
563 (
long)(first_ce->
myaiocb.aio_buf),
565 first_ce->
myaiocb.aio_lio_opcode
571 #ifdef _LARGEFILE64_SOURCE 575 mbcopy((
char *)first_ce->myaiocb64.aio_buf,(
char *)ubuffer,(
size_t)
retval);
600 long long fd,size,op;
608 printf(
"Malloc failed\n");
612 #ifdef _LARGEFILE64_SOURCE 619 ce->
myaiocb.aio_buf=(
volatile void *)temp;
622 ce->myaiocb64.aio_fildes=(int)
fd;
627 ce->myaiocb64.aio_buf=(
volatile void *)temp;
628 if(ce->myaiocb64.aio_buf == 0)
636 ce->
myaiocb.aio_buf=(
volatile void *)temp;
640 printf(
"Malloc failed\n");
644 #ifdef _LARGEFILE64_SOURCE 649 ce->
myaiocb.aio_lio_opcode=(int)op;
651 ce->myaiocb64.aio_reqprio=0;
653 ce->myaiocb64.aio_sigevent.sigev_notify=
SIGEV_NONE;
654 ce->myaiocb64.aio_lio_opcode=(int)op;
660 ce->
myaiocb.aio_lio_opcode=(int)op;
690 #ifdef _LARGEFILE64_SOURCE 705 ((
size_t)
size==move->myaiocb64.aio_nbytes))
779 printf(
"Internal Error in takeoff cache\n");
807 #ifdef _LARGEFILE64_SOURCE 809 while((
ret = aio_cancel(0,&ce->
myaiocb))==AIO_NOTCANCELED)
811 while((
ret = aio_cancel64(0,&ce->myaiocb64))==AIO_NOTCANCELED)
814 while((
ret = aio_cancel(0,&ce->
myaiocb))==AIO_NOTCANCELED)
818 #ifdef _LARGEFILE64_SOURCE 822 ret = aio_return64(&ce->myaiocb64);
857 long long del_read=0;
867 #ifdef _LARGEFILE64_SOURCE 869 while((
ret=aio_error(&ce->
myaiocb))== EINPROGRESS)
874 while((
ret=aio_error64(&ce->myaiocb64))== EINPROGRESS)
880 while((
ret=aio_error(&ce->
myaiocb))== EINPROGRESS)
886 printf(
"aio_error 3: ret %d %d\n",
ret,
errno);
887 #ifdef _LARGEFILE64_SOURCE 893 if(ce->
oldbuf != ce->myaiocb64.aio_buf ||
894 ce->
oldfd != ce->myaiocb64.aio_fildes ||
895 ce->
oldsize != ce->myaiocb64.aio_nbytes)
902 printf(
"It changed in flight\n");
904 #ifdef _LARGEFILE64_SOURCE 908 retval=aio_return64(&ce->myaiocb64);
915 #ifdef _LARGEFILE64_SOURCE 917 *ubuffer=(
char *)ce->
myaiocb.aio_buf;
919 *ubuffer=(
char *)ce->myaiocb64.aio_buf;
922 *ubuffer=(
char *)ce->
myaiocb.aio_buf;
926 #ifdef _LARGEFILE64_SOURCE 928 if(retval < ce->
myaiocb.aio_nbytes)
930 if(retval < ce->myaiocb64.aio_nbytes)
933 if(retval < ce->
myaiocb.aio_nbytes)
936 printf(
"aio_return error4: ret %d %d\n",
retval,
errno);
937 #ifdef _LARGEFILE64_SOURCE 939 printf(
"aio_return error4: fd %d offset %lld buffer %lx size %d Opcode %d\n",
946 printf(
"aio_return error4: fd %d offset %lld buffer %lx size %d Opcode %d\n",
947 ce->myaiocb64.aio_fildes,
948 ce->myaiocb64.aio_offset,
949 (
long)(ce->myaiocb64.aio_buf),
950 ce->myaiocb64.aio_nbytes,
951 ce->myaiocb64.aio_lio_opcode
954 printf(
"aio_return error4: fd %d offset %d buffer %lx size %d Opcode %d\n",
976 #ifdef _LARGEFILE64_SOURCE 983 first_ce->
oldbuf=first_ce->myaiocb64.aio_buf;
984 first_ce->
oldfd=first_ce->myaiocb64.aio_fildes;
985 first_ce->
oldsize=first_ce->myaiocb64.aio_nbytes;
986 ret=aio_read64(&first_ce->myaiocb64);
999 printf(
"error returned from aio_read(). Ret %d errno %d\n",
ret,
errno);
1006 if(a_offset+
size>max)
1016 r_offset=a_offset+((
i+1)*(
stride*a_size));
1019 if(r_offset+
size > max)
1024 #ifdef _LARGEFILE64_SOURCE 1031 ce->
oldbuf=ce->myaiocb64.aio_buf;
1032 ce->
oldfd=ce->myaiocb64.aio_fildes;
1033 ce->
oldsize=ce->myaiocb64.aio_nbytes;
1034 ret=aio_read64(&ce->myaiocb64);
1051 #ifdef _LARGEFILE64_SOURCE 1053 while((
ret=aio_error(&first_ce->
myaiocb))== EINPROGRESS)
1058 while((
ret=aio_error64(&first_ce->myaiocb64))== EINPROGRESS)
1064 while((
ret=aio_error(&first_ce->
myaiocb))== EINPROGRESS)
1070 printf(
"aio_error 4: ret %d %d\n",
ret,
errno);
1071 #ifdef _LARGEFILE64_SOURCE 1076 printf(
"It changed in flight2\n");
1079 if(first_ce->
oldbuf != first_ce->myaiocb64.aio_buf ||
1080 first_ce->
oldfd != first_ce->myaiocb64.aio_fildes ||
1081 first_ce->
oldsize != first_ce->myaiocb64.aio_nbytes)
1082 printf(
"It changed in flight2\n");
1083 retval=aio_return64(&first_ce->myaiocb64);
1089 printf(
"It changed in flight2\n");
1092 #ifdef _LARGEFILE64_SOURCE 1094 if(retval < first_ce->
myaiocb.aio_nbytes)
1096 if(retval < first_ce->myaiocb64.aio_nbytes)
1099 if(retval < first_ce->
myaiocb.aio_nbytes)
1102 printf(
"aio_return error5: ret %d %d\n",
retval,
errno);
1103 #ifdef _LARGEFILE64_SOURCE 1105 printf(
"aio_return error5: fd %d offset %lld buffer %lx size %d Opcode %d\n",
1108 (
long)(first_ce->
myaiocb.aio_buf),
1110 first_ce->
myaiocb.aio_lio_opcode
1112 printf(
"aio_return error5: fd %d offset %lld buffer %lx size %d Opcode %d\n",
1113 first_ce->myaiocb64.aio_fildes,
1114 first_ce->myaiocb64.aio_offset,
1115 (
long)(first_ce->myaiocb64.aio_buf),
1116 first_ce->myaiocb64.aio_nbytes,
1117 first_ce->myaiocb64.aio_lio_opcode
1120 printf(
"aio_return error5: fd %d offset %ld buffer %lx size %d Opcode %d\n",
1123 (
long)(first_ce->
myaiocb.aio_buf),
1125 first_ce->
myaiocb.aio_lio_opcode
1131 #ifdef _LARGEFILE64_SOURCE 1133 *ubuffer=(
char *)first_ce->
myaiocb.aio_buf;
1135 *ubuffer=(
char *)first_ce->myaiocb64.aio_buf;
1138 *ubuffer=(
char *)first_ce->
myaiocb.aio_buf;
1189 printf(
"Takeoffinuse error\n");
1194 printf(
"Error in take off inuse\n");
1220 #ifdef _LARGEFILE64_SOURCE 1237 #ifdef _LARGEFILE64_SOURCE 1241 ret=aio_write64(&ce->myaiocb64);
1261 printf(
"Error in aio_write: ret %d errno %d count %lld\n",
ret,
errno,gc->
w_count);
1272 return((ssize_t)
size);
1284 long long fd,size,op;
1294 printf(
"Setting up write buffer insane\n");
1302 printf(
"Malloc failed 1\n");
1306 #ifdef _LARGEFILE64_SOURCE 1315 ce->
myaiocb.aio_buf=(
volatile void *)temp;
1323 ce->myaiocb64.aio_fildes=(int)
fd;
1330 ce->myaiocb64.aio_buf=(
volatile void *)temp;
1334 ce->myaiocb64.aio_buf=(
volatile void *)
buffer;
1337 if(ce->myaiocb64.aio_buf == 0)
1347 ce->
myaiocb.aio_buf=(
volatile void *)temp;
1357 printf(
"Malloc failed 2\n");
1360 #ifdef _LARGEFILE64_SOURCE 1365 ce->
myaiocb.aio_lio_opcode=(int)op;
1367 ce->myaiocb64.aio_reqprio=0;
1369 ce->myaiocb64.aio_sigevent.sigev_notify=
SIGEV_NONE;
1370 ce->myaiocb64.aio_lio_opcode=(int)op;
1376 ce->
myaiocb.aio_lio_opcode=(int)op;
1440 #ifdef _LARGEFILE64_SOURCE 1442 while((
ret=aio_error(&ce->
myaiocb))== EINPROGRESS)
1447 while((
ret=aio_error64(&ce->myaiocb64))== EINPROGRESS)
1453 while((
ret=aio_error(&ce->
myaiocb))== EINPROGRESS)
1460 printf(
"aio_error 5: ret %d %d\n",
ret,
errno);
1461 #ifdef _LARGEFILE64_SOURCE 1463 printf(
"fd %d offset %lld size %d\n",
1468 printf(
"fd %d offset %lld size %d\n",
1469 ce->myaiocb64.aio_fildes,
1470 ce->myaiocb64.aio_offset,
1471 ce->myaiocb64.aio_nbytes);
1474 printf(
"fd %d offset %lld size %d\n",
1482 #ifdef _LARGEFILE64_SOURCE 1486 #if defined(__CrayX1__) 1487 retval=aio_return64((aiocb64_t *)&ce->myaiocb64);
1489 retval=aio_return64((
struct aiocb64 *)&ce->myaiocb64);
1498 printf(
"aio_return error: %d\n",
errno);
1542 #ifdef _LARGEFILE64_SOURCE 1546 ret=aio_write64(&ce->myaiocb64);
1566 printf(
"Error in aio_write: ret %d errno %d\n",
ret,
errno);
1567 #ifdef _LARGEFILE64_SOURCE 1569 printf(
"aio_write_no_copy: fd %d buffer %lx offset %lld size %d\n",
1575 printf(
"aio_write_no_copy: fd %d buffer %lx offset %lld size %d\n",
1576 ce->myaiocb64.aio_fildes,
1577 (
long)(ce->myaiocb64.aio_buf),
1578 ce->myaiocb64.aio_offset,
1579 ce->myaiocb64.aio_nbytes);
1582 printf(
"aio_write_no_copy: fd %d buffer %lx offset %ld size %d\n",
1593 return((ssize_t)
size);
void async_write_finish()
struct cache_ent * alloc_cache()
static struct timeval start
struct cache_ent * incache()
void async_put_on_write_queue()
struct cache_ent * w_tail
int async_read_no_copy(struct cache *gc, long long fd, char **ubuffer, off64_t offset, long long size, long long stride, off64_t max, long long depth)
void mbcopy(char *source, char *dest, size_t len)
struct cache_ent * w_head
struct cache_ent * forward
struct cache_ent * inuse_head
size_t async_write_no_copy(struct cache *gc, long long fd, char *buffer, long long size, off64_t offset, long long depth, char *free_addr)
void async_wait_for_write()
struct cache_ent * allocate_write_buffer()