On Thu, May 18, 2006, Adrian Chadd wrote:
> Hi everyone,
>
> I'd like to propose using pread() and pwrite() in the AUFS AIO
> read/write code. This allows multiple concurrent readers/writers
> to be accessing the same filedescriptor which enables COSS
> to use AIO.
>
> Does anyone have a problem with this? Can it be changed to just
> use it, or should I try to make it a configure/compiletime option?
Here's a diff. I need to #define _XOPEN_SOURCE 500 under linux - this,
however, causes things to just not compile. I have no idea why. :/
Could someone please help me figure out why it ain't working?
Thanks,
adrian
Index: configure.in
===================================================================
RCS file: /server/cvs-server/squid/squid/configure.in,v
retrieving revision 1.319
diff -u -r1.319 configure.in
--- configure.in 18 May 2006 04:03:22 -0000 1.319
+++ configure.in 18 May 2006 09:33:24 -0000
@@ -780,6 +780,27 @@
esac
])
+
+dnl Enable pread()/pwrite()
+AC_ARG_ENABLE(pread,
+[ --enable-pread Enable using pread/pwrite for Squid Async IO.
+ This is slightly more efficient and is required
+ for COSS under Linux.
+ --disable-pread Disable the use of pread/pwrite.],
+[
+ case "$enableval" in
+ yes)
+ echo "Forcing pread()/pwrite() to be enabled"
+ ac_cv_func_pread='yes'
+ AC_DEFINE_UNQUOTED(USE_PREAD, 1)
+ ;;
+ no)
+ echo "Forcing pread()/pwrite() to be disabled"
+ ac_cv_func_pread='no'
+ ;;
+ esac
+])
+
dnl Disable HTTP violations
AC_ARG_ENABLE(http-violations,
[ --disable-http-violations
Index: include/autoconf.h.in
===================================================================
RCS file: /server/cvs-server/squid/squid/include/autoconf.h.in,v
retrieving revision 1.136
diff -u -r1.136 autoconf.h.in
--- include/autoconf.h.in 18 May 2006 04:32:19 -0000 1.136
+++ include/autoconf.h.in 18 May 2006 09:33:24 -0000
@@ -938,5 +938,7 @@
/* Enable hostname sanity checks */
#undef CHECK_HOSTNAMES
+/* Enable using pread/write */
+#undef USE_PREAD
#endif /* __CONFIGURE_H__ */
Index: src/fs/aufs/aiops.c
===================================================================
RCS file: /server/cvs-server/squid/squid/src/fs/aufs/aiops.c,v
retrieving revision 1.23
diff -u -r1.23 aiops.c
--- src/fs/aufs/aiops.c 16 May 2006 05:42:14 -0000 1.23
+++ src/fs/aufs/aiops.c 18 May 2006 09:33:24 -0000
@@ -669,8 +669,12 @@
static void
squidaio_do_read(squidaio_request_t * requestp)
{
+#if USE_PREAD
+ requestp->ret = pread(requestp->fd, requestp->bufferp, requestp->buflen,
requestp->offset);
+#else
lseek(requestp->fd, requestp->offset, requestp->whence);
requestp->ret = read(requestp->fd, requestp->bufferp, requestp->buflen);
+#endif
requestp->err = errno;
}
@@ -698,7 +702,12 @@
static void
squidaio_do_write(squidaio_request_t * requestp)
{
+#if USE_PREAD
+ assert(requestp->offset > 0);
+ requestp->ret = pwrite(requestp->fd, requestp->bufferp, requestp->buflen,
requestp->offset);
+#else
requestp->ret = write(requestp->fd, requestp->bufferp, requestp->buflen);
+#endif
requestp->err = errno;
}