svn commit: samba r7417 - in trunk/source: . include lib smbd
jra at samba.org
jra at samba.org
Thu Jun 9 00:13:12 GMT 2005
Author: jra
Date: 2005-06-09 00:13:10 +0000 (Thu, 09 Jun 2005)
New Revision: 7417
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=7417
Log:
Added autoconf option to turn on aio calls.
--with-aio-support. Works on Linux - other systems please
look at the configure.in tests and adjust accordingly.
Jeremy
Modified:
trunk/source/configure.in
trunk/source/include/includes.h
trunk/source/lib/system.c
trunk/source/smbd/aio.c
Changeset:
Modified: trunk/source/configure.in
===================================================================
--- trunk/source/configure.in 2005-06-08 23:01:38 UTC (rev 7416)
+++ trunk/source/configure.in 2005-06-09 00:13:10 UTC (rev 7417)
@@ -1034,8 +1034,6 @@
AC_CHECK_FUNCS(syslog vsyslog timegm)
AC_CHECK_FUNCS(setlocale nl_langinfo)
AC_CHECK_FUNCS(nanosleep)
-AC_CHECK_FUNCS(aio_cancel aio_cancel64 aio_error aio_error64 aio_fsync aio_fsync64 aio_read aio_read64)
-AC_CHECK_FUNCS(aio_return aio_return64 aio_suspend aio_suspend64 aio_write aio_write64)
# setbuffer, shmget, shm_open are needed for smbtorture
AC_CHECK_FUNCS(setbuffer shmget shm_open backtrace_symbols)
AC_CHECK_HEADERS(libexc.h)
@@ -4048,6 +4046,57 @@
)
#################################################
+# check for AIO support
+
+AC_MSG_CHECKING(whether to support asynchronous io)
+AC_ARG_WITH(aio-support,
+[ --with-aio-support Include asynchronous io support (default=no)],
+[ case "$withval" in
+ yes)
+
+ case "$host_os" in
+ *)
+ AC_CHECK_LIB(rt,aio_read,[AIO_LIBS="$ACL_LIBS -lrt"])
+ AC_CACHE_CHECK([for asynchronous io support],samba_cv_HAVE_AIO,[
+ aio_LIBS=$LIBS
+ LIBS="$LIBS -lrt"
+ AC_TRY_LINK([#include <sys/types.h>
+#include <aio.h>],
+[ struct aiocb a; return aio_read(&a);],
+samba_cv_HAVE_AIO=yes,samba_cv_HAVE_AIO=no)
+ LIBS=$aio_LIBS])
+ AC_CACHE_CHECK([for 64-bit asynchronous io support],samba_cv_HAVE_AIO64,[
+ aio_LIBS=$LIBS
+ LIBS="$LIBS -lrt"
+ AC_TRY_LINK([#include <sys/types.h>
+#include <aio.h>],
+[ struct aiocb64 a; return aio_read64(&a);],
+samba_cv_HAVE_AIO64=yes,samba_cv_HAVE_AIO64=no)
+ LIBS=$aio_LIBS])
+ if test x"$samba_cv_HAVE_AIO64" = x"yes"; then
+ AC_DEFINE(HAVE_AIOCB64,1,[Whether 64 bit aio is available])
+ AC_DEFINE(WITH_AIO, 1, [Using asynchronous io])
+ LIBS="$LIBS -lrt"
+ elif test x"$samba_cv_HAVE_AIO" = x"yes"; then
+ AC_DEFINE(WITH_AIO, 1, [Using asynchronous io])
+ LIBS="$LIBS -lrt"
+ fi
+ ;;
+ esac
+ ;;
+ *)
+ AC_MSG_RESULT(no)
+ AC_DEFINE(HAVE_NO_AIO,1,[Whether no asynchronous io support is available])
+ ;;
+ esac ],
+ AC_DEFINE(HAVE_NO_AIO,1,[Whether no asynchronous io support should be built in])
+ AC_MSG_RESULT(no)
+)
+
+AC_CHECK_FUNCS(aio_cancel aio_cancel64 aio_error aio_error64 aio_fsync aio_fsync64 aio_read aio_read64)
+AC_CHECK_FUNCS(aio_return aio_return64 aio_suspend aio_suspend64 aio_write aio_write64)
+
+#################################################
# check for sendfile support
with_sendfile_support=yes
Modified: trunk/source/include/includes.h
===================================================================
--- trunk/source/include/includes.h 2005-06-08 23:01:38 UTC (rev 7416)
+++ trunk/source/include/includes.h 2005-06-09 00:13:10 UTC (rev 7417)
@@ -770,10 +770,14 @@
*/
#ifndef SMB_STRUCT_AIOCB
-# if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64)
-# define SMB_STRUCT_AIOCB struct aiocb64
+# if defined(WITH_AIO)
+# if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64)
+# define SMB_STRUCT_AIOCB struct aiocb64
+# else
+# define SMB_STRUCT_AIOCB struct aiocb
+# endif
# else
-# define SMB_STRUCT_AIOCB struct aiocb
+# define SMB_STRUCT_AIOCB int /* AIO not being used but we still need the define.... */
# endif
#endif
Modified: trunk/source/lib/system.c
===================================================================
--- trunk/source/lib/system.c 2005-06-08 23:01:38 UTC (rev 7416)
+++ trunk/source/lib/system.c 2005-06-09 00:13:10 UTC (rev 7417)
@@ -1847,6 +1847,8 @@
#endif
}
+#if defined(WITH_AIO)
+
/*******************************************************************
An aio_read wrapper that will deal with 64-bit sizes.
********************************************************************/
@@ -1902,11 +1904,37 @@
int sys_aio_cancel(int fd, SMB_STRUCT_AIOCB *aiocb)
{
#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_CANCEL64)
- return aio_cancel64(aiocb);
+ return aio_cancel64(fd, aiocb);
#elif defined(HAVE_AIO_CANCEL)
- return aio_cancel(aiocb);
+ return aio_cancel(fd, aiocb);
#else
errno = ENOSYS;
return -1;
#endif
}
+
+#else /* !WITH_AIO */
+int sys_aio_read(SMB_STRUCT_AIOCB *aiocb)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+int sys_aio_write(SMB_STRUCT_AIOCB *aiocb)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+ssize_t sys_aio_return(SMB_STRUCT_AIOCB *aiocb)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+int sys_aio_cancel(int fd, SMB_STRUCT_AIOCB *aiocb)
+{
+ errno = ENOSYS;
+ return -1;
+}
+#endif /* WITH_AIO */
Modified: trunk/source/smbd/aio.c
===================================================================
--- trunk/source/smbd/aio.c 2005-06-08 23:01:38 UTC (rev 7416)
+++ trunk/source/smbd/aio.c 2005-06-09 00:13:10 UTC (rev 7417)
@@ -21,8 +21,7 @@
#include "includes.h"
-/* #define HAVE_POSIX_ASYNC_IO 1 */
-#if HAVE_POSIX_ASYNC_IO
+#if defined(WITH_AIO)
/* The signal we'll use to signify aio done. */
#ifndef RT_SIGNAL_AIO
@@ -241,7 +240,7 @@
a->aio_sigevent.sigev_signo = RT_SIGNAL_AIO;
a->aio_sigevent.sigev_value.sival_ptr = (void *)&aio_ex->mid;
- if (aio_read(a) == -1) {
+ if (sys_aio_read(a) == -1) {
DEBUG(0,("schedule_aio_read_and_X: aio_read failed. Error %s\n",
strerror(errno) ));
delete_aio_ex(aio_ex);
@@ -317,7 +316,7 @@
a->aio_sigevent.sigev_signo = RT_SIGNAL_AIO;
a->aio_sigevent.sigev_value.sival_ptr = (void *)&aio_ex->mid;
- if (aio_write(a) == -1) {
+ if (sys_aio_write(a) == -1) {
DEBUG(0,("schedule_aio_read_and_X: aio_write failed. Error %s\n",
strerror(errno) ));
/* Replace global InBuf as we're going to do a normal write. */
@@ -345,7 +344,7 @@
int outsize;
char *outbuf = aio_ex->outbuf;
char *data = smb_buf(outbuf);
- ssize_t nread = aio_return(&aio_ex->acb);
+ ssize_t nread = sys_aio_return(&aio_ex->acb);
if (aio_ex->fsp == NULL) {
/* file was closed whilst I/O was outstanding. Just ignore. */
@@ -400,7 +399,7 @@
static void handle_aio_write_complete(struct aio_extra *aio_ex)
{
char *outbuf = aio_ex->outbuf;
- ssize_t nwritten = aio_return(&aio_ex->acb);
+ ssize_t nwritten = sys_aio_return(&aio_ex->acb);
ssize_t numtowrite = aio_ex->acb.aio_nbytes;
if (aio_ex->fsp == NULL) {
@@ -503,7 +502,7 @@
if (aio_ex->fsp == fsp) {
/* Don't delete the aio_extra record as we may have completed
and don't yet know it. Just do the aio_cancel call and return. */
- aio_cancel(fsp->fd, &aio_ex->acb);
+ sys_aio_cancel(fsp->fd, &aio_ex->acb);
aio_ex->fsp = NULL; /* fsp will be closed when we return. */
}
}
More information about the samba-cvs
mailing list