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