aio/unix: Use signal.sival which is standard

Sergey Kandaurov pluknet at nginx.com
Thu Jan 17 10:29:56 UTC 2019



> On 17 Jan 2019, at 08:43, Sepherosa Ziehau <sepherosa at gmail.com> wrote:
> 
> What's the preferred way to handle this?  I am not sure whether you
> guys allow __FreeBSD_version testing etc.
> 

This could be solved with autotests.

# HG changeset patch
# User Sergey Kandaurov <pluknet at nginx.com>
# Date 1547720890 0
#      Thu Jan 17 10:28:10 2019 +0000
# Node ID d28513cd71bce227b4e159b7a3f518aa504232f0
# Parent  6d15e452fa2eaf19408e24a0d0fcc3a31344a289
Fixed portability issues with union sigval.

The sival_ptr field is now preferably used.

diff --git a/auto/unix b/auto/unix
--- a/auto/unix
+++ b/auto/unix
@@ -523,6 +523,7 @@ if [ $NGX_FILE_AIO = YES ]; then
     ngx_feature_libs=
     ngx_feature_test="struct aiocb  iocb;
                       iocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
+                      iocb.aio_sigevent.sigev_value.sival_ptr = NULL;
                       (void) aio_read(&iocb)"
     . auto/feature
 
@@ -532,6 +533,22 @@ if [ $NGX_FILE_AIO = YES ]; then
 
     if [ $ngx_found = no ]; then
 
+        ngx_feature="kqueue AIO support (legacy)"
+        ngx_feature_name="NGX_HAVE_FILE_AIO_LEGACY"
+        ngx_feature_test="struct aiocb  iocb;
+                          iocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
+                          iocb.aio_sigevent.sigev_value.sigval_ptr = NULL;
+                          (void) aio_read(&iocb)"
+        . auto/feature
+
+        if [ $ngx_found = yes ]; then
+            CORE_SRCS="$CORE_SRCS $FILE_AIO_SRCS"
+            have=NGX_HAVE_FILE_AIO . auto/have
+        fi
+    fi
+
+    if [ $ngx_found = no ]; then
+
         ngx_feature="Linux AIO support"
         ngx_feature_name="NGX_HAVE_FILE_AIO"
         ngx_feature_run=no
diff --git a/src/os/unix/ngx_file_aio_read.c b/src/os/unix/ngx_file_aio_read.c
--- a/src/os/unix/ngx_file_aio_read.c
+++ b/src/os/unix/ngx_file_aio_read.c
@@ -110,8 +110,12 @@ ngx_file_aio_read(ngx_file_t *file, u_ch
 #if (NGX_HAVE_KQUEUE)
     aio->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue;
     aio->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
+#if !(NGX_HAVE_FILE_AIO_LEGACY)
+    aio->aiocb.aio_sigevent.sigev_value.sival_ptr = ev;
+#else
     aio->aiocb.aio_sigevent.sigev_value.sigval_ptr = ev;
 #endif
+#endif
     ev->handler = ngx_file_aio_event_handler;
 
     n = aio_read(&aio->aiocb);


-- 
Sergey Kandaurov



More information about the nginx-devel mailing list