1fc2512cfSRobert Mustacchi.\" 2fc2512cfSRobert Mustacchi.\" This file and its contents are supplied under the terms of the 3fc2512cfSRobert Mustacchi.\" Common Development and Distribution License ("CDDL"), version 1.0. 4fc2512cfSRobert Mustacchi.\" You may only use this file in accordance with the terms of version 5fc2512cfSRobert Mustacchi.\" 1.0 of the CDDL. 6fc2512cfSRobert Mustacchi.\" 7fc2512cfSRobert Mustacchi.\" A full copy of the text of the CDDL should have accompanied this 8fc2512cfSRobert Mustacchi.\" source. A copy of the CDDL is also available via the Internet at 9fc2512cfSRobert Mustacchi.\" http://www.illumos.org/license/CDDL. 10fc2512cfSRobert Mustacchi.\" 11fc2512cfSRobert Mustacchi.\" 12fc2512cfSRobert Mustacchi.\" Copyright 2016 Joyent, Inc. 13fc2512cfSRobert Mustacchi.\" 14fc2512cfSRobert Mustacchi.Dd "Jan 11, 2015" 15fc2512cfSRobert Mustacchi.Dt TSS 3C 16fc2512cfSRobert Mustacchi.Os 17fc2512cfSRobert Mustacchi.Sh NAME 18fc2512cfSRobert Mustacchi.Nm tss , 19fc2512cfSRobert Mustacchi.Nm tss_create , 20fc2512cfSRobert Mustacchi.Nm tss_destroy , 21fc2512cfSRobert Mustacchi.Nm tss_get , 22fc2512cfSRobert Mustacchi.Nm tss_set 23fc2512cfSRobert Mustacchi.Nd thread-specific storage 24fc2512cfSRobert Mustacchi.Sh SYNOPSIS 25fc2512cfSRobert Mustacchi.In threads.h 26fc2512cfSRobert Mustacchi.Vt "typedef void (*tss_dtor_t)(void *);" 27fc2512cfSRobert Mustacchi.Ft int 28fc2512cfSRobert Mustacchi.Fo tss_create 29fc2512cfSRobert Mustacchi.Fa "tss_t *key" 30fc2512cfSRobert Mustacchi.Fa "tss_dtor_t dtor" 31fc2512cfSRobert Mustacchi.Fc 32fc2512cfSRobert Mustacchi.Ft void 33fc2512cfSRobert Mustacchi.Fo tss_delete 34fc2512cfSRobert Mustacchi.Fa "tss_t key" 35fc2512cfSRobert Mustacchi.Fc 36fc2512cfSRobert Mustacchi.Ft void * 37fc2512cfSRobert Mustacchi.Fo tss_get 38fc2512cfSRobert Mustacchi.Fa "tss_t key" 39fc2512cfSRobert Mustacchi.Fc 40fc2512cfSRobert Mustacchi.Ft int 41fc2512cfSRobert Mustacchi.Fo tss_set 42fc2512cfSRobert Mustacchi.Fa "tss_t key" 43fc2512cfSRobert Mustacchi.Fa "void *val" 44fc2512cfSRobert Mustacchi.Fc 45fc2512cfSRobert Mustacchi.Sh DESCRIPTION 46fc2512cfSRobert MustacchiThe 47fc2512cfSRobert Mustacchi.Sy tss 48fc2512cfSRobert Mustacchifamily of functions create, get, set, and destroy thread-specific 49fc2512cfSRobert Mustacchistorage. 50fc2512cfSRobert Mustacchi.Ss Creating and Destorying Thread-Specific Storage 51fc2512cfSRobert MustacchiThe 52fc2512cfSRobert Mustacchi.Fn tss_create 53*72d3dbb9SYuri Pankovfunction creates a new thread-specific data key. 54*72d3dbb9SYuri PankovThe key space is opaque and global to all threads in the process. 55*72d3dbb9SYuri PankovEach thread has its own value-space which can be manipulated with the 56fc2512cfSRobert Mustacchi.Fn tss_get 57fc2512cfSRobert Mustacchiand 58fc2512cfSRobert Mustacchi.Fn tss_set 59*72d3dbb9SYuri Pankovfunctions. 60*72d3dbb9SYuri PankovA given key persists until 61fc2512cfSRobert Mustacchi.Fn tss_destroy 62fc2512cfSRobert Mustacchiis called. 63fc2512cfSRobert Mustacchi.Pp 64fc2512cfSRobert MustacchiWhen a key is created, the value 65fc2512cfSRobert Mustacchi.Dv NULL 66*72d3dbb9SYuri Pankovis associated with all current threads. 67*72d3dbb9SYuri PankovWhen a thread is created, the value 68fc2512cfSRobert Mustacchi.Dv NULL 69fc2512cfSRobert Mustacchiis assigned as the value for the entire key-space. 70fc2512cfSRobert Mustacchi.Pp 71fc2512cfSRobert MustacchiA key may optionally be created with a destructor function 72fc2512cfSRobert Mustacchi.Fa dtor . 73fc2512cfSRobert MustacchiThe function 74fc2512cfSRobert Mustacchi.Fa dtor 75fc2512cfSRobert Mustacchiwill run when the thread exits (see 76fc2512cfSRobert Mustacchi.Xr thrd_exit 3C ) 77fc2512cfSRobert Mustacchiif the value for the key is not 78fc2512cfSRobert Mustacchi.Dv NULL . 79*72d3dbb9SYuri PankovThe key space's destructors may be run in any order. 80*72d3dbb9SYuri PankovWhen the destructor is run due to a thread exiting, all signals will be blocked. 81fc2512cfSRobert Mustacchi.Pp 82fc2512cfSRobert MustacchiThe 83fc2512cfSRobert Mustacchi.Fn tss_delete 84fc2512cfSRobert Mustacchifunction deletes the key identify by 85fc2512cfSRobert Mustacchi.Fa key 86*72d3dbb9SYuri Pankovfrom the global name-space. 87*72d3dbb9SYuri PankovWhen a key is deleted, no registered destructor is called, it is up to the 88*72d3dbb9SYuri Pankovcalling program to free any storage that was associated with 89fc2512cfSRobert Mustacchi.Fa key 90*72d3dbb9SYuri Pankovacross all threads. 91*72d3dbb9SYuri PankovBecause of this propety, it is legal to call 92fc2512cfSRobert Mustacchi.Fn tss_delete 93*72d3dbb9SYuri Pankovfrom inside a destructor. 94*72d3dbb9SYuri PankovAny destructors that had been assocaited with 95fc2512cfSRobert Mustacchi.Fa key 96fc2512cfSRobert Mustacchiwill no longer be called when a thread terminates. 97fc2512cfSRobert Mustacchi.Ss Obtaining Values 98fc2512cfSRobert MustacchiThe 99fc2512cfSRobert Mustacchi.Fn tss_get 100fc2512cfSRobert Mustacchifunction may be used to obtain the value associated with 101fc2512cfSRobert Mustacchi.Fa key 102*72d3dbb9SYuri Pankovfor the calling thread. 103*72d3dbb9SYuri PankovNote that if the calling thread has never set a value, then it will receive the 104*72d3dbb9SYuri Pankovdefault value, 105fc2512cfSRobert Mustacchi.Dv NULL . 106fc2512cfSRobert Mustacchi.Fn tss_get 107fc2512cfSRobert Mustacchimay be called from a tss destructor. 108fc2512cfSRobert Mustacchi.Ss Setting Values 109fc2512cfSRobert MustacchiThe 110fc2512cfSRobert Mustacchi.Fn tss_set 111fc2512cfSRobert Mustacchifunction sets the value of the key 112fc2512cfSRobert Mustacchi.Fa key 113fc2512cfSRobert Mustacchifor the callling thread to 114fc2512cfSRobert Mustacchi.Fa value , 115fc2512cfSRobert Mustacchiwhich may be obtained by subsequent calls to 116fc2512cfSRobert Mustacchi.Fa tss_get . 117fc2512cfSRobert MustacchiTo remove a value for a specific thread, one may pass 118fc2512cfSRobert Mustacchi.Dv NULL 119fc2512cfSRobert Mustacchiin as 120fc2512cfSRobert Mustacchi.Fa value . 121fc2512cfSRobert MustacchiChanging the value of a key with 122fc2512cfSRobert Mustacchi.Fn tss_set 123*72d3dbb9SYuri Pankovdoes not cause any destructors to be invoked. 124*72d3dbb9SYuri PankovThis means that 125fc2512cfSRobert Mustacchi.Fn tss_set 126fc2512cfSRobert Mustacchimay be used in the context of a destructor, but special care must be 127fc2512cfSRobert Mustacchitaken to avoid leaking storage or causing an infinite loop. 128fc2512cfSRobert Mustacchi.Sh RETURN VALUES 129fc2512cfSRobert MustacchiUpon successful completion, the 130fc2512cfSRobert Mustacchi.Fn tss_create 131fc2512cfSRobert Mustacchiand 132fc2512cfSRobert Mustacchi.Fn tss_set 133fc2512cfSRobert Mustacchifunctions return 134fc2512cfSRobert Mustacchi.Sy thrd_success . 135fc2512cfSRobert MustacchiOtherwise, they return 136fc2512cfSRobert Mustacchi.Sy thrd_error 137fc2512cfSRobert Mustacchito indicate that an error occurred. 138fc2512cfSRobert Mustacchi.Pp 139fc2512cfSRobert MustacchiUpon successful completion, the 140fc2512cfSRobert Mustacchi.Fn tss_get 141fc2512cfSRobert Mustacchifunction returns the thread-specific value associated with the given 142fc2512cfSRobert Mustacchi.Fa key . 143fc2512cfSRobert MustacchiIf no thread-specific value is associated with the key or an invalid key 144fc2512cfSRobert Mustacchiwas passed in, then 145fc2512cfSRobert Mustacchi.Dv NULL 146fc2512cfSRobert Mustacchiis returned. 147fc2512cfSRobert Mustacchi.Sh INTERFACE STABILITY 148fc2512cfSRobert Mustacchi.Sy Standard 149fc2512cfSRobert Mustacchi.Sh MT-LEVEL 150fc2512cfSRobert Mustacchi.Sy MT-Safe 151fc2512cfSRobert Mustacchi.Sh SEE ALSO 152fc2512cfSRobert Mustacchi.Xr pthread_getspecific 3C , 153fc2512cfSRobert Mustacchi.Xr pthread_key_create 3C , 154fc2512cfSRobert Mustacchi.Xr pthread_key_delete 3C , 155fc2512cfSRobert Mustacchi.Xr pthread_setspecific 3C , 156fc2512cfSRobert Mustacchi.Xr attributes 5 157