Skip to content

Commit 70d6655

Browse files
committed
Make getenv thread-safe
1 parent 91b99f1 commit 70d6655

File tree

2 files changed

+39
-25
lines changed

2 files changed

+39
-25
lines changed

flags.lisp

+24-23
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
11
(defpackage :kiln/flags
22
(:use :cl :serapeum :alexandria)
3+
(:import-from :kiln/os :getenv :getenvp)
34
(:export
4-
:+kiln-debug+
5-
:+kiln-heap-size+
6-
:+kiln-lisp+
7-
:+kiln-no-print-version+
8-
:+kiln-stack-size+
9-
:+kiln-path-systems+
10-
:+kiln-poiu+
11-
:+kiln-quicklisp+
12-
:+kiln-target-file+
13-
:+kiln-target-package+
14-
:+kiln-target-system+
15-
:+kiln-tolerant+
16-
:*flags*
17-
:dbg?
18-
:dbg
19-
:set-flags
20-
:portable?
21-
:repl-on-error?
22-
:exit-code
23-
:backtrace?
24-
:with-debug-output))
5+
:+kiln-debug+
6+
:+kiln-heap-size+
7+
:+kiln-lisp+
8+
:+kiln-no-print-version+
9+
:+kiln-stack-size+
10+
:+kiln-path-systems+
11+
:+kiln-poiu+
12+
:+kiln-quicklisp+
13+
:+kiln-target-file+
14+
:+kiln-target-package+
15+
:+kiln-target-system+
16+
:+kiln-tolerant+
17+
:*flags*
18+
:dbg?
19+
:dbg
20+
:set-flags
21+
:portable?
22+
:repl-on-error?
23+
:exit-code
24+
:backtrace?
25+
:with-debug-output))
2526
(in-package :kiln/flags)
2627

2728
(defvar *flags* nil)
@@ -51,15 +52,15 @@
5152
(mapcar (op (drop-prefix "--" _))
5253
value))))
5354
(when (memq :debug *flags*)
54-
(setf (uiop:getenv "KILN_DEBUG") "1"))
55+
(setf (getenv "KILN_DEBUG") "1"))
5556
*flags*)
5657

5758
(defun portable? ()
5859
(memq :portable *flags*))
5960

6061
(defun dbg? ()
6162
(or (memq :debug *flags*)
62-
(uiop:getenvp "KILN_DEBUG")))
63+
(getenvp "KILN_DEBUG")))
6364

6465
(defun call/debug-output (fn)
6566
(let ((*standard-output*

os.lisp

+15-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
:uiop
1414
:file-exists-p
1515
:directory-exists-p
16-
:getenv
17-
:getenvp
1816
:hostname)
1917
(:shadow
2018
;; TODO Remove when Quicklisp updates
@@ -60,6 +58,21 @@
6058
(defun (setf getcwd) (dir)
6159
(chdir dir))
6260

61+
(def env-lock (bt:make-lock))
62+
63+
(defun getenv (name)
64+
(bt:with-lock-held (env-lock)
65+
(uiop:getenv name)))
66+
67+
(defun getenvp (name)
68+
(let ((name (getenv name)))
69+
(and (not (emptyp name))
70+
name)))
71+
72+
(defun (setf getenv) (value name)
73+
(bt:with-lock-held (env-lock)
74+
(setf (uiop:getenv name) value)))
75+
6376
(defun call/save-directory (fn)
6477
(let ((start-dir (uiop:getcwd)))
6578
(unwind-protect

0 commit comments

Comments
 (0)