Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F152993723
D11680.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D11680.diff
View Options
Index: head/lib/librt/Symbol.map
===================================================================
--- head/lib/librt/Symbol.map
+++ head/lib/librt/Symbol.map
@@ -26,6 +26,7 @@
};
FBSD_1.5 {
+ lio_listio;
mq_getfd_np;
timer_oshandle_np;
};
Index: head/lib/librt/aio.c
===================================================================
--- head/lib/librt/aio.c
+++ head/lib/librt/aio.c
@@ -44,6 +44,7 @@
__weak_reference(__aio_return, aio_return);
__weak_reference(__aio_waitcomplete, aio_waitcomplete);
__weak_reference(__aio_fsync, aio_fsync);
+__weak_reference(__lio_listio, lio_listio);
typedef void (*aio_func)(union sigval val, struct aiocb *iocb);
@@ -53,6 +54,8 @@
extern ssize_t __sys_aio_return(struct aiocb *iocb);
extern int __sys_aio_error(struct aiocb *iocb);
extern int __sys_aio_fsync(int op, struct aiocb *iocb);
+extern int __sys_lio_listio(int mode, struct aiocb * const list[], int nent,
+ struct sigevent *sig);
static void
aio_dispatch(struct sigev_node *sn)
@@ -63,8 +66,8 @@
}
static int
-aio_sigev_alloc(struct aiocb *iocb, struct sigev_node **sn,
- struct sigevent *saved_ev)
+aio_sigev_alloc(sigev_id_t id, struct sigevent *sigevent,
+ struct sigev_node **sn, struct sigevent *saved_ev)
{
if (__sigev_check_init()) {
/* This might be that thread library is not enabled. */
@@ -72,15 +75,15 @@
return (-1);
}
- *sn = __sigev_alloc(SI_ASYNCIO, &iocb->aio_sigevent, NULL, 1);
+ *sn = __sigev_alloc(SI_ASYNCIO, sigevent, NULL, 1);
if (*sn == NULL) {
errno = EAGAIN;
return (-1);
}
- *saved_ev = iocb->aio_sigevent;
- (*sn)->sn_id = (sigev_id_t)iocb;
- __sigev_get_sigevent(*sn, &iocb->aio_sigevent, (*sn)->sn_id);
+ *saved_ev = *sigevent;
+ (*sn)->sn_id = id;
+ __sigev_get_sigevent(*sn, sigevent, (*sn)->sn_id);
(*sn)->sn_dispatch = aio_dispatch;
__sigev_list_lock();
@@ -102,7 +105,8 @@
return (ret);
}
- ret = aio_sigev_alloc(iocb, &sn, &saved_ev);
+ ret = aio_sigev_alloc((sigev_id_t)iocb, &iocb->aio_sigevent, &sn,
+ &saved_ev);
if (ret)
return (ret);
ret = sysfunc(iocb);
@@ -183,11 +187,38 @@
if (iocb->aio_sigevent.sigev_notify != SIGEV_THREAD)
return __sys_aio_fsync(op, iocb);
- ret = aio_sigev_alloc(iocb, &sn, &saved_ev);
+ ret = aio_sigev_alloc((sigev_id_t)iocb, &iocb->aio_sigevent, &sn,
+ &saved_ev);
if (ret)
return (ret);
ret = __sys_aio_fsync(op, iocb);
iocb->aio_sigevent = saved_ev;
+ if (ret != 0) {
+ err = errno;
+ __sigev_list_lock();
+ __sigev_delete_node(sn);
+ __sigev_list_unlock();
+ errno = err;
+ }
+ return (ret);
+}
+
+int
+__lio_listio(int mode, struct aiocb * const list[], int nent,
+ struct sigevent *sig)
+{
+ struct sigev_node *sn;
+ struct sigevent saved_ev;
+ int ret, err;
+
+ if (sig == NULL || sig->sigev_notify != SIGEV_THREAD)
+ return (__sys_lio_listio(mode, list, nent, sig));
+
+ ret = aio_sigev_alloc((sigev_id_t)list, sig, &sn, &saved_ev);
+ if (ret)
+ return (ret);
+ ret = __sys_lio_listio(mode, list, nent, sig);
+ *sig = saved_ev;
if (ret != 0) {
err = errno;
__sigev_list_lock();
Index: head/tests/sys/aio/lio_test.c
===================================================================
--- head/tests/sys/aio/lio_test.c
+++ head/tests/sys/aio/lio_test.c
@@ -119,8 +119,8 @@
struct aiocb *list = NULL;
struct sigevent sev;
- atf_tc_expect_fail("Bug 220459 - lio_listio(2) doesn't support"
- " SIGEV_THREAD");
+ atf_tc_expect_timeout("Bug 220398 - lio_listio(2) never sends"
+ "asynchronous notification if nent==0");
ATF_REQUIRE_EQ(0, sem_init(&completions, false, 0));
bzero(&sev, sizeof(sev));
sev.sigev_notify = SIGEV_THREAD;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Apr 19, 12:50 PM (3 h, 27 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31771041
Default Alt Text
D11680.diff (3 KB)
Attached To
Mode
D11680: Implement SIGEV_THREAD notifications for lio_listio(2)
Attached
Detach File
Event Timeline
Log In to Comment