diff options
| author | Garrett D'Amore <garrett@damore.org> | 2024-04-05 08:07:57 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2024-04-05 08:07:57 -0700 |
| commit | 4d178a9eb65b973d18c80afa328a070ee09fd768 (patch) | |
| tree | f6e35799565ec25d19629a2a67d8adec3ead7b68 /docs | |
| parent | 05beb9ed7d75142483e3963501898fd9f32d7508 (diff) | |
| download | nng-4d178a9eb65b973d18c80afa328a070ee09fd768.tar.gz nng-4d178a9eb65b973d18c80afa328a070ee09fd768.tar.bz2 nng-4d178a9eb65b973d18c80afa328a070ee09fd768.zip | |
Refactor thread related pages.
Diffstat (limited to 'docs')
26 files changed, 488 insertions, 797 deletions
diff --git a/docs/man/nng_cv_alloc.3supp.adoc b/docs/man/nng_cv_alloc.3supp.adoc deleted file mode 100644 index 9e58e3f1..00000000 --- a/docs/man/nng_cv_alloc.3supp.adoc +++ /dev/null @@ -1,60 +0,0 @@ -= nng_cv_alloc(3supp) -// -// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> -// Copyright 2018 Capitar IT Group BV <info@capitar.com> -// -// This document is supplied under the terms of the MIT License, a -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -== NAME - -nng_cv_alloc - allocate condition variable - -== SYNOPSIS - -[source, c] ----- -#include <nng/nng.h> -#include <nng/supplemental/util/platform.h> - -typedef struct nng_cv nng_cv; - -int nng_cv_alloc(nng_cv **cvp, nng_mtx *mtx); ----- - -== DESCRIPTION - -The `nng_cv_alloc()` function allocates a condition variable, using -the mutex _mtx_, and returns it in _cvp_. - -Every condition variable is associated with a mutex, which must be -owned when a thread waits for the condition using -xref:nng_cv_wait.3supp.adoc[`nng_cv_wait()`] or -xref:nng_cv_until.3supp.adoc[`nng_cv_until()`]. -The mutex must also be owned when signaling the condition using the -xref:nng_cv_wake.3supp.adoc[`nng_cv_wake()`] or -xref:nng_cv_wake1.3supp.adoc[`nng_cv_wake1()`] functions. - -== RETURN VALUES - -This function returns 0 on success, and non-zero otherwise. - -== ERRORS - -[horizontal] -`NNG_ENOMEM`:: Insufficient free memory exists. - -== SEE ALSO - -[.text-left] -xref:nng_cv_free.3supp.adoc[nng_cv_free(3supp)], -xref:nng_cv_until.3supp.adoc[nng_cv_until(3supp)], -xref:nng_cv_wait.3supp.adoc[nng_cv_wait(3supp)], -xref:nng_cv_wake.3supp.adoc[nng_cv_wake(3supp)], -xref:nng_cv_wake1.3supp.adoc[nng_cv_wake1(3supp)], -xref:nng_mtx_alloc.3supp.adoc[nng_mtx_alloc(3supp)], -xref:nng_strerror.3.adoc[nng_strerror(3)], -xref:nng.7.adoc[nng(7)] diff --git a/docs/man/nng_cv_free.3supp.adoc b/docs/man/nng_cv_free.3supp.adoc deleted file mode 100644 index 0610b52f..00000000 --- a/docs/man/nng_cv_free.3supp.adoc +++ /dev/null @@ -1,42 +0,0 @@ -= nng_cv_free(3supp) -// -// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> -// Copyright 2018 Capitar IT Group BV <info@capitar.com> -// -// This document is supplied under the terms of the MIT License, a -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -== NAME - -nng_cv_free - free condition variable - -== SYNOPSIS - -[source, c] ----- -#include <nng/nng.h> -#include <nng/supplemental/util/platform.h> - -void nng_cv_free(nng_cv *cv); ----- - -== DESCRIPTION - -The `nng_cv_free()` function frees the condition variable _cv_. - -== RETURN VALUES - -None. - -== ERRORS - -None. - -== SEE ALSO - -[.text-left] -xref:nng_cv_alloc.3supp.adoc[nng_cv_alloc(3supp)], -xref:nng.7.adoc[nng(7)] diff --git a/docs/man/nng_cv_until.3supp.adoc b/docs/man/nng_cv_until.3supp.adoc deleted file mode 100644 index 9cf7c714..00000000 --- a/docs/man/nng_cv_until.3supp.adoc +++ /dev/null @@ -1,91 +0,0 @@ -= nng_cv_until(3supp) -// -// Copyright 2021 Staysail Systems, Inc. <info@staysail.tech> -// Copyright 2018 Capitar IT Group BV <info@capitar.com> -// -// This document is supplied under the terms of the MIT License, a -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -== NAME - -nng_cv_until - wait for condition or timeout - -== SYNOPSIS - -[source, c] ----- -#include <nng/nng.h> -#include <nng/supplemental/util/platform.h> - -int nng_cv_until(nng_cv *cv, nng_time when); ----- - -== DESCRIPTION - -The `nng_cv_until()` waits until either the condition variable _cv_ is signaled -by another thread calling either xref:nng_cv_wake.3supp.adoc[`nng_cv_wake()`] or -xref:nng_cv_wake1.3supp.adoc[`nng_cv_wake1()`], or the system clock (as tracked -by xref:nng_clock.3supp.adoc[`nng_clock()`]) reaches _when_. - -The caller must have have ownership of the mutex that was used when -_cv_ was allocated. -This function will drop the ownership of that mutex, and reacquire it -atomically just before returning to the caller. -(The waiting is done without holding the mutex.) - -NOTE: Any condition may be used or checked, but the condition must be -checked, as it is possible for this function to wake up spuriously. -The best way to do this is inside a loop that repeats until the condition -tests for true. - -== EXAMPLE - -The following example demonstrates use of this function: - -.Example 1: Waiting for the condition -[source, c] ----- - - expire = nng_clock() + 1000; // 1 second in the future - nng_mtx_lock(m); // assume cv was allocated using m - while (!condition_true) { - if (nng_cv_until(cv, expire) == NNG_ETIMEDOUT) { - printf("Time out reached!\n"); - break; - } - } - // condition_true is true - nng_mtx_unlock(m); ----- - -.Example 2: Signaling the condition -[source, c] ----- - nng_mtx_lock(m); - condition_true = true; - nng_cv_wake(cv); - nng_mtx_unlock(m); ----- - -== RETURN VALUES - -None. - -== ERRORS - -None. - -== SEE ALSO - -[.text-left] -xref:nng_cv_alloc.3supp.adoc[nng_cv_alloc(3supp)], -xref:nng_cv_wait.3supp.adoc[nng_cv_wait(3supp)], -xref:nng_cv_wake.3supp.adoc[nng_cv_wake(3supp)], -xref:nng_cv_wake1.3supp.adoc[nng_cv_wake1(3supp)], -xref:nng_mtx_alloc.3supp.adoc[nng_mtx_alloc(3supp)], -xref:nng_mtx_lock.3supp.adoc[nng_mtx_lock(3supp)], -xref:nng_mtx_unlock.3supp.adoc[nng_mtx_unlock(3supp)], -xref:nng.7.adoc[nng(7)] diff --git a/docs/man/nng_cv_wait.3supp.adoc b/docs/man/nng_cv_wait.3supp.adoc deleted file mode 100644 index 1d9c16be..00000000 --- a/docs/man/nng_cv_wait.3supp.adoc +++ /dev/null @@ -1,86 +0,0 @@ -= nng_cv_wait(3supp) -// -// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> -// Copyright 2018 Capitar IT Group BV <info@capitar.com> -// -// This document is supplied under the terms of the MIT License, a -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -== NAME - -nng_cv_wait - wait for condition - -== SYNOPSIS - -[source, c] ----- -#include <nng/nng.h> -#include <nng/supplemental/util/platform.h> - -void nng_cv_wait(nng_cv *cv); ----- - -== DESCRIPTION - -The `nng_cv_wait()` waits for the condition variable _cv_ to be signaled -by another thread calling either xref:nng_cv_wake.3supp.adoc[`nng_cv_wake()`] or -xref:nng_cv_wake1.3supp.adoc[`nng_cv_wake1()`]. - -The caller must have have ownership of the mutex that was used when -_cv_ was allocated. -This function will drop the ownership of that mutex, and reacquire it -atomically just before returning to the caller. -(The waiting is done without holding the mutex.) - -NOTE: Any condition may be used or checked, but the condition must be -checked, as it is possible for this function to wake up spuriously. -The best way to do this is inside a loop that repeats until the condition -tests for true. - -== EXAMPLE - -The following example demonstrates use of this function: - -.Example 1: Waiting for the condition -[source, c] ----- - - nng_mtx_lock(m); // assume cv was allocated using m - while (!condition_true) { - nng_cv_wait(cv); - } - // condition_true is true - nng_mtx_unlock(m); ----- - -.Example 2: Signaling the condition -[source, c] ----- - nng_mtx_lock(m); - condition_true = true; - nng_cv_wake(cv); - nng_mtx_unlock(m); ----- - -== RETURN VALUES - -None. - -== ERRORS - -None. - -== SEE ALSO - -[.text-left] -xref:nng_cv_alloc.3supp.adoc[nng_cv_alloc(3supp)], -xref:nng_cv_until.3supp.adoc[nng_cv_until(3supp)], -xref:nng_cv_wake.3supp.adoc[nng_cv_wake(3supp)], -xref:nng_cv_wake1.3supp.adoc[nng_cv_wake1(3supp)], -xref:nng_mtx_alloc.3supp.adoc[nng_mtx_alloc(3supp)], -xref:nng_mtx_lock.3supp.adoc[nng_mtx_lock(3supp)], -xref:nng_mtx_unlock.3supp.adoc[nng_mtx_unlock(3supp)], -xref:nng.7.adoc[nng(7)] diff --git a/docs/man/nng_cv_wake.3supp.adoc b/docs/man/nng_cv_wake.3supp.adoc deleted file mode 100644 index 6ee2945d..00000000 --- a/docs/man/nng_cv_wake.3supp.adoc +++ /dev/null @@ -1,61 +0,0 @@ -= nng_cv_wake(3supp) -// -// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech> -// Copyright 2018 Capitar IT Group BV <info@capitar.com> -// -// This document is supplied under the terms of the MIT License, a -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -== NAME - -nng_cv_wake - wake all waiters - -== SYNOPSIS - -[source, c] ----- -#include <nng/nng.h> -#include <nng/supplemental/util/platform.h> - -void nng_cv_wake(nng_cv *cv); ----- - -== DESCRIPTION - -The `nng_cv_wake()` wakes any threads waiting for the condition variable _cv_ -to be signaled in the xref:nng_cv_wait.3supp.adoc[`nng_cv_wait()`] or -xref:nng_cv_until.3supp.adoc[`nng_cv_until()`] functions. - -The caller must have have ownership of the mutex that was used when -_cv_ was allocated. - -NOTE: The caller should already have set the condition that the waiters -will check, while holding the mutex. - -TIP: This function wakes all threads, which is generally safer but can -lead to a performance problem when there are many waiters, as they are all -woken simultaneously and may contend for resources. -See xref:nng_cv_wake1.3supp.adoc[`nng_cv_wake1()`] for a solution to this problem. - -== RETURN VALUES - -None. - -== ERRORS - -None. - -== SEE ALSO - -[.text-left] -xref:nng_cv_alloc.3supp.adoc[nng_cv_alloc(3supp)], -xref:nng_cv_until.3supp.adoc[nng_cv_until(3supp)], -xref:nng_cv_wait.3supp.adoc[nng_cv_wait(3supp)], -xref:nng_cv_wake1.3supp.adoc[nng_cv_wake1(3supp)], -xref:nng_mtx_alloc.3supp.adoc[nng_mtx_alloc(3supp)], -xref:nng_mtx_lock.3supp.adoc[nng_mtx_lock(3supp)], -xref:nng_mtx_unlock.3supp.adoc[nng_mtx_unlock(3supp)], -xref:nng.7.adoc[nng(7)] diff --git a/docs/man/nng_cv_wake1.3supp.adoc b/docs/man/nng_cv_wake1.3supp.adoc deleted file mode 100644 index 4f8b8326..00000000 --- a/docs/man/nng_cv_wake1.3supp.adoc +++ /dev/null @@ -1,61 +0,0 @@ -= nng_cv_wake1(3supp) -// -// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> -// Copyright 2018 Capitar IT Group BV <info@capitar.com> -// -// This document is supplied under the terms of the MIT License, a -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -== NAME - -nng_cv_wake1 - wake one waiter - -== SYNOPSIS - -[source, c] ----- -#include <nng/nng.h> -#include <nng/supplemental/util/platform.h> - -void nng_cv_wake1(nng_cv *cv); ----- - -== DESCRIPTION - -The `nng_cv_wake1()` wakes at most one thread waiting for the condition -variable _cv_ -to be signaled in the xref:nng_cv_wait.3supp.adoc[`nng_cv_wait()`] or -xref:nng_cv_until.3supp.adoc[`nng_cv_until()`] functions. - -The caller must have have ownership of the mutex that was used when -_cv_ was allocated. - -NOTE: The caller should already have set the condition that the waiters -will check, while holding the mutex. - -NOTE: The caller cannot predict which waiter will be woken, and so the design must -ensure that it is sufficient that _any_ waiter be woken. -When in doubt, it is safer to use xref:nng_cv_wake.3supp.adoc[`nng_cv_wake()`]. - -== RETURN VALUES - -None. - -== ERRORS - -None. - -== SEE ALSO - -[.text-left] -xref:nng_cv_alloc.3supp.adoc[nng_cv_alloc(3supp)], -xref:nng_cv_until.3supp.adoc[nng_cv_until(3supp)], -xref:nng_cv_wait.3supp.adoc[nng_cv_wait(3supp)], -xref:nng_cv_wake.3supp.adoc[nng_cv_wake(3supp)], -xref:nng_mtx_alloc.3supp.adoc[nng_mtx_alloc(3supp)], -xref:nng_mtx_lock.3supp.adoc[nng_mtx_lock(3supp)], -xref:nng_mtx_unlock.3supp.adoc[nng_mtx_unlock(3supp)], -xref:nng.7.adoc[nng(7)] diff --git a/docs/man/nng_mtx_alloc.3supp.adoc b/docs/man/nng_mtx_alloc.3supp.adoc deleted file mode 100644 index 45bbfac2..00000000 --- a/docs/man/nng_mtx_alloc.3supp.adoc +++ /dev/null @@ -1,58 +0,0 @@ -= nng_mtx_alloc(3supp) -// -// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> -// Copyright 2018 Capitar IT Group BV <info@capitar.com> -// -// This document is supplied under the terms of the MIT License, a -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -== NAME - -nng_mtx_alloc - allocate mutex - -== SYNOPSIS - -[source, c] ----- -#include <nng/nng.h> -#include <nng/supplemental/util/platform.h> - -typedef struct nng_mtx nng_mtx; - -int nng_mtx_alloc(nng_mtx **mtxp); ----- - -== DESCRIPTION - -The `nng_mtx_alloc()` function allocates mutex and returns it in _mtxp_. - -The mutex objects created by this function are suitable only for -simple lock and unlock operations, and are not recursive. -Every effort has been made to use light-weight underlying primitives when available. - -Mutex (mutual exclusion) objects can be thought of as binary semaphores, -where only a single thread of execution is permitted to acquire the semaphore. - -Furthermore, a mutex can only be unlocked by the thread that locked it. - -== RETURN VALUES - -This function returns 0 on success, and non-zero otherwise. - -== ERRORS - -[horizontal] -`NNG_ENOMEM`:: Insufficient free memory exists. - -== SEE ALSO - -[.text-left] -xref:nng_cv_alloc.3supp.adoc[nng_cv_alloc(3supp)], -xref:nng_mtx_free.3supp.adoc[nng_mtx_free(3supp)], -xref:nng_mtx_lock.3supp.adoc[nng_mtx_lock(3supp)], -xref:nng_mtx_unlock.3supp.adoc[nng_mtx_unlock(3supp)], -xref:nng_strerror.3.adoc[nng_strerror(3)], -xref:nng.7.adoc[nng(7)] diff --git a/docs/man/nng_mtx_free.3supp.adoc b/docs/man/nng_mtx_free.3supp.adoc deleted file mode 100644 index 2867afe1..00000000 --- a/docs/man/nng_mtx_free.3supp.adoc +++ /dev/null @@ -1,43 +0,0 @@ -= nng_mtx_free(3supp) -// -// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> -// Copyright 2018 Capitar IT Group BV <info@capitar.com> -// -// This document is supplied under the terms of the MIT License, a -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -== NAME - -nng_mtx_free - free mutex - -== SYNOPSIS - -[source, c] ----- -#include <nng/nng.h> -#include <nng/supplemental/util/platform.h> - -void nng_mtx_free(nng_mtx *mtx); ----- - -== DESCRIPTION - -The `nng_mtx_free()` function frees the mutex _mtx_. -The mutex must not be locked when this function is called. - -== RETURN VALUES - -None. - -== ERRORS - -None. - -== SEE ALSO - -[.text-left] -xref:nng_mtx_alloc.3supp.adoc[nng_mtx_alloc(3supp)], -xref:nng.7.adoc[nng(7)] diff --git a/docs/man/nng_mtx_lock.3supp.adoc b/docs/man/nng_mtx_lock.3supp.adoc deleted file mode 100644 index 91fd2ab5..00000000 --- a/docs/man/nng_mtx_lock.3supp.adoc +++ /dev/null @@ -1,65 +0,0 @@ -= nng_mtx_lock(3supp) -// -// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> -// Copyright 2018 Capitar IT Group BV <info@capitar.com> -// -// This document is supplied under the terms of the MIT License, a -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -== NAME - -nng_mtx_lock - lock mutex - -== SYNOPSIS - -[source, c] ----- -#include <nng/nng.h> -#include <nng/supplemental/util/platform.h> - -void nng_mtx_lock(nng_mtx *mtx); ----- - -== DESCRIPTION - -The `nng_mtx_lock()` acquires exclusive ownership of the mutex _mtx_. -If the lock is already owned, this function will wait until the current -owner releases it with xref:nng_mtx_unlock.3supp.adoc[`nng_mtx_unlock()`]. - -If multiple threads are waiting for the lock, the order of acquisition -is not specified. - -NOTE: A mutex can _only_ be unlocked by the thread that locked it. - -IMPORTANT: Mutex locks are _not_ recursive; attempts to reacquire the -same mutex may result in deadlock or aborting the current program. -It is a programming error for the owner of a mutex to attempt to -reacquire it. - -**** -_NNG_ offers neither a non-blocking variant that can fail, -nor recursive mutexes. -This is by design, as _NNG_ itself does not use such things, -and most often the need for them is the result of poor design. -If such capabilities are needed, they may be synthesized fairly -easily from mutexes and condition variables. -**** - -== RETURN VALUES - -None. - -== ERRORS - -None. - -== SEE ALSO - -[.text-left] -xref:nng_cv_alloc.3supp.adoc[nng_cv_alloc(3supp)], -xref:nng_mtx_alloc.3supp.adoc[nng_mtx_alloc(3supp)], -xref:nng_mtx_unlock.3supp.adoc[nng_mtx_unlock(3supp)], -xref:nng.7.adoc[nng(7)] diff --git a/docs/man/nng_mtx_unlock.3supp.adoc b/docs/man/nng_mtx_unlock.3supp.adoc deleted file mode 100644 index d1b048e6..00000000 --- a/docs/man/nng_mtx_unlock.3supp.adoc +++ /dev/null @@ -1,48 +0,0 @@ -= nng_mtx_unlock(3supp) -// -// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> -// Copyright 2018 Capitar IT Group BV <info@capitar.com> -// -// This document is supplied under the terms of the MIT License, a -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -== NAME - -nng_mtx_unlock - unlock mutex - -== SYNOPSIS - -[source, c] ----- -#include <nng/nng.h> -#include <nng/supplemental/util/platform.h> - -void nng_mtx_unlock(nng_mtx *mtx); ----- - -== DESCRIPTION - -The `nng_mtx_unlock()` relinquishes ownership of the mutex _mtx_ that -was previously acquired via xref:nng_mtx_lock.3supp.adoc[`nng_mtx_lock()`]. - -IMPORTANT: A mutex can _only_ be unlocked by the thread that locked it. -Attempting to unlock a mutex that is not owned by the caller will result -in undefined behavior. - -== RETURN VALUES - -None. - -== ERRORS - -None. - -== SEE ALSO - -[.text-left] -xref:nng_mtx_alloc.3supp.adoc[nng_mtx_alloc(3supp)], -xref:nng_mtx_lock.3supp.adoc[nng_mtx_lock(3supp)], -xref:nng.7.adoc[nng(7)] diff --git a/docs/man/nng_thread_create.3supp.adoc b/docs/man/nng_thread_create.3supp.adoc deleted file mode 100644 index 129bddea..00000000 --- a/docs/man/nng_thread_create.3supp.adoc +++ /dev/null @@ -1,87 +0,0 @@ -= nng_thread_create(3supp) -// -// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> -// Copyright 2018 Capitar IT Group BV <info@capitar.com> -// -// This document is supplied under the terms of the MIT License, a -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -== NAME - -nng_thread_create - create thread - -== SYNOPSIS - -[source, c] ----- -#include <nng/nng.h> -#include <nng/supplemental/util/platform.h> - -typedef struct nng_thread nng_thread; - -int nng_thread_create(nng_thread **thrp, void (*func)(void *), void *arg); ----- - -== DESCRIPTION - -The `nng_thread_create()` function creates a single thread of execution, -running _func_ with the argument _arg_. -The thread is started immediately. -A pointer to the thread object is returned in _thrp_. - -The intention of this program is to facilitate writing parallel programs. -Threads created by this program will be based upon the underlying -threading mechanism of the system that _NNG_ is running on. -This may include use of coroutines. - -Using threads created by this function can make it easy to write -programs that use simple sequential execution, using functions in the -_NNG_ suite that would otherwise normally wait synchronously for completion. - -When the thread is no longer needed, the -xref:nng_thread_destroy.3supp.adoc[`nng_thread_destroy()`] -function should be used to reap it. -(This function will block waiting for _func_ to return.) - -IMPORTANT: Thread objects created by this function may not be real system -level threads capable of performing blocking I/O operations using normal blocking -system calls. -If use of blocking system calls is required (not including APIs provided -by the _NNG_ library itself of course), then real OS-specific threads -should be created instead (such as with `pthread_create()` or similar -functions.) - -IMPORTANT: Thread objects created by this function cannot be passed -to any system threading functions. - -TIP: The system may impose limits on the number of threads that can be -created. -Typically applications should not create more than a dozen of these. -If greater concurrency or scalability is needed, consider instead using -an asynchronous model using xref:nng_aio.5.adoc[`nng_aio`] structures. - -TIP: Threads can be synchronized using -xref:nng_mtx_alloc.3supp.adoc[mutexes] and -xref:nng_cv_alloc.3supp.adoc[condition variables]. - -== RETURN VALUES - -This function returns 0 on success, and non-zero otherwise. - -== ERRORS - -[horizontal] -`NNG_ENOMEM`:: Insufficient free memory exists. - -== SEE ALSO - -[.text-left] -xref:nng_strerror.3.adoc[nng_strerror(3)], -xref:nng_cv_alloc.3supp.adoc[nng_cv_alloc(3supp)], -xref:nng_mtx_alloc.3supp.adoc[nng_mtx_alloc(3supp)], -xref:nng_thread_destroy.3supp.adoc[nng_thread_destroy(3supp)], -xref:nng_aio.5.adoc[nng_aio(5)], -xref:nng.7.adoc[nng(7)] diff --git a/docs/man/nng_thread_destroy.3supp.adoc b/docs/man/nng_thread_destroy.3supp.adoc deleted file mode 100644 index 95eed813..00000000 --- a/docs/man/nng_thread_destroy.3supp.adoc +++ /dev/null @@ -1,47 +0,0 @@ -= nng_thread_destroy(3supp) -// -// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> -// Copyright 2018 Capitar IT Group BV <info@capitar.com> -// -// This document is supplied under the terms of the MIT License, a -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -== NAME - -nng_thread_destroy - reap thread - -== SYNOPSIS - -[source, c] ----- -#include <nng/nng.h> -#include <nng/supplemental/util/platform.h> - -void nng_thread_destroy(nng_thread *thread); ----- - -== DESCRIPTION - -The `nng_thread_destroy()` function reaps the _thread_. -It waits for the thread function to return, and then deallocates -the resources for the thread. - -IMPORTANT: Do not call this function from the thread function itself, -or a deadlock will occur. - -== RETURN VALUES - -None. - -== ERRORS - -None. - -== SEE ALSO - -[.text-left] -xref:nng_thread_create.3supp.adoc[nng_thread_create(3supp)], -xref:nng.7.adoc[nng(7)] diff --git a/docs/man/nng_thread_set_name.3supp.adoc b/docs/man/nng_thread_set_name.3supp.adoc deleted file mode 100644 index 36dd8267..00000000 --- a/docs/man/nng_thread_set_name.3supp.adoc +++ /dev/null @@ -1,48 +0,0 @@ -= nng_thread_set_name(3supp) -// -// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech> -// -// This document is supplied under the terms of the MIT License, a -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -== NAME - -nng_thread_set_name - set thread name - -== SYNOPSIS - -[source, c] ----- -#include <nng/nng.h> -#include <nng/supplemental/util/platform.h> - -void nng_thread_set_name(nng_thread *thread, const char *name); ----- - -== DESCRIPTION - -The `nng_thread_set_name()` function attempts to set the name for the _thread_ to _name_. - -If _thread_ is `NULL`, then the name is set for the current thread. - -Support for this, and how names are exposed, varies between platform implementations. -This function is intended to facilitate debugging applications that may have many threads. - -TIP: Internal threads created by _NNG_ will have names beginning with `nng:`. - -== RETURN VALUES - -None. - -== ERRORS - -None. - -== SEE ALSO - -[.text-left] -xref:nng_thread_create.3supp.adoc[nng_thread_create(3supp)], -xref:nng.7.adoc[nng(7)] diff --git a/docs/ref/thr/nng_cv_alloc.adoc b/docs/ref/thr/nng_cv_alloc.adoc new file mode 100644 index 00000000..cd0d5975 --- /dev/null +++ b/docs/ref/thr/nng_cv_alloc.adoc @@ -0,0 +1,39 @@ +## nng_cv_alloc + +Allocate condition variable. + +### Synopsis + +```c +#include <nng/nng.h> +#include <nng/supplemental/util/platform.h> + +typedef struct nng_cv nng_cv; + +int nng_cv_alloc(nng_cv **cvp, nng_mtx *mtx); +``` + +### Description + +The `nng_cv_alloc` function allocates a condition variable, using the mutex _mtx_, and returns it in _cvp_. + +Every condition variable is associated with a mutex, which must be owned when a thread waits for the condition using xref:nng_cv_wait.adoc[`nng_cv_wait`] or xref:nng_cv_until.adoc[`nng_cv_until`]. +The mutex must also be owned when signaling the condition using the xref:nng_cv_wake.adoc[`nng_cv_wake`] or xref:nng_cv_wake1.adoc[`nng_cv_wake1`] functions. + +### Return Values + +This function returns 0 on success, and non-zero otherwise. + +### Errors + +[horizontal] +`NNG_ENOMEM`:: Insufficient free memory exists. + +### See Also + +xref:nng_cv_free.adoc[nng_cv_free], +xref:nng_cv_until.adoc[nng_cv_until], +xref:nng_cv_wait.adoc[nng_cv_wait], +xref:nng_cv_wake.adoc[nng_cv_wake], +xref:nng_cv_wake1.adoc[nng_cv_wake1], +xref:nng_mtx_alloc.adoc[nng_mtx_alloc] diff --git a/docs/ref/thr/nng_cv_free.adoc b/docs/ref/thr/nng_cv_free.adoc new file mode 100644 index 00000000..7d691040 --- /dev/null +++ b/docs/ref/thr/nng_cv_free.adoc @@ -0,0 +1,20 @@ +## nng_cv_free + +Free condition variable. + +### Synopsis + +```c +#include <nng/nng.h> +#include <nng/supplemental/util/platform.h> + +void nng_cv_free(nng_cv *cv); +``` + +### Description + +The `nng_cv_free` function frees the condition variable _cv_. + +### See Also + +xref:nng_cv_alloc.adoc[nng_cv_alloc] diff --git a/docs/ref/thr/nng_cv_until.adoc b/docs/ref/thr/nng_cv_until.adoc new file mode 100644 index 00000000..a24aacf1 --- /dev/null +++ b/docs/ref/thr/nng_cv_until.adoc @@ -0,0 +1,55 @@ +## nng_cv_until + +Wait for condition or timeout. + +### Synopsis + +```c +#include <nng/nng.h> +#include <nng/supplemental/util/platform.h> + +int nng_cv_until(nng_cv *cv, nng_time when); +``` + +### Description + +The `nng_cv_until` function waits until either the condition variable _cv_ is signaled by another thread calling either xref:nng_cv_wake.adoc[`nng_cv_wake`] or xref:nng_cv_wake1.adoc[`nng_cv_wake1`], or the system clock (as tracked by xref:nng_clock.adoc[`nng_clock`]) reaches _when_. + +The caller must have have ownership of the mutex that was used when _cv_ was allocated. +This function will drop the ownership of that mutex, and reacquire it atomically just before returning to the caller. + +NOTE: Any condition may be used or checked, but the condition must be checked, as it is possible for this function to wake up spuriously. +The idiomatic way to do this is inside a loop that repeats until the condition is true. + +### Example + +The following example demonstrates use of this function: + +.Example 1: Waiting for the condition +```c + expire = nng_clock() + 1000; // 1 second in the future + nng_mtx_lock(m); // assume cv was allocated using m + while (!condition_true) { + if (nng_cv_until(cv, expire) == NNG_ETIMEDOUT) { + printf("Time out reached!\n"); + break; + } + } + // condition_true is true + nng_mtx_unlock(m); +``` + +.Example 2: Signaling the condition +```c + nng_mtx_lock(m); + condition_true = true; + nng_cv_wake(cv); + nng_mtx_unlock(m); +``` + +### See Also + +xref:nng_cv_wait.adoc[nng_cv_wait], +xref:nng_cv_wake.adoc[nng_cv_wake], +xref:nng_cv_wake1.adoc[nng_cv_wake1], +xref:nng_mtx_lock.adoc[nng_mtx_lock] diff --git a/docs/ref/thr/nng_cv_wait.adoc b/docs/ref/thr/nng_cv_wait.adoc new file mode 100644 index 00000000..0fedf867 --- /dev/null +++ b/docs/ref/thr/nng_cv_wait.adoc @@ -0,0 +1,53 @@ +## nng_cv_wait + +Wait for condition. + +### Synopsis + +```c +#include <nng/nng.h> +#include <nng/supplemental/util/platform.h> + +void nng_cv_wait(nng_cv *cv); +``` + +### Description + +The `nng_cv_wait` waits for the condition variable _cv_ to be signaled +by another thread calling either xref:nng_cv_wake.adoc[`nng_cv_wake`] or +xref:nng_cv_wake1.adoc[`nng_cv_wake1`]. + +The caller must have have ownership of the mutex that was used when _cv_ was allocated. +This function will drop the ownership of that mutex, and reacquire it atomically just before returning to the caller. + +NOTE: Any condition may be used or checked, but the condition must be checked, as it is possible for this function to wake up spuriously. +The idiomatic way to do this is inside a loop that repeats until the condition is true. + +### Example + +The following example demonstrates use of this function: + +.Example 1: Waiting for the condition +```c + nng_mtx_lock(m); // assume cv was allocated using m + while (!condition_true) { + nng_cv_wait(cv); + } + // condition_true is true + nng_mtx_unlock(m); +``` + +.Example 2: Signaling the condition +```c + nng_mtx_lock(m); + condition_true = true; + nng_cv_wake(cv); + nng_mtx_unlock(m); +``` + +### See Also + +xref:nng_cv_until.adoc[nng_cv_until], +xref:nng_cv_wake.adoc[nng_cv_wake], +xref:nng_cv_wake1.adoc[nng_cv_wake1], +xref:nng_mtx_lock.adoc[nng_mtx_lock] diff --git a/docs/ref/thr/nng_cv_wake.adoc b/docs/ref/thr/nng_cv_wake.adoc new file mode 100644 index 00000000..717b2ca9 --- /dev/null +++ b/docs/ref/thr/nng_cv_wake.adoc @@ -0,0 +1,48 @@ +## nng_cv_wake + +Wake all waiters. + +### Synopsis + +```c +#include <nng/nng.h> +#include <nng/supplemental/util/platform.h> + +void nng_cv_wake(nng_cv *cv); +``` + +### Description + +The `nng_cv_wake` wakes any threads waiting for the condition variable _cv_ +to be signaled in the xref:nng_cv_wait.adoc[`nng_cv_wait`] or +xref:nng_cv_until.adoc[`nng_cv_until`] functions. + +The caller must have have ownership of the mutex that was used when +_cv_ was allocated. + +NOTE: The caller should already have set the condition that the waiters +will check, while holding the mutex. + +TIP: This function wakes all threads, which is generally safer but can +lead to a performance problem when there are many waiters, as they are all +woken simultaneously and may contend for resources. +See xref:nng_cv_wake1.adoc[`nng_cv_wake1`] for a solution to this problem. + +### Return Values + +None. + +### Errors + +None. + +### See Also + +xref:nng_cv_alloc.adoc[nng_cv_alloc], +xref:nng_cv_until.adoc[nng_cv_until], +xref:nng_cv_wait.adoc[nng_cv_wait], +xref:nng_cv_wake1.adoc[nng_cv_wake1], +xref:nng_mtx_alloc.adoc[nng_mtx_alloc], +xref:nng_mtx_lock.adoc[nng_mtx_lock], +xref:nng_mtx_unlock.adoc[nng_mtx_unlock], +xref:nng.adoc[nng] diff --git a/docs/ref/thr/nng_cv_wake1.adoc b/docs/ref/thr/nng_cv_wake1.adoc new file mode 100644 index 00000000..d9d3edd4 --- /dev/null +++ b/docs/ref/thr/nng_cv_wake1.adoc @@ -0,0 +1,48 @@ +## nng_cv_wake1 + +Wake one waiter. + +### Synopsis + +```c +#include <nng/nng.h> +#include <nng/supplemental/util/platform.h> + +void nng_cv_wake1(nng_cv *cv); +``` + +### Description + +The `nng_cv_wake1` wakes at most one thread waiting for the condition +variable _cv_ +to be signaled in the xref:nng_cv_wait.adoc[`nng_cv_wait`] or +xref:nng_cv_until.adoc[`nng_cv_until`] functions. + +The caller must have have ownership of the mutex that was used when +_cv_ was allocated. + +NOTE: The caller should already have set the condition that the waiters +will check, while holding the mutex. + +NOTE: The caller cannot predict which waiter will be woken, and so the design must +ensure that it is sufficient that _any_ waiter be woken. +When in doubt, it is safer to use xref:nng_cv_wake.adoc[`nng_cv_wake`]. + +### Return Values + +None. + +### Errors + +None. + +### See Also + +xref:nng_cv_alloc.adoc[nng_cv_alloc], +xref:nng_cv_until.adoc[nng_cv_until], +xref:nng_cv_wait.adoc[nng_cv_wait], +xref:nng_cv_wake.adoc[nng_cv_wake], +xref:nng_mtx_alloc.adoc[nng_mtx_alloc], +xref:nng_mtx_lock.adoc[nng_mtx_lock], +xref:nng_mtx_unlock.adoc[nng_mtx_unlock], +xref:nng.adoc[nng] diff --git a/docs/ref/thr/nng_mtx_alloc.adoc b/docs/ref/thr/nng_mtx_alloc.adoc new file mode 100644 index 00000000..88d2bccc --- /dev/null +++ b/docs/ref/thr/nng_mtx_alloc.adoc @@ -0,0 +1,40 @@ +## nng_mtx_alloc + +Allocate mutex. + +### Synopsis + +```c +#include <nng/nng.h> +#include <nng/supplemental/util/platform.h> + +typedef struct nng_mtx nng_mtx; + +int nng_mtx_alloc(nng_mtx **mtxp); +``` + +### Description + +The `nng_mtx_alloc` function allocates mutex and returns it in _mtxp_. + +The mutex objects created by this function are suitable only for simple lock and unlock operations, and are not recursive. +Every effort has been made to use light-weight underlying primitives when available. + +Mutex (mutual exclusion) objects can be thought of as binary semaphores, +where only a single thread of execution is permitted to acquire the semaphore. + +Furthermore, a mutex can only be unlocked by the thread that locked it. + +### Return Values + +This function returns 0 on success, and non-zero otherwise. + +### Errors + +[horizontal] +`NNG_ENOMEM`:: Insufficient free memory exists. + +### See Also + +xref:nng_mtx_free.adoc[nng_mtx_free], +xref:nng_mtx_lock.adoc[nng_mtx_lock] diff --git a/docs/ref/thr/nng_mtx_free.adoc b/docs/ref/thr/nng_mtx_free.adoc new file mode 100644 index 00000000..0934326e --- /dev/null +++ b/docs/ref/thr/nng_mtx_free.adoc @@ -0,0 +1,21 @@ +## nng_mtx_free + +Free mutex. + +### Synopsis + +```c +#include <nng/nng.h> +#include <nng/supplemental/util/platform.h> + +void nng_mtx_free(nng_mtx *mtx); +``` + +### Description + +The `nng_mtx_free` function frees the mutex _mtx_. +The mutex must not be locked when this function is called. + +### See Also + +xref:nng_mtx_alloc.adoc[nng_mtx_alloc] diff --git a/docs/ref/thr/nng_mtx_lock.adoc b/docs/ref/thr/nng_mtx_lock.adoc new file mode 100644 index 00000000..de723c69 --- /dev/null +++ b/docs/ref/thr/nng_mtx_lock.adoc @@ -0,0 +1,34 @@ +## nng_mtx_lock + +Lock mutex. + +### Synopsis + +```c +#include <nng/nng.h> +#include <nng/supplemental/util/platform.h> + +void nng_mtx_lock(nng_mtx *mtx); +``` + +### Description + +The `nng_mtx_lock` acquires exclusive ownership of the mutex _mtx_. +If the lock is already owned, this function will wait until the current owner releases it with xref:nng_mtx_unlock.adoc[`nng_mtx_unlock`]. + +If multiple threads are waiting for the lock, the order of acquisition is not specified. + +NOTE: A mutex can _only_ be unlocked by the thread that locked it. + +IMPORTANT: Mutex locks are _not_ recursive.footnote:[_NNG_ offers neither a non-blocking variant that can fail, +nor recursive mutexes. +This is by design, as typically the need for them is the result of poor design. +If such capabilities are needed, they may be synthesized fairly easily from mutexes and condition variables.] + +Attempts to reacquire the same mutex may result in deadlock or aborting the current program. +It is a programming error for the owner of a mutex to attempt to reacquire it. + +### See Also + +xref:nng_mtx_alloc.adoc[nng_mtx_alloc], +xref:nng_mtx_unlock.adoc[nng_mtx_unlock] diff --git a/docs/ref/thr/nng_mtx_unlock.adoc b/docs/ref/thr/nng_mtx_unlock.adoc new file mode 100644 index 00000000..8c4ee374 --- /dev/null +++ b/docs/ref/thr/nng_mtx_unlock.adoc @@ -0,0 +1,24 @@ +## nng_mtx_unlock + +Unlock mutex. + +### Synopsis + +```c +#include <nng/nng.h> +#include <nng/supplemental/util/platform.h> + +void nng_mtx_unlock(nng_mtx *mtx); +``` + +### Description + +The `nng_mtx_unlock` relinquishes ownership of the mutex _mtx_ that was previously acquired via xref:nng_mtx_lock.adoc[`nng_mtx_lock`]. + +IMPORTANT: A mutex can _only_ be unlocked by the thread that locked it. +Attempting to unlock a mutex that is not owned by the caller will result in undefined behavior. + +### See Also + +xref:nng_mtx_alloc.adoc[nng_mtx_alloc], +xref:nng_mtx_lock.adoc[nng_mtx_lock] diff --git a/docs/ref/thr/nng_thread_create.adoc b/docs/ref/thr/nng_thread_create.adoc new file mode 100644 index 00000000..7d59cd1b --- /dev/null +++ b/docs/ref/thr/nng_thread_create.adoc @@ -0,0 +1,56 @@ +## nng_thread_create + +Create thread. + +### Synopsis + +```c +#include <nng/nng.h> +#include <nng/supplemental/util/platform.h> + +typedef struct nng_thread nng_thread; + +int nng_thread_create(nng_thread **thrp, void (*func)(void *), void *arg); +``` + +### Description + +The `nng_thread_create` function creates a single thread of execution, running _func_ with the argument _arg_. +The thread is started immediately. +A pointer to the thread object is returned in _thrp_. + +The intention of this program is to facilitate writing parallel programs. +Threads created by this program will be based upon the underlying threading mechanism of the system. +This may include use of coroutines. + +Using threads created by this function can make it easy to write programs that use simple sequential execution, using functions that would otherwise normally wait synchronously for completion. + +When the thread is no longer needed, the xref:nng_thread_destroy.adoc[`nng_thread_destroy`] function should be used to reap it. +(This function will block waiting for _func_ to return.) + +IMPORTANT: Thread objects created by this function may not be real system level threads capable of performing blocking I/O operations using normal blocking system calls. +If use of blocking system calls is required (not including APIs provided by the _NNG_ library itself of course), then real OS-specific threads should be created instead (such as with `pthread_create` or similar functions.) + +IMPORTANT: Thread objects created by this function cannot be passed to any system threading functions. + +TIP: The system may impose limits on the number of threads that can be created. +Typically applications should not create more than a dozen of these. +If greater concurrency or scalability is needed, consider instead using an xref:../aio/index.adoc[asynchronous] model. + +TIP: Threads can be synchronized using xref:nng_mtx_alloc.adoc[mutexes] and xref:nng_cv_alloc.adoc[condition variables]. + +### Return Values + +This function returns 0 on success, and non-zero otherwise. + +### Errors + +[horizontal] +`NNG_ENOMEM`:: Insufficient free memory exists. + +### See Also + +xref:../aio/index.adoc[Asynchronous I/O], +xref:nng_cv_alloc.adoc[nng_cv_alloc], +xref:nng_mtx_alloc.adoc[nng_mtx_alloc], +xref:nng_thread_destroy.adoc[nng_thread_destroy] diff --git a/docs/ref/thr/nng_thread_destroy.adoc b/docs/ref/thr/nng_thread_destroy.adoc new file mode 100644 index 00000000..82ebc0ec --- /dev/null +++ b/docs/ref/thr/nng_thread_destroy.adoc @@ -0,0 +1,23 @@ +## nng_thread_destroy + +Destroy thread. + +### Synopsis + +```c +#include <nng/nng.h> +#include <nng/supplemental/util/platform.h> + +void nng_thread_destroy(nng_thread *thread); +``` + +### Description + +The `nng_thread_destroy` function reaps the _thread_. +It waits for the thread function to return, and then deallocates the resources for the thread. + +IMPORTANT: Do not call this function from the thread function itself, or a deadlock will occur. + +### See Also + +xref:nng_thread_create.adoc[nng_thread_create] diff --git a/docs/ref/thr/nng_thread_set_name.adoc b/docs/ref/thr/nng_thread_set_name.adoc new file mode 100644 index 00000000..1b3ad2e7 --- /dev/null +++ b/docs/ref/thr/nng_thread_set_name.adoc @@ -0,0 +1,27 @@ +## nng_thread_set_name + +Set thread name. + +### Synopsis + +```c +#include <nng/nng.h> +#include <nng/supplemental/util/platform.h> + +void nng_thread_set_name(nng_thread *thread, const char *name); +``` + +### Description + +The `nng_thread_set_name` function attempts to set the name for the _thread_ to _name_. + +If _thread_ is `NULL`, then the name is set for the calling thread. + +Support for this, and how names are exposed, varies between platform implementations. +This function is intended to facilitate debugging applications that have many threads. + +TIP: Internal threads created by _NNG_ will have names beginning with `nng:`. + +### See Also + +xref:nng_thread_create.adoc[nng_thread_create] |
