Rollup merge of #107866 - sunfishcode:sunfishcode/wasi-lazy-environ, r=workingjubilee
Allow wasi-libc to initialize its environment variables lazily. Use `__wasilibc_get_environ()` to read the environment variable list from wasi-libc instead of using `environ`. `environ` is a global variable which effectively requires wasi-libc to initialize the environment variables eagerly, and `__wasilibc_get_environ()` is specifically designed to be an alternative that lets wasi-libc intiailize its environment variables lazily. This should have the side effect of fixing at least some of the cases of #107635.
This commit is contained in:
commit
a4c64b9c0e
1 changed files with 7 additions and 1 deletions
|
@ -21,6 +21,7 @@ mod libc {
|
||||||
extern "C" {
|
extern "C" {
|
||||||
pub fn getcwd(buf: *mut c_char, size: size_t) -> *mut c_char;
|
pub fn getcwd(buf: *mut c_char, size: size_t) -> *mut c_char;
|
||||||
pub fn chdir(dir: *const c_char) -> c_int;
|
pub fn chdir(dir: *const c_char) -> c_int;
|
||||||
|
pub fn __wasilibc_get_environ() -> *mut *mut c_char;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,7 +162,12 @@ impl Iterator for Env {
|
||||||
pub fn env() -> Env {
|
pub fn env() -> Env {
|
||||||
unsafe {
|
unsafe {
|
||||||
let _guard = env_read_lock();
|
let _guard = env_read_lock();
|
||||||
let mut environ = libc::environ;
|
|
||||||
|
// Use `__wasilibc_get_environ` instead of `environ` here so that we
|
||||||
|
// don't require wasi-libc to eagerly initialize the environment
|
||||||
|
// variables.
|
||||||
|
let mut environ = libc::__wasilibc_get_environ();
|
||||||
|
|
||||||
let mut result = Vec::new();
|
let mut result = Vec::new();
|
||||||
if !environ.is_null() {
|
if !environ.is_null() {
|
||||||
while !(*environ).is_null() {
|
while !(*environ).is_null() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue