<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 21 December 2016 at 20:01, Erik Bray <span dir="ltr"><<a href="mailto:erik.m.bray@gmail.com" target="_blank">erik.m.bray@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Wed, Dec 21, 2016 at 2:10 AM, Nick Coghlan <<a href="mailto:ncoghlan@gmail.com">ncoghlan@gmail.com</a>> wrote:<br>> Option 2: Similar to option 1, but using a custom type alias, rather than<br>
> using a C99 bool directly<br>
><br>
> The closest API we have to these semantics at the moment would be<br>
> PyGILState_Ensure, so the following API naming might work for option 2:<br>
><br>
>     Py_ensure_t<br>
>     Py_ENSURE_NEEDS_INIT<br>
>     Py_ENSURE_INITIALIZED<br>
><br>
> Respectively, these would just be aliases for bool, false, and true.<br>
><br>
> And then modify the proposed PyThread_tss_create and PyThread_tss_delete<br>
> APIs to accept a "Py_ensure_t *init_flag" in addition to their current<br>
> arguments.<br>
<br>
</div></div>That all sounds good--between the two option 2 looks a bit more explicit.<br>
<br>
Though what about this?  Rather than adding another type, the original<br>
proposal could be changed slightly so that Py_tss_t *is* partially<br>
defined as a struct consisting of a bool, with whatever the native TLS<br>
key is.   E.g.<br>
<br>
typedef struct {<br>
    bool init_flag;<br>
    #if defined(_POSIX_THREADS)<br>
    pthreat_key_t key;<br>
    #elif defined (NT_THREADS)<br>
    DWORD key;<br>
    /* etc... */<br>
} Py_tss_t;<br>
<br>
Then it's just taking Masayuki's original patch, with the global bool<br>
variables, and formalizing that by combining the initialized flag with<br>
the key, and requiring the semantics you described above for<br>
PyThread_tss_create/delete.<br>
<br>
For Python's purposes it seems like this might be good enough, with<br>
the more general purpose pthread_once-like functionality not required.<br></blockquote><div><br></div><div>Aye, I also thought of that approach, but talked myself out of it since there's no definable default value for pthread_key_t. However, C99 partial initialisation may deal with that for us (by zeroing the memory without actually assigning a typed value to it), and if it does, I agree it would be better to handle the initialisation flag automatically rather than requiring callers to do it.<br></div></div><br clear="all"></div><div class="gmail_extra">Cheers,<br></div><div class="gmail_extra">Nick.<br><br></div><div class="gmail_extra">-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Nick Coghlan   |   <a href="mailto:ncoghlan@gmail.com" target="_blank">ncoghlan@gmail.com</a>   |   Brisbane, Australia</div>
</div></div>