cosmopolitan/libc/proc/proc.internal.h
Justine Tunney fde03f8487
Remove leaf attribute where appropriate
This change fixes a bug where gcc assumed thread synchronization such as
pthread_cond_wait() wouldn't alter static variables, because the headers
were using __attribute__((__leaf__)) inappropriately.
2025-01-02 08:07:15 -08:00

56 lines
1.3 KiB
C

#ifndef COSMOPOLITAN_LIBC_PROC_H_
#define COSMOPOLITAN_LIBC_PROC_H_
#include "libc/atomic.h"
#include "libc/calls/struct/rusage.h"
#include "libc/intrin/atomic.h"
#include "libc/intrin/dll.h"
#include "libc/thread/thread.h"
COSMOPOLITAN_C_START_
#define PROC_ALIVE 0
#define PROC_ZOMBIE 1
#define PROC_UNDEAD 2
#define PROC_CONTAINER(e) DLL_CONTAINER(struct Proc, elem, e)
struct Proc {
int pid;
int status;
int waiters;
bool wasforked;
uint32_t wstatus;
int64_t handle;
struct Dll elem;
struct rusage ru;
};
struct Procs {
int waiters;
atomic_uint once;
pthread_mutex_t lock;
intptr_t thread;
intptr_t onbirth;
intptr_t haszombies;
struct Dll *list;
struct Dll *free;
struct Dll *undead;
struct Dll *zombies;
unsigned allocated;
struct rusage ruchlds;
};
extern struct Procs __proc;
void __proc_lock(void) dontthrow;
void __proc_unlock(void) dontthrow;
int64_t __proc_handle(int) libcesque;
int64_t __proc_search(int) libcesque;
struct Proc *__proc_new(void) libcesque;
void __proc_add(struct Proc *) libcesque;
void __proc_free(struct Proc *) libcesque;
void __proc_wipe_and_reset(void) libcesque;
int __proc_harvest(struct Proc *, bool) libcesque;
int sys_wait4_nt(int, int *, int, struct rusage *) libcesque;
COSMOPOLITAN_C_END_
#endif /* COSMOPOLITAN_LIBC_PROC_H_ */