.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.29) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{ . if \nF \{ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "fr::crypto::threads 3SSL" .TH fr::crypto::threads 3SSL "2015-12-31" "1.0.2a 1.0.2c" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NOM" .IX Header "NOM" 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 \- support de thread d'OpenSSL .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 1 \& #include \& \& /* N\*(Aqutilisez pas cette structure directement. */ \& typedef struct crypto_threadid_st \& { \& void *ptr; \& unsigned long val; \& } CRYPTO_THREADID; \& /* Utilisez seulement CRYPTO_THREADID_set_[numeric|pointer]() à l\*(Aqintérieur des rétroactions */ \& 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); \& \& int CRYPTO_num_locks(void); \& \& /* struct CRYPTO_dynlock_value doit être défini par l\*(Aqutilisateur */ \& struct CRYPTO_dynlock_value; \& \& void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value * \& (*dyn_create_function)(char *file, int line)); \& void CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function) \& (int mode, struct CRYPTO_dynlock_value *l, \& const char *file, int line)); \& void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function) \& (struct CRYPTO_dynlock_value *l, const char *file, int line)); \& \& int CRYPTO_get_new_dynlockid(void); \& \& void CRYPTO_destroy_dynlockid(int i); \& \& void CRYPTO_lock(int mode, int n, const char *file, int line); \& \& #define CRYPTO_w_lock(type) \e \& CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,_\|_FILE_\|_,_\|_LINE_\|_) \& #define CRYPTO_w_unlock(type) \e \& CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE,type,_\|_FILE_\|_,_\|_LINE_\|_) \& #define CRYPTO_r_lock(type) \e \& CRYPTO_lock(CRYPTO_LOCK|CRYPTO_READ,type,_\|_FILE_\|_,_\|_LINE_\|_) \& #define CRYPTO_r_unlock(type) \e \& CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_READ,type,_\|_FILE_\|_,_\|_LINE_\|_) \& #define CRYPTO_add(addr,amount,type) \e \& CRYPTO_add_lock(addr,amount,type,_\|_FILE_\|_,_\|_LINE_\|_) .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" OpenSSL peut être utilisé de façon sûre dans des applications multithreadées si deux fonctions rétroactives locking_function et threadid_func sont initialisées. .PP locking_function(int mode, int n, const char *file, int line) est nécessaire pour verrouiller des structures de données partagées. (Notez qu'OpenSSL utilise un certain nombre de structures de données globales qui seront partagées de façon implicite à chaque fois que plusieurs threads utiliseront OpenSSL). Les applications multithreadées peuvent planter de façon aléatoire si elle n'est pas initialisée. .PP \&\fIlocking_function()\fR doit être capable de gérer jusqu'à \fICRYPTO_num_locks()\fR mutex de verrous différents. Elle règle le \fBn\fRème verrou si \fBmode\fR & \&\fB\s-1CRYPTO_LOCK\s0\fR, et le libère dans le cas contraire. .PP \&\fBfile\fR et \fBline\fR sont le numéro du fichier de la fonction qui pose le verrou. Ils peuvent être utilisés pour déboguer. .PP threadid_func(\s-1CRYPTO_THREADID\s0 *id) est nécessaire pour enregistrer les identifiants des threads en cours d'exécution dans \fBid\fR. L'implémentation de cette rétroaction ne doit pas remplir \fBid\fR directement, mais doit utiliser \fICRYPTO_THREADID_set_numeric()\fR si les \s-1ID\s0 des threads sont numériques, ou \fICRYPTO_THREADID_set_pointer()\fR si ce sont des pointeurs. Si l'application n'enregistre pas ce genre de rétroactions en utilisant \&\fICRYPTO_THREADID_set_callback()\fR, alors une implémentation par défaut est utilisée — sur Windows et BeOS cela utilise les \s-1API\s0 d'identification de threads par défaut, sur toutes les autres plateformes, cela utilise l'adresse de \fBerrno\fR. Cette dernière est satisfaisante pour la sécurité des threads si et seulement si la plateforme dispose d'un identifiant numérique d'erreur pour les threads locaux. .PP Une fois que \fIthreadid_func()\fR est enregistrée, ou si l'implémentation par défaut doit être utilisée ; .IP "\(bu" 4 \&\fICRYPTO_THREADID_current()\fR enregistre les \s-1ID\s0 des threads en cours d'exécution dans l'objet \fBid\fR donné. .IP "\(bu" 4 \&\fICRYPTO_THREADID_cmp()\fR compare deux \s-1ID\s0 de threads (renvoyant 0 pour égalité, c'est\-à\-dire avec la même sémantique que \fImemcmp()\fR). .IP "\(bu" 4 \&\fICRYPTO_THREADID_cpy()\fR duplique la valeur d'\s-1ID\s0 d'un thread. .IP "\(bu" 4 \&\fICRYPTO_THREADID_hash()\fR renvoie une valeur numérique utilisable comme une clé de table de hachage. Celle-ci est en général la valeur numérique exacte ou un pointeur vers l'\s-1ID\s0 du thread utilisé en interne, mais cela gère aussi les cas peu courants où les pointeurs sont plus longs que les variables « long » et les \s-1ID\s0 des pointeurs dans la plateforme sont basés sur des pointeurs — dans ce cas, un mélange est fait pour essayer de produire une valeur unique même si elle n'est pas aussi grande que l'\s-1ID\s0 réel du thread dans la plateforme. .PP De plus, OpenSSL supporte les verrous dynamiques, et parfois, certaines parties d'OpenSSL en ont besoin pour de meilleures performances. Pour activer cela, les choses suivantes sont nécessaires : .IP "\(bu" 4 Trois fonctions rétroactives en plus, dyn_create_function, dyn_lock_function et dyn_destroy_function. .IP "\(bu" 4 Une structure définie à partir des données que chaque verrou doit manipuler. .PP struct CRYPTO_dynlock_value doit être défini de façon à pouvoir contenir n'importe quelle structure nécessaire à la gestion des verrous. .PP dyn_create_function(const char *file, int line) est nécessaire pour créer un verrou. Les applications multithreadées peuvent planter de façon aléatoire si elle n'est pas initialisée. .PP dyn_lock_function(int mode, CRYPTO_dynlock *l, const char *file, int line) est nécessaire pour verrouiller le verrou dynamique numéro n. Les applications multithreadées peuvent planter de façon aléatoire si elle n'est pas initialisée. .PP dyn_destroy_function(CRYPTO_dynlock *l, const char *file, int line) est nécessaire pour détruire le verrou I. Les applications multithreadées peuvent planter de façon aléatoire si elle n'est pas initialisée. .PP \&\fICRYPTO_get_new_dynlockid()\fR est utilisée pour créer les verrous. Elle appellera dyn_create_function pour la création. .PP \&\fICRYPTO_destroy_dynlockid()\fR est utilisée pour détruire les verrous. Elle appellera dyn_destroy_function pour la destruction. .PP \&\fICRYPTO_lock()\fR est utilisée pour verrouiller et déverrouiller les verrous. Mode est un champ de bits décrivant ce qui doit être fait avec le verrou. \fIn\fR est le nombre de verrous comme renvoyé par \&\fICRYPTO_get_new_dynlockid()\fR. \fIm\fRode peut être combiné à partir des valeurs suivantes. Ces valeurs sont mutuellement exclusives, avec un comportement indéfini si elles sont mal utilisées (par exemple, \s-1CRYPTO_READ\s0 et \&\s-1CRYPTO_WRITE\s0 ne doivent pas être utilisées ensemble). .PP .Vb 4 \& CRYPTO_LOCK 0x01 \& CRYPTO_UNLOCK 0x02 \& CRYPTO_READ 0x04 \& CRYPTO_WRITE 0x08 .Ve .SH "VALEURS DE RETOUR" .IX Header "VALEURS DE RETOUR" \&\fICRYPTO_num_locks()\fR renvoie le nombre nécessaire de verrous. .PP \&\fICRYPTO_get_new_dynlockid()\fR renvoie l'index vers le verrou nouvellement créé. .PP Les autres fonctions ne renvoient pas de valeur. .SH "NOTES" .IX Header "NOTES" Vous pouvez savoir si la gestion des threads d'OpenSSL a été activée avec : .PP .Vb 7 \& #define OPENSSL_THREAD_DEFINES \& #include \& #if defined(OPENSSL_THREADS) \& // support de thread activé \& #else \& // pas de support de thread \& #endif .Ve .PP Aussi, les verrous dynamiques ne sont actuellement pas utilisés en interne par OpenSSL, mais cela peut changer dans le futur. .SH "EXEMPLES" .IX Header "EXEMPLES" \&\fBcrypto/threads/mttest.c\fR montre des exemples d'utilisation des fonctions rétroactives sur Solaris, Irix et Win32. .SH "HISTORIQUE" .IX Header "HISTORIQUE" \&\fICRYPTO_set_locking_callback()\fR est disponible dans toutes les versions de SSLeay et d'OpenSSL. \fICRYPTO_num_locks()\fR a été ajoutée dans OpenSSL 0.9.4. Toutes les fonctions traitant des verrous dynamiques ont été ajoutées dans OpenSSL 0.9.5b\-dev. \fB\s-1CRYPTO_THREADID\s0\fR et les fonctions qui lui sont associées ont été introduites dans OpenSSL 1.0.0 pour remplacer (en fait, pour rendre obsolète) les anciennes fonctions \&\fICRYPTO_set_id_callback()\fR, \fICRYPTO_get_id_callback()\fR et \fICRYPTO_thread_id()\fR qui supposaient que les \s-1ID\s0 des threads étaient toujours représentés par un « unsigned long ». .SH "VOIR AUSSI" .IX Header "VOIR AUSSI" \&\fIcrypto\fR\|(3) .SH "TRADUCTION" .IX Header "TRADUCTION" La traduction de cette page de manuel est maintenue par les membres de la liste . Veuillez signaler toute erreur de traduction par un rapport de bogue sur le paquet manpages-fr-extra.