@@ -64,13 +64,6 @@ struct _hl_condition {
6464 CRITICAL_SECTION cs ;
6565 CONDITION_VARIABLE cond ;
6666};
67-
68- struct _hl_tls {
69- void (* free )( hl_tls * );
70- DWORD tid ;
71- bool gc ;
72- };
73-
7467#else
7568
7669# include <pthread.h>
@@ -104,13 +97,6 @@ struct _hl_condition {
10497 pthread_mutex_t mutex ;
10598 pthread_cond_t cond ;
10699};
107-
108- struct _hl_tls {
109- void (* free )( hl_tls * );
110- pthread_key_t key ;
111- bool gc ;
112- };
113-
114100#endif
115101
116102// ----------------- ALLOC
@@ -463,95 +449,31 @@ DEFINE_PRIM(_VOID, condition_broadcast, _CONDITION)
463449
464450// ----------------- THREAD LOCAL
465451
466- #if defined(HL_THREADS )
467- static void * * _tls_get ( hl_tls * t ) {
468- # ifdef HL_WIN
469- return (void * * )TlsGetValue (t -> tid );
470- # else
471- return (void * * )pthread_getspecific (t -> key );
472- # endif
473- }
474- static void _tls_set ( hl_tls * t , void * store ) {
475- # ifdef HL_WIN
476- TlsSetValue (t -> tid , store );
477- # else
478- pthread_setspecific (t -> key , store );
479- # endif
480- }
481- #endif
452+ int get_tls_slot ();
453+ void free_tls_slot (int id );
454+
455+ struct _hl_tls {
456+ void (* free )( hl_tls * );
457+ int key ;
458+ bool gc ;
459+ };
460+
461+ static void tls_free (hl_tls * l ) { free_tls_slot (l -> key ); }
482462
483463HL_PRIM hl_tls * hl_tls_alloc ( bool gc_value ) {
484- # if !defined(HL_THREADS )
485464 hl_tls * l = (hl_tls * )hl_gc_alloc_finalizer (sizeof (hl_tls ));
486- l -> free = hl_tls_free ;
487- l -> value = NULL ;
488- return l ;
489- # elif defined(HL_WIN )
490- hl_tls * l = (hl_tls * )hl_gc_alloc_finalizer (sizeof (hl_tls ));
491- l -> free = hl_tls_free ;
492- l -> tid = TlsAlloc ();
493- l -> gc = gc_value ;
494- TlsSetValue (l -> tid ,NULL );
495- return l ;
496- # else
497- hl_tls * l = (hl_tls * )hl_gc_alloc_finalizer (sizeof (hl_tls ));
498- l -> free = hl_tls_free ;
465+ l -> free = tls_free ;
499466 l -> gc = gc_value ;
500- pthread_key_create ( & l -> key , NULL );
467+ l -> key = get_tls_slot ( );
501468 return l ;
502- # endif
503- }
504-
505- HL_PRIM void hl_tls_free ( hl_tls * l ) {
506- # if !defined(HL_THREADS )
507- free (l );
508- # elif defined(HL_WIN )
509- if ( l -> free ) {
510- TlsFree (l -> tid );
511- l -> free = NULL ;
512- }
513- # else
514- if ( l -> free ) {
515- pthread_key_delete (l -> key );
516- l -> free = NULL ;
517- }
518- # endif
519469}
520470
521471HL_PRIM void hl_tls_set ( hl_tls * l , void * v ) {
522- # if !defined(HL_THREADS )
523- l -> value = v ;
524- # else
525- if ( l -> gc ) {
526- void * * store = _tls_get (l );
527- if ( !store ) {
528- if ( !v )
529- return ;
530- store = (void * * )malloc (sizeof (void * ));
531- hl_add_root (store );
532- _tls_set (l , store );
533- } else {
534- if ( !v ) {
535- free (store );
536- hl_remove_root (store );
537- _tls_set (l , NULL );
538- return ;
539- }
540- }
541- * store = v ;
542- } else
543- _tls_set (l , v );
544- # endif
472+ hl_hiset (hl_get_thread ()-> tls_slots , l -> key , v );
545473}
546474
547475HL_PRIM void * hl_tls_get ( hl_tls * l ) {
548- # if !defined(HL_THREADS )
549- return l -> value ;
550- # else
551- void * * store = _tls_get (l );
552- if ( !l -> gc ) return store ;
553- return store ? * store : NULL ;
554- # endif
476+ return hl_higet (hl_get_thread ()-> tls_slots , l -> key );
555477}
556478
557479#define _TLS _ABSTRACT(hl_tls)
0 commit comments