Skip to content

Commit 702efb9

Browse files
alexcrichtontgross35
authored andcommitted
Add more wasi definitions for libstd
This commit fills out definitions in libc for rust-lang/rust#147572 notably filling out some fs-related functions as well as many pthread-related functions. The pthread-related functions were not available originally with wasi-libc but nowadays are stubs for single-threaded behavior. The goal is to make wasi targets more "unix like" in libstd and have less WASI-specific code.
1 parent 6e1b073 commit 702efb9

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed

libc-test/build.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,6 +1670,7 @@ fn test_wasi(target: &str) {
16701670
[p2]: "netinet/in.h",
16711671
[p2]: "netinet/tcp.h",
16721672
"poll.h",
1673+
"pthread.h",
16731674
"sched.h",
16741675
"stdbool.h",
16751676
"stddef.h",

src/wasi/mod.rs

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ pub type wchar_t = i32;
3333
pub type nl_item = c_int;
3434
pub type __wasi_rights_t = u64;
3535
pub type locale_t = *mut __locale_struct;
36+
pub type pthread_t = *mut c_void;
37+
pub type pthread_once_t = c_int;
38+
pub type pthread_key_t = c_uint;
39+
pub type pthread_spinlock_t = c_int;
3640

3741
s_no_extra_traits! {
3842
#[repr(align(16))]
@@ -170,6 +174,47 @@ s! {
170174
__nfds: usize,
171175
__fds: [c_int; FD_SETSIZE as usize],
172176
}
177+
178+
#[repr(align(4))]
179+
pub struct pthread_attr_t {
180+
size: [u8; 36],
181+
}
182+
183+
pub struct pthread_mutexattr_t {
184+
__attr: c_uint,
185+
}
186+
187+
pub struct pthread_condattr_t {
188+
__attr: c_uint,
189+
}
190+
191+
pub struct pthread_barrierattr_t {
192+
__attr: c_uint,
193+
}
194+
195+
pub struct pthread_rwlockattr_t {
196+
__attr: [c_uint; 2],
197+
}
198+
199+
#[repr(align(4))]
200+
pub struct pthread_cond_t {
201+
size: [u8; 48],
202+
}
203+
204+
#[repr(align(4))]
205+
pub struct pthread_mutex_t {
206+
size: [u8; 24],
207+
}
208+
209+
#[repr(align(4))]
210+
pub struct pthread_rwlock_t {
211+
size: [u8; 32],
212+
}
213+
214+
#[repr(align(4))]
215+
pub struct pthread_barrier_t {
216+
size: [u8; 20],
217+
}
173218
}
174219

175220
// Declare dirent outside of s! so that it doesn't implement Copy, Eq, Hash,
@@ -262,7 +307,9 @@ pub const DT_BLK: u8 = 1;
262307
pub const DT_CHR: u8 = 2;
263308
pub const DT_DIR: u8 = 3;
264309
pub const DT_REG: u8 = 4;
310+
pub const DT_FIFO: u8 = 6;
265311
pub const DT_LNK: u8 = 7;
312+
pub const DT_SOCK: u8 = 20;
266313
pub const FIONREAD: c_int = 1;
267314
pub const FIONBIO: c_int = 2;
268315
pub const F_OK: c_int = 0;
@@ -438,6 +485,9 @@ pub const NOEXPR: crate::nl_item = 0x50001;
438485
pub const YESSTR: crate::nl_item = 0x50002;
439486
pub const NOSTR: crate::nl_item = 0x50003;
440487

488+
pub const PTHREAD_STACK_MIN: usize = 2048;
489+
pub const TIMER_ABSTIME: c_int = 1;
490+
441491
f! {
442492
pub fn FD_ISSET(fd: c_int, set: *const fd_set) -> bool {
443493
let set = &*set;
@@ -843,6 +893,72 @@ extern "C" {
843893
pub fn arc4random_uniform(a: u32) -> u32;
844894

845895
pub fn __errno_location() -> *mut c_int;
896+
897+
pub fn chmod(path: *const c_char, mode: mode_t) -> c_int;
898+
pub fn fchmod(fd: c_int, mode: mode_t) -> c_int;
899+
pub fn realpath(pathname: *const c_char, resolved: *mut c_char) -> *mut c_char;
900+
901+
pub fn pthread_self() -> pthread_t;
902+
pub fn pthread_create(
903+
native: *mut pthread_t,
904+
attr: *const pthread_attr_t,
905+
f: extern "C" fn(*mut c_void) -> *mut c_void,
906+
value: *mut c_void,
907+
) -> c_int;
908+
pub fn pthread_equal(t1: pthread_t, t2: pthread_t) -> c_int;
909+
pub fn pthread_join(native: pthread_t, value: *mut *mut c_void) -> c_int;
910+
pub fn pthread_attr_init(attr: *mut pthread_attr_t) -> c_int;
911+
pub fn pthread_attr_destroy(attr: *mut pthread_attr_t) -> c_int;
912+
pub fn pthread_attr_getstacksize(attr: *const pthread_attr_t, stacksize: *mut size_t) -> c_int;
913+
pub fn pthread_attr_setstacksize(attr: *mut pthread_attr_t, stack_size: size_t) -> c_int;
914+
pub fn pthread_attr_setdetachstate(attr: *mut pthread_attr_t, state: c_int) -> c_int;
915+
pub fn pthread_detach(thread: pthread_t) -> c_int;
916+
917+
pub fn pthread_key_create(
918+
key: *mut pthread_key_t,
919+
dtor: Option<unsafe extern "C" fn(*mut c_void)>,
920+
) -> c_int;
921+
pub fn pthread_key_delete(key: pthread_key_t) -> c_int;
922+
pub fn pthread_getspecific(key: pthread_key_t) -> *mut c_void;
923+
pub fn pthread_setspecific(key: pthread_key_t, value: *const c_void) -> c_int;
924+
pub fn pthread_mutex_init(
925+
lock: *mut pthread_mutex_t,
926+
attr: *const pthread_mutexattr_t,
927+
) -> c_int;
928+
pub fn pthread_mutex_destroy(lock: *mut pthread_mutex_t) -> c_int;
929+
pub fn pthread_mutex_lock(lock: *mut pthread_mutex_t) -> c_int;
930+
pub fn pthread_mutex_trylock(lock: *mut pthread_mutex_t) -> c_int;
931+
pub fn pthread_mutex_unlock(lock: *mut pthread_mutex_t) -> c_int;
932+
933+
pub fn pthread_mutexattr_init(attr: *mut pthread_mutexattr_t) -> c_int;
934+
pub fn pthread_mutexattr_destroy(attr: *mut pthread_mutexattr_t) -> c_int;
935+
pub fn pthread_mutexattr_settype(attr: *mut pthread_mutexattr_t, _type: c_int) -> c_int;
936+
937+
pub fn pthread_cond_init(cond: *mut pthread_cond_t, attr: *const pthread_condattr_t) -> c_int;
938+
pub fn pthread_cond_wait(cond: *mut pthread_cond_t, lock: *mut pthread_mutex_t) -> c_int;
939+
pub fn pthread_cond_timedwait(
940+
cond: *mut pthread_cond_t,
941+
lock: *mut pthread_mutex_t,
942+
abstime: *const timespec,
943+
) -> c_int;
944+
pub fn pthread_cond_signal(cond: *mut pthread_cond_t) -> c_int;
945+
pub fn pthread_cond_broadcast(cond: *mut pthread_cond_t) -> c_int;
946+
pub fn pthread_cond_destroy(cond: *mut pthread_cond_t) -> c_int;
947+
pub fn pthread_condattr_init(attr: *mut pthread_condattr_t) -> c_int;
948+
pub fn pthread_condattr_destroy(attr: *mut pthread_condattr_t) -> c_int;
949+
950+
pub fn pthread_rwlock_init(
951+
lock: *mut pthread_rwlock_t,
952+
attr: *const pthread_rwlockattr_t,
953+
) -> c_int;
954+
pub fn pthread_rwlock_destroy(lock: *mut pthread_rwlock_t) -> c_int;
955+
pub fn pthread_rwlock_rdlock(lock: *mut pthread_rwlock_t) -> c_int;
956+
pub fn pthread_rwlock_tryrdlock(lock: *mut pthread_rwlock_t) -> c_int;
957+
pub fn pthread_rwlock_wrlock(lock: *mut pthread_rwlock_t) -> c_int;
958+
pub fn pthread_rwlock_trywrlock(lock: *mut pthread_rwlock_t) -> c_int;
959+
pub fn pthread_rwlock_unlock(lock: *mut pthread_rwlock_t) -> c_int;
960+
pub fn pthread_rwlockattr_init(attr: *mut pthread_rwlockattr_t) -> c_int;
961+
pub fn pthread_rwlockattr_destroy(attr: *mut pthread_rwlockattr_t) -> c_int;
846962
}
847963

848964
cfg_if! {

0 commit comments

Comments
 (0)