Add Rust impl of wasmtime_ssp_fd_prestat_get
In more detail, this commit: * makes fd_prestat_get safe * rewrites fd_prestats_get_entry in (safe) Rust * creates helper macros for rwlock read lock and unlock
This commit is contained in:
@@ -497,14 +497,6 @@ __wasi_errno_t wasmtime_ssp_environ_sizes_get(
|
||||
size_t *environ_buf_size
|
||||
) WASMTIME_SSP_SYSCALL_NAME(environ_sizes_get) __attribute__((__warn_unused_result__));
|
||||
|
||||
__wasi_errno_t wasmtime_ssp_fd_prestat_get(
|
||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
||||
struct fd_prestats *prestats,
|
||||
#endif
|
||||
__wasi_fd_t fd,
|
||||
__wasi_prestat_t *buf
|
||||
) WASMTIME_SSP_SYSCALL_NAME(fd_prestat_get) __attribute__((__warn_unused_result__));
|
||||
|
||||
__wasi_errno_t wasmtime_ssp_fd_prestat_dir_name(
|
||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
||||
struct fd_prestats *prestats,
|
||||
|
||||
@@ -83,21 +83,21 @@ struct LOCKABLE rwlock {
|
||||
pthread_rwlock_t object;
|
||||
};
|
||||
|
||||
static inline void rwlock_init(struct rwlock *lock) REQUIRES_UNLOCKED(*lock) {
|
||||
void rwlock_init(struct rwlock *lock) REQUIRES_UNLOCKED(*lock) {
|
||||
pthread_rwlock_init(&lock->object, NULL);
|
||||
}
|
||||
|
||||
static inline void rwlock_rdlock(struct rwlock *lock)
|
||||
void rwlock_rdlock(struct rwlock *lock)
|
||||
LOCKS_SHARED(*lock) NO_LOCK_ANALYSIS {
|
||||
pthread_rwlock_rdlock(&lock->object);
|
||||
}
|
||||
|
||||
static inline void rwlock_wrlock(struct rwlock *lock)
|
||||
void rwlock_wrlock(struct rwlock *lock)
|
||||
LOCKS_EXCLUSIVE(*lock) NO_LOCK_ANALYSIS {
|
||||
pthread_rwlock_wrlock(&lock->object);
|
||||
}
|
||||
|
||||
static inline void rwlock_unlock(struct rwlock *lock)
|
||||
void rwlock_unlock(struct rwlock *lock)
|
||||
UNLOCKS(*lock) NO_LOCK_ANALYSIS {
|
||||
pthread_rwlock_unlock(&lock->object);
|
||||
}
|
||||
|
||||
@@ -243,10 +243,6 @@ __wasi_errno_t wasmtime_ssp_clock_time_get(
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct fd_prestat {
|
||||
const char *dir;
|
||||
};
|
||||
|
||||
void fd_prestats_init(
|
||||
struct fd_prestats *pt
|
||||
) {
|
||||
@@ -653,32 +649,6 @@ static __wasi_errno_t fd_table_insert_fd(
|
||||
return fd_table_insert(ft, fo, rights_base, rights_inheriting, out);
|
||||
}
|
||||
|
||||
__wasi_errno_t wasmtime_ssp_fd_prestat_get(
|
||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
||||
struct fd_prestats *prestats,
|
||||
#endif
|
||||
__wasi_fd_t fd,
|
||||
__wasi_prestat_t *buf
|
||||
) {
|
||||
rwlock_rdlock(&prestats->lock);
|
||||
struct fd_prestat *prestat;
|
||||
__wasi_errno_t error = fd_prestats_get_entry(prestats, fd, &prestat);
|
||||
if (error != 0) {
|
||||
rwlock_unlock(&prestats->lock);
|
||||
return error;
|
||||
}
|
||||
|
||||
*buf = (__wasi_prestat_t) {
|
||||
.pr_type = __WASI_PREOPENTYPE_DIR,
|
||||
};
|
||||
|
||||
buf->u.dir.pr_name_len = strlen(prestat->dir);
|
||||
|
||||
rwlock_unlock(&prestats->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
__wasi_errno_t wasmtime_ssp_fd_prestat_dir_name(
|
||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
||||
struct fd_prestats *prestats,
|
||||
|
||||
@@ -18,9 +18,12 @@
|
||||
#include "locking.h"
|
||||
|
||||
struct fd_entry;
|
||||
struct fd_prestat;
|
||||
struct syscalls;
|
||||
|
||||
struct fd_prestat {
|
||||
const char *dir;
|
||||
};
|
||||
|
||||
struct fd_table {
|
||||
struct rwlock lock;
|
||||
struct fd_entry *entries;
|
||||
|
||||
Reference in New Issue
Block a user