Index: openssl/doc/crypto/threads.pod |
=================================================================== |
--- openssl/doc/crypto/threads.pod (revision 105093) |
+++ openssl/doc/crypto/threads.pod (working copy) |
@@ -2,7 +2,9 @@ |
=head1 NAME |
-CRYPTO_set_locking_callback, CRYPTO_set_id_callback, CRYPTO_num_locks, |
+CRYPTO_THREADID_set_callback, CRYPTO_THREADID_get_callback, |
+CRYPTO_THREADID_current, CRYPTO_THREADID_cmp, CRYPTO_THREADID_cpy, |
+CRYPTO_THREADID_hash, CRYPTO_set_locking_callback, CRYPTO_num_locks, |
CRYPTO_set_dynlock_create_callback, CRYPTO_set_dynlock_lock_callback, |
CRYPTO_set_dynlock_destroy_callback, CRYPTO_get_new_dynlockid, |
CRYPTO_destroy_dynlockid, CRYPTO_lock - OpenSSL thread support |
@@ -11,14 +13,26 @@ |
#include <openssl/crypto.h> |
- void CRYPTO_set_locking_callback(void (*locking_function)(int mode, |
- int n, const char *file, int line)); |
+ /* Don't use this structure directly. */ |
+ typedef struct crypto_threadid_st |
+ { |
+ void *ptr; |
+ unsigned long val; |
+ } CRYPTO_THREADID; |
+ /* Only use CRYPTO_THREADID_set_[numeric|pointer]() within callbacks */ |
+ void CRYPTO_THREADID_set_numeric(CRYPTO_THREADID *id, unsigned long val); |
+ void CRYPTO_THREADID_set_pointer(CRYPTO_THREADID *id, void *ptr); |
+ int CRYPTO_THREADID_set_callback(void (*threadid_func)(CRYPTO_THREADID *)); |
+ void (*CRYPTO_THREADID_get_callback(void))(CRYPTO_THREADID *); |
+ void CRYPTO_THREADID_current(CRYPTO_THREADID *id); |
+ int CRYPTO_THREADID_cmp(const CRYPTO_THREADID *a, |
+ const CRYPTO_THREADID *b); |
+ void CRYPTO_THREADID_cpy(CRYPTO_THREADID *dest, |
+ const CRYPTO_THREADID *src); |
+ unsigned long CRYPTO_THREADID_hash(const CRYPTO_THREADID *id); |
- void CRYPTO_set_id_callback(unsigned long (*id_function)(void)); |
- |
int CRYPTO_num_locks(void); |
- |
/* struct CRYPTO_dynlock_value needs to be defined by the user */ |
struct CRYPTO_dynlock_value; |
@@ -50,7 +64,8 @@ |
=head1 DESCRIPTION |
OpenSSL can safely be used in multi-threaded applications provided |
-that at least two callback functions are set. |
+that at least two callback functions are set, locking_function and |
+threadid_func. |
locking_function(int mode, int n, const char *file, int line) is |
needed to perform locking on shared data structures. |
@@ -65,11 +80,43 @@ |
B<file> and B<line> are the file number of the function setting the |
lock. They can be useful for debugging. |
-id_function(void) is a function that returns a thread ID, for example |
-pthread_self() if it returns an integer (see NOTES below). It isn't |
-needed on Windows nor on platforms where getpid() returns a different |
-ID for each thread (see NOTES below). |
+threadid_func(CRYPTO_THREADID *id) is needed to record the currently-executing |
+thread's identifier into B<id>. The implementation of this callback should not |
+fill in B<id> directly, but should use CRYPTO_THREADID_set_numeric() if thread |
+IDs are numeric, or CRYPTO_THREADID_set_pointer() if they are pointer-based. |
+If the application does not register such a callback using |
+CRYPTO_THREADID_set_callback(), then a default implementation is used - on |
+Windows and BeOS this uses the system's default thread identifying APIs, and on |
+all other platforms it uses the address of B<errno>. The latter is satisfactory |
+for thread-safety if and only if the platform has a thread-local error number |
+facility. |
+Once threadid_func() is registered, or if the built-in default implementation is |
+to be used; |
+ |
+=over 4 |
+ |
+=item * |
+CRYPTO_THREADID_current() records the currently-executing thread ID into the |
+given B<id> object. |
+ |
+=item * |
+CRYPTO_THREADID_cmp() compares two thread IDs (returning zero for equality, ie. |
+the same semantics as memcmp()). |
+ |
+=item * |
+CRYPTO_THREADID_cpy() duplicates a thread ID value, |
+ |
+=item * |
+CRYPTO_THREADID_hash() returns a numeric value usable as a hash-table key. This |
+is usually the exact numeric or pointer-based thread ID used internally, however |
+this also handles the unusual case where pointers are larger than 'long' |
+variables and the platform's thread IDs are pointer-based - in this case, mixing |
+is done to attempt to produce a unique numeric value even though it is not as |
+wide as the platform's true thread IDs. |
+ |
+=back |
+ |
Additionally, OpenSSL supports dynamic locks, and sometimes, some parts |
of OpenSSL need it for better performance. To enable this, the following |
is required: |
@@ -140,22 +187,6 @@ |
Also, dynamic locks are currently not used internally by OpenSSL, but |
may do so in the future. |
-Defining id_function(void) has it's own issues. Generally speaking, |
-pthread_self() should be used, even on platforms where getpid() gives |
-different answers in each thread, since that may depend on the machine |
-the program is run on, not the machine where the program is being |
-compiled. For instance, Red Hat 8 Linux and earlier used |
-LinuxThreads, whose getpid() returns a different value for each |
-thread. Red Hat 9 Linux and later use NPTL, which is |
-Posix-conformant, and has a getpid() that returns the same value for |
-all threads in a process. A program compiled on Red Hat 8 and run on |
-Red Hat 9 will therefore see getpid() returning the same value for |
-all threads. |
- |
-There is still the issue of platforms where pthread_self() returns |
-something other than an integer. This is a bit unusual, and this |
-manual has no cookbook solution for that case. |
- |
=head1 EXAMPLES |
B<crypto/threads/mttest.c> shows examples of the callback functions on |
@@ -163,10 +194,14 @@ |
=head1 HISTORY |
-CRYPTO_set_locking_callback() and CRYPTO_set_id_callback() are |
+CRYPTO_set_locking_callback() is |
available in all versions of SSLeay and OpenSSL. |
CRYPTO_num_locks() was added in OpenSSL 0.9.4. |
All functions dealing with dynamic locks were added in OpenSSL 0.9.5b-dev. |
+B<CRYPTO_THREADID> and associated functions were introduced in OpenSSL 1.0.0 |
+to replace (actually, deprecate) the previous CRYPTO_set_id_callback(), |
+CRYPTO_get_id_callback(), and CRYPTO_thread_id() functions which assumed |
+thread IDs to always be represented by 'unsigned long'. |
=head1 SEE ALSO |