diff options
| author | Garrett D'Amore <garrett@damore.org> | 2023-11-25 17:35:35 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2023-11-25 17:47:02 -0800 |
| commit | e623dedab28a1fec6270c05f9643e68bfb98b7c3 (patch) | |
| tree | 2860475e583380771ac900c0d6417627efdcbd03 /src/core/aio.h | |
| parent | e5fcc317c5f75d8fc6ea053c9f960e35e09ac38f (diff) | |
| download | nng-e623dedab28a1fec6270c05f9643e68bfb98b7c3.tar.gz nng-e623dedab28a1fec6270c05f9643e68bfb98b7c3.tar.bz2 nng-e623dedab28a1fec6270c05f9643e68bfb98b7c3.zip | |
fixes #1523 rare SEGV in sub nni_list_remove
Credit goes to Wu Xuan (@willwu1217) for diagnosing and proposing
a fix as part of #1695. This approach takes a revised approach
to avoid adding extra memory, and it also is slightly faster as we
do not need to update both pointers in the linked list, by reusing
the reap node.
As part of this a new internal API, nni_aio_completions, is introduced.
In all likelihood we will be able to use this to solve some similar
crashes in other areas of the code.
Diffstat (limited to 'src/core/aio.h')
| -rw-r--r-- | src/core/aio.h | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/core/aio.h b/src/core/aio.h index 6315e90c..a2ebf70a 100644 --- a/src/core/aio.h +++ b/src/core/aio.h @@ -1,5 +1,5 @@ // -// Copyright 2022 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2023 Staysail Systems, Inc. <info@staysail.tech> // Copyright 2018 Capitar IT Group BV <info@capitar.com> // // This software is supplied under the terms of the MIT License, a @@ -166,6 +166,30 @@ extern int nni_aio_schedule(nni_aio *, nni_aio_cancel_fn, void *); extern void nni_sleep_aio(nni_duration, nni_aio *); +// nni_aio_completion_list is used after removing the aio from an +// active work queue, and keeping them so that the completions can +// be run in a deferred manner. These lists are simple, and intended +// to be used as local variables. It's important to initialize the +// list before using it. Also, any AIO added to a completion list must +// not be in active use anywhere. +typedef void *nni_aio_completions; + +// nni_aio_completions_init just initializes a completions list. +// This just sets the pointed value to NULL. +extern void nni_aio_completions_init(nni_aio_completions *); + +// nni_aio_completions_run runs nni_aio_finish_sync for all the aio objects +// that have been added to the completions. The result code and count used +// are those supplied in nni_aio_completions_add. Callers should not hold +// locks when calling this. +extern void nni_aio_completions_run(nni_aio_completions *); + +// nni_aio_completions_add adds an aio (with the result code and length as +// appropriate) to the completion list. This should be done while the +// appropriate lock is held. The aio must not be scheduled. +extern void nni_aio_completions_add(nni_aio_completions *, nni_aio *, + int, size_t); + extern int nni_aio_sys_init(void); extern void nni_aio_sys_fini(void); |
