summaryrefslogtreecommitdiffstats
path: root/upstream/debian-unstable/man3/pthread_key_create.3
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/debian-unstable/man3/pthread_key_create.3')
-rw-r--r--upstream/debian-unstable/man3/pthread_key_create.3226
1 files changed, 128 insertions, 98 deletions
diff --git a/upstream/debian-unstable/man3/pthread_key_create.3 b/upstream/debian-unstable/man3/pthread_key_create.3
index 4041fd5e..71cc41c8 100644
--- a/upstream/debian-unstable/man3/pthread_key_create.3
+++ b/upstream/debian-unstable/man3/pthread_key_create.3
@@ -1,151 +1,181 @@
-.TH PTHREAD_SPECIFIC 3 LinuxThreads
-
+.\" Copyright, Xavier Leroy <Xavier.Leroy@inria.fr>
+.\" Copyright 2023, Alejandro Colomar <alx@kernel.org>
+.\"
+.\" SPDX-License-Identifier: Linux-man-pages-copyleft
+.\"
+.TH pthread_key_create 3 2024-05-19 "Linux man-pages 6.8"
+.
+.
.SH NAME
-pthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific \- management of thread-specific data
-
+pthread_key_create,
+pthread_key_delete,
+pthread_setspecific,
+pthread_getspecific
+\-
+management of thread-specific data
+.
+.
.SH SYNOPSIS
+.nf
.B #include <pthread.h>
-
-.BI "int pthread_key_create(pthread_key_t *" key ", void (*" destr_function ") (void *));"
-
-.BI "int pthread_key_delete(pthread_key_t " key ");"
-
-.BI "int pthread_setspecific(pthread_key_t " key ", const void *" pointer ");"
-
-.BI "void * pthread_getspecific(pthread_key_t " key ");"
-
+.P
+.BI "int pthread_key_create(pthread_key_t *" key ,
+.BI " void (*" destr_function ") (void *));"
+.BI "int pthread_key_delete(pthread_key_t " key );
+.BI "int pthread_setspecific(pthread_key_t " key ", const void *" pointer );
+.BI "void * pthread_getspecific(pthread_key_t " key );
+.fi
+.
+.
.SH DESCRIPTION
-
-Programs often need global or static variables that have different
-values in different threads. Since threads share one memory space,
-this cannot be achieved with regular variables. Thread-specific data
-is the POSIX threads answer to this need.
-
-Each thread possesses a private memory block, the thread-specific data
-area, or TSD area for short. This area is indexed by TSD keys. The TSD
-area associates values of type \fBvoid *\fP to TSD keys. TSD keys are
-common to all threads, but the value associated with a given TSD key
+Programs often need global or static variables
+that have different values in different threads.
+Since threads share one memory space,
+this cannot be achieved with regular variables.
+Thread-specific data is the POSIX threads answer to this need.
+.P
+Each thread possesses a private memory block,
+the thread-specific data area,
+or TSD area for short.
+This area is indexed by TSD keys.
+The TSD area associates values of type \fBvoid *\fP to TSD keys.
+TSD keys are common to all threads,
+but the value associated with a given TSD key
can be different in each thread.
-
-For concreteness, the TSD areas can be viewed as arrays of \fBvoid *\fP
-pointers, TSD keys as integer indices into these arrays, and the value
-of a TSD key as the value of the corresponding array element in the
-calling thread.
-
-When a thread is created, its TSD area initially associates \fBNULL\fP
-with all keys.
-
-\fBpthread_key_create\fP allocates a new TSD key. The key is stored in the
-location pointed to by \fIkey\fP. There is a limit of \fBPTHREAD_KEYS_MAX\fP
-on the number of keys allocated at a given time. The value initially
-associated with the returned key is \fBNULL\fP in all currently executing
-threads.
-
-The \fIdestr_function\fP argument, if not \fBNULL\fP, specifies a destructor
-function associated with the key. When a thread terminates via
-\fBpthread_exit\fP or by cancellation, \fIdestr_function\fP is called with
-arguments the value associated with the key in that thread. The
-\fIdestr_function\fP is not called if that value is \fBNULL\fP. The order in
-which destructor functions are called at thread termination time is
-unspecified.
-
-Before the destructor function is called, the \fBNULL\fP value is
-associated with the key in the current thread. A destructor function
-might, however, re-associate non-\fBNULL\fP values to that key or some
-other key. To deal with this, if after all the destructors have been
-called for all non-\fBNULL\fP values, there are still some non-\fBNULL\fP
-values with associated destructors, then the process is repeated. The
-LinuxThreads implementation stops the process after
-\fBPTHREAD_DESTRUCTOR_ITERATIONS\fP iterations, even if some non-\fBNULL\fP
-values with associated descriptors remain. Other implementations may
-loop indefinitely.
-
-\fBpthread_key_delete\fP deallocates a TSD key. It does not check whether
-non-\fBNULL\fP values are associated with that key in the currently
-executing threads, nor call the destructor function associated with
-the key.
-
-\fBpthread_setspecific\fP changes the value associated with \fIkey\fP in the
-calling thread, storing the given \fIpointer\fP instead.
-
-\fBpthread_getspecific\fP returns the value currently associated with
-\fIkey\fP in the calling thread.
-
+.P
+For concreteness,
+the TSD areas can be viewed as arrays of \fBvoid *\fP pointers,
+TSD keys as integer indices into these arrays,
+and the value of a TSD key
+as the value of the corresponding array element in the calling thread.
+.P
+When a thread is created,
+its TSD area initially associates \fBNULL\fP with all keys.
+.P
+\fBpthread_key_create\fP allocates a new TSD key.
+The key is stored in the location pointed to by \fIkey\fP.
+There is a limit of \fBPTHREAD_KEYS_MAX\fP
+on the number of keys allocated at a given time.
+The value initially associated with the returned key
+is \fBNULL\fP in all currently executing threads.
+.P
+The \fIdestr_function\fP argument,
+if not \fBNULL\fP,
+specifies a destructor function associated with the key.
+When a thread terminates via \fBpthread_exit\fP or by cancelation,
+\fIdestr_function\fP is called with arguments
+the value associated with the key in that thread.
+The \fIdestr_function\fP is not called if that value is \fBNULL\fP.
+The order in which destructor functions are called at thread termination time
+is unspecified.
+.P
+Before the destructor function is called,
+the \fBNULL\fP value is associated with the key in the current thread.
+A destructor function might,
+however,
+re-associate non-\fBNULL\fP values to that key or some other key.
+To deal with this,
+if after all the destructors have been called
+for all non-\fBNULL\fP values,
+there are still some non-\fBNULL\fP values with associated destructors,
+then the process is repeated.
+The glibc implementation stops the process
+after \fBPTHREAD_DESTRUCTOR_ITERATIONS\fP iterations,
+even if some non-\fBNULL\fP values with associated descriptors remain.
+Other implementations may loop indefinitely.
+.P
+\fBpthread_key_delete\fP deallocates a TSD key.
+It does not check
+whether non-\fBNULL\fP values are associated with that key
+in the currently executing threads,
+nor call the destructor function associated with the key.
+.P
+\fBpthread_setspecific\fP changes the value
+associated with \fIkey\fP in the calling thread,
+storing the given \fIpointer\fP instead.
+.P
+\fBpthread_getspecific\fP returns the value
+currently associated with \fIkey\fP in the calling thread.
+.
+.
.SH "RETURN VALUE"
-
-\fBpthread_key_create\fP, \fBpthread_key_delete\fP, and \fBpthread_setspecific\fP
-return 0 on success and a non-zero error code on failure. If
-successful, \fBpthread_key_create\fP stores the newly allocated key in the
-location pointed to by its \fIkey\fP argument.
-
-\fBpthread_getspecific\fP returns the value associated with \fIkey\fP on
-success, and \fBNULL\fP on error.
-
+\fBpthread_key_create\fP,
+\fBpthread_key_delete\fP,
+and \fBpthread_setspecific\fP
+return 0 on success and a non-zero error code on failure.
+If successful,
+\fBpthread_key_create\fP stores the newly allocated key
+in the location pointed to by its \fIkey\fP argument.
+.P
+\fBpthread_getspecific\fP returns
+the value associated with \fIkey\fP on success,
+and \fBNULL\fP on error.
+.
+.
.SH ERRORS
\fBpthread_key_create\fP returns the following error code on error:
.RS
.TP
\fBEAGAIN\fP
-\fBPTHREAD_KEYS_MAX\fP keys are already allocated
+\fBPTHREAD_KEYS_MAX\fP keys are already allocated.
.RE
-
-\fBpthread_key_delete\fP and \fBpthread_setspecific\fP return the following
-error code on error:
+.P
+\fBpthread_key_delete\fP and \fBpthread_setspecific\fP return
+the following error code on error:
.RS
.TP
\fBEINVAL\fP
-\fIkey\fP is not a valid, allocated TSD key
+\fIkey\fP is not a valid, allocated TSD key.
.RE
-
+.P
\fBpthread_getspecific\fP returns \fBNULL\fP if \fIkey\fP is not a valid,
allocated TSD key.
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
+.
+.
.SH "SEE ALSO"
pthread_create(3), pthread_exit(3), pthread_testcancel(3).
-
+.
+.
.SH EXAMPLE
-
-The following code fragment allocates a thread-specific array of 100
-characters, with automatic reclaimation at thread exit:
-
+The following code fragment
+allocates a thread-specific array of 100 characters,
+with automatic reclamation at thread exit:
+.P
.RS
.ft 3
.nf
.sp
/* Key for the thread-specific buffer */
static pthread_key_t buffer_key;
-
+\&
/* Once-only initialisation of the key */
static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT;
-
+\&
/* Allocate the thread-specific buffer */
void buffer_alloc(void)
{
pthread_once(&buffer_key_once, buffer_key_alloc);
pthread_setspecific(buffer_key, malloc(100));
}
-
+\&
/* Return the thread-specific buffer */
char * get_buffer(void)
{
return (char *) pthread_getspecific(buffer_key);
}
-
+\&
/* Allocate the key */
static void buffer_key_alloc()
{
pthread_key_create(&buffer_key, buffer_destroy);
}
-
+\&
/* Free the thread-specific buffer */
static void buffer_destroy(void * buf)
{
free(buf);
}
.ft
-.LP
+.P
.RE
.fi