Ken Hagan wrote:

[ ... &k ... ]

> So presumably we are all now in complete agreement, except perhaps

I, for one, believe strongly that "&k" is nothing but

    "static_cast<typeof(k)*>(pthread_getspecific(__k_key));"

It *isn't* a compile-time constant (just like &errno isn't a compile
time constant). Now, for some reason [that's beyond my understanding], 
you seem to want to make "&k" be treated as "(k*)&__k_key" if/when it 
is used as template argument... so that one can pretend that "&k" is 
a compile-time constant. But it isn't. Furthermore, while the __k_key 
itself CAN be thread-private... the value that it holds shall not be 
thread-private, I believe strongly. Here's some "random" refs/quotes:

A) http://www.opengroup.org/onlinepubs/007904975/xrat/xsh_chap02.html

"....
 Requirements

 It is important that it be possible to implement the thread-specific 
 data interface without the use of thread private memory. To do 
 otherwise would increase the weight of each thread, thereby limiting 
 the range of applications for which the threads interfaces provided 
 by IEEE Std 1003.1-2001 is appropriate.

 The values that one binds to the key via pthread_setspecific() may, 
 in fact, be pointers to shared storage locations available to all 
 threads. It is only the key/value bindings that are maintained on a 
 per-thread basis, and these can be kept in any portion of the 
 address space that is reserved for use by the calling thread (for 
 example, on the stack). Thus, no per-thread MMU state is required 
 to implement the interface. On the other hand, there is nothing in 
 the interface specification to preclude the use of a per-thread MMU 
 state if it is available (for example, the key values returned by 
 pthread_key_create() could be thread private memory addresses).

 Standardization Issues

 Thread-specific data is a requirement for a usable thread interface. 
 The binding described in this section provides a portable thread-
 specific data mechanism for languages that do not directly support 
 a thread-specific storage class. A binding to IEEE Std 1003.1-2001 
 for a language that does include such a storage class need not 
 provide this specific interface.

 If a language were to include the notion of thread-specific storage, 
 it would be desirable (but not required) to provide an implementation 
 of the pthreads thread-specific data interface based on the language 
 feature. For example, assume that a compiler for a C-like language 
 supports a private storage class that provides thread-specific 
 storage. Something similar to the following macros might be used to 
 effect a compatible implementation:

 #define pthread_key_t                   private void *
 #define pthread_key_create(key)         /* no-op */
 #define pthread_setspecific(key,value)  (key)=(value)
 #define pthread_getspecific(key)        (key)

 Note: For the sake of clarity, this example ignores destructor 
 functions. A correct implementation would have to support them."

-and-

B)

"There's really nothing special about ELF (or Tru64) TLS. It's just 
 TSD with a different key space (your dtv array index, or in our case 
 literally a separate TSD key space mapped into the same TCB vector). 
 __tls_get_addr is just pthread_getspecific() with the allocation and 
 initialization of a TSD value built in (because it can find the size 
 and an initialization template automatically). It's nice to have that 
 built in to the compiler and linker, but that's a convenience and 
 nothing radically different." -- Butenhof [http://tinyurl.com/3047]

regards,
alexander.

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to