[PATCH v2 1/2] manual: Consolidate POSIX Semaphores docs in Threads chapter

Adhemerval Zanella Netto adhemerval.zanella@linaro.org
Wed Jan 29 11:26:52 GMT 2025



On 13/01/25 22:52, Arjun Shankar wrote:
> This commit moves the `sem_*' family of functions from the IPC chapter,
> replacing them with a reference to their new location in the Threads
> chapter.  `sem_clockwait' is also moved out of the Non-POSIX Extensions
> subsection since it is now included in the standard since Issue 8:
> https://pubs.opengroup.org/onlinepubs/9799919799/functions/sem_clockwait.html

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> ---
> v1: https://sourceware.org/pipermail/libc-alpha/2024-December/163203.html
> Changes in v2: addressed Florian's comments:
> https://sourceware.org/pipermail/libc-alpha/2025-January/163667.html
> 
>  manual/ipc.texi     | 71 ++-------------------------------
>  manual/threads.texi | 95 ++++++++++++++++++++++++++++++++++++++++-----
>  2 files changed, 88 insertions(+), 78 deletions(-)
> 
> diff --git a/manual/ipc.texi b/manual/ipc.texi
> index 32c5ac066f..f9c7638359 100644
> --- a/manual/ipc.texi
> +++ b/manual/ipc.texi
> @@ -46,71 +46,6 @@ by @theglibc{}.
>  @end deftypefun
>  
>  @subsection POSIX Semaphores
> -
> -@deftypefun int sem_init (sem_t *@var{sem}, int @var{pshared}, unsigned int @var{value})
> -@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}}
> -@c Does not atomically update sem_t therefore AC-unsafe
> -@c because it can leave sem_t partially initialized.
> -@end deftypefun
> -
> -@deftypefun int sem_destroy (sem_t *@var{sem})
> -@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
> -@c Function does nothing and is therefore always safe.
> -@end deftypefun
> -
> -@deftypefun {sem_t *} sem_open (const char *@var{name}, int @var{oflag}, ...)
> -@safety{@prelim{}@mtsafe{}@asunsafe{@asuinit{}}@acunsafe{@acuinit{}}}
> -@c pthread_once asuinit
> -@c
> -@c We are AC-Unsafe because we use pthread_once to initialize
> -@c a global variable that holds the location of the mounted
> -@c shmfs on Linux.
> -@end deftypefun
> -
> -@deftypefun int sem_close (sem_t *@var{sem})
> -@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
> -@c lll_lock asulock aculock
> -@c twalk mtsrace{:root}
> -@c
> -@c We are AS-unsafe because we take a non-recursive lock.
> -@c We are AC-unsafe because several internal data structures
> -@c are not updated atomically.
> -@end deftypefun
> -
> -@deftypefun int sem_unlink (const char *@var{name})
> -@safety{@prelim{}@mtsafe{}@asunsafe{@asuinit{}}@acunsafe{@acucorrupt{}}}
> -@c pthread_once asuinit acucorrupt aculock
> -@c mempcpy acucorrupt
> -@end deftypefun
> -
> -@deftypefun int sem_wait (sem_t *@var{sem})
> -@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}}
> -@c atomic_fetch_add_relaxed (nwaiters) acucorrupt
> -@c
> -@c Given the use atomic operations this function seems
> -@c to be AS-safe.  It is AC-unsafe because there is still
> -@c a window between atomic_fetch_add_relaxed and the pthread_push
> -@c of the handler that undoes that operation.  A cancellation
> -@c at that point would fail to remove the process from the
> -@c waiters count.
> -@end deftypefun
> -
> -@deftypefun int sem_timedwait (sem_t *@var{sem}, const struct timespec *@var{abstime})
> -@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}}
> -@c Same safety issues as sem_wait.
> -@end deftypefun
> -
> -@deftypefun int sem_trywait (sem_t *@var{sem})
> -@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
> -@c All atomic operations are safe in all contexts.
> -@end deftypefun
> -
> -@deftypefun int sem_post (sem_t *@var{sem})
> -@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
> -@c Same safety as sem_trywait.
> -@end deftypefun
> -
> -@deftypefun int sem_getvalue (sem_t *@var{sem}, int *@var{sval})
> -@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
> -@c Atomic write of a value is safe in all contexts.
> -@end deftypefun
> +@Theglibc{} provides POSIX semaphores as well.  These functions' names begin
> +with @code{sem_} and they are declared in @file{semaphore.h}.  @xref{POSIX
> +Semaphores}.
> diff --git a/manual/threads.texi b/manual/threads.texi
> index 9ea137cb96..806ab866c5 100644
> --- a/manual/threads.texi
> +++ b/manual/threads.texi
> @@ -554,6 +554,8 @@ This section describes the @glibcadj{} POSIX Threads implementation.
>  @menu
>  * Thread-specific Data::          Support for creating and
>  				  managing thread-specific data
> +* POSIX Semaphores::              Support for process and thread
> +				  synchronization using semaphores
>  * Non-POSIX Extensions::          Additional functions to extend
>  				  POSIX Thread functionality
>  @end menu
> @@ -615,6 +617,86 @@ Associate the thread-specific @var{value} with @var{key} in the calling thread.
>  @end deftypefun
>  
>  
> +@node POSIX Semaphores
> +@subsection POSIX Semaphores
> +
> +@deftypefun int sem_init (sem_t *@var{sem}, int @var{pshared}, unsigned int @var{value})
> +@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}}
> +@c Does not atomically update sem_t therefore AC-unsafe
> +@c because it can leave sem_t partially initialized.
> +@end deftypefun
> +
> +@deftypefun int sem_destroy (sem_t *@var{sem})
> +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
> +@c Function does nothing and is therefore always safe.
> +@end deftypefun
> +
> +@deftypefun {sem_t *} sem_open (const char *@var{name}, int @var{oflag}, ...)
> +@safety{@prelim{}@mtsafe{}@asunsafe{@asuinit{}}@acunsafe{@acuinit{}}}
> +@c pthread_once asuinit
> +@c
> +@c We are AC-Unsafe because we use pthread_once to initialize
> +@c a global variable that holds the location of the mounted
> +@c shmfs on Linux.
> +@end deftypefun
> +
> +@deftypefun int sem_close (sem_t *@var{sem})
> +@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
> +@c lll_lock asulock aculock
> +@c twalk mtsrace{:root}
> +@c
> +@c We are AS-unsafe because we take a non-recursive lock.
> +@c We are AC-unsafe because several internal data structures
> +@c are not updated atomically.
> +@end deftypefun
> +
> +@deftypefun int sem_unlink (const char *@var{name})
> +@safety{@prelim{}@mtsafe{}@asunsafe{@asuinit{}}@acunsafe{@acucorrupt{}}}
> +@c pthread_once asuinit acucorrupt aculock
> +@c mempcpy acucorrupt
> +@end deftypefun
> +
> +@deftypefun int sem_wait (sem_t *@var{sem})
> +@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}}
> +@c atomic_fetch_add_relaxed (nwaiters) acucorrupt
> +@c
> +@c Given the use atomic operations this function seems
> +@c to be AS-safe.  It is AC-unsafe because there is still
> +@c a window between atomic_fetch_add_relaxed and the pthread_push
> +@c of the handler that undoes that operation.  A cancellation
> +@c at that point would fail to remove the process from the
> +@c waiters count.
> +@end deftypefun
> +
> +@deftypefun int sem_timedwait (sem_t *@var{sem}, const struct timespec *@var{abstime})
> +@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}}
> +@c Same safety issues as sem_wait.
> +@end deftypefun
> +
> +@deftypefun int sem_clockwait (sem_t *@var{sem}, clockid_t @var{clockid}, const struct timespec *@var{abstime})
> +@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
> +Behaves like @code{sem_timedwait} except the time @var{abstime} is measured
> +against the clock specified by @var{clockid} rather than
> +@code{CLOCK_REALTIME}.  Currently, @var{clockid} must be either
> +@code{CLOCK_MONOTONIC} or @code{CLOCK_REALTIME}.
> +@end deftypefun
> +
> +@deftypefun int sem_trywait (sem_t *@var{sem})
> +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
> +@c All atomic operations are safe in all contexts.
> +@end deftypefun
> +
> +@deftypefun int sem_post (sem_t *@var{sem})
> +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
> +@c Same safety as sem_trywait.
> +@end deftypefun
> +
> +@deftypefun int sem_getvalue (sem_t *@var{sem}, int *@var{sval})
> +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
> +@c Atomic write of a value is safe in all contexts.
> +@end deftypefun
> +
> +
>  @node Non-POSIX Extensions
>  @subsection Non-POSIX Extensions
>  
> @@ -752,16 +834,6 @@ freed.
>  @Theglibc{} provides several waiting functions that expect an explicit
>  @code{clockid_t} argument.
>  
> -@comment semaphore.h
> -@comment POSIX-proposed
> -@deftypefun int sem_clockwait (sem_t *@var{sem}, clockid_t @var{clockid}, const struct timespec *@var{abstime})
> -@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
> -Behaves like @code{sem_timedwait} except the time @var{abstime} is measured
> -against the clock specified by @var{clockid} rather than
> -@code{CLOCK_REALTIME}.  Currently, @var{clockid} must be either
> -@code{CLOCK_MONOTONIC} or @code{CLOCK_REALTIME}.
> -@end deftypefun
> -
>  @comment pthread.h
>  @comment POSIX-proposed
>  @deftypefun int pthread_cond_clockwait (pthread_cond_t *@var{cond}, pthread_mutex_t *@var{mutex}, clockid_t @var{clockid}, const struct timespec *@var{abstime})
> @@ -835,6 +907,9 @@ Currently, @var{clockid} must be either @code{CLOCK_MONOTONIC} or
>  @code{CLOCK_REALTIME}.
>  @end deftypefun
>  
> +The @code{sem_clockwait} function also works using a @code{clockid_t}
> +argument.  @xref{POSIX Semaphores}.
> +
>  @node Single-Threaded
>  @subsubsection Detecting Single-Threaded Execution
>  



More information about the Libc-alpha mailing list