A possible interface for thread local variables:

(thread-local-set! key val)
(thread-local-ref key #!optional (default (macro-absent-obj))) ; when unbound returns default or raises if absent

and thread-cells can be implemented on top with a struct and a gensym.

-- vyzo

On Sat, Mar 10, 2018 at 4:16 PM, Dimitris Vyzovitis <vyzo@hackzen.org> wrote:
Also, we don't have to follow the plt interface -- we can just call them thread-local-variables :)

-- vyzo

On Sat, Mar 10, 2018 at 3:45 PM, Dimitris Vyzovitis <vyzo@hackzen.org> wrote:
Marc,

Could we add thread-cells?
They can be easily implemented with a per-thread hash-table, that only gets initialized if accessed.

They are incredibly useful for per thread caches, and probably a lot of other things.

For instance, I have this common pattern that i see a lot:

(def errptr-cache
  (make-hash-table-eq weak-keys: #t))
(def errptr-cache-mutex
  (make-mutex))

(def (get-errptr)
  (with-lock errptr-cache-mutex
    (lambda ()
      (cond
       ((hash-get errptr-cache (current-thread))
        => (lambda (errptr)
             (errptr_clear errptr)
             errptr))
       (else
        (let (errptr (check-ptr get-errptr (make_errptr)))
          (hash-put! errptr-cache (current-thread) errptr)
          errptr))))))

and I would like to eliminate both the lock and the weak table.

I can add it and make a pr, but I wanted to consult with you first.

-- vyzo