mirror of
https://github.com/fluencelabs/musl
synced 2025-06-25 12:42:02 +00:00
i made a best attempt, but the intended semantics of this function are fundamentally contradictory. there is no consistent way to handle ownership of locks when forking a multi-threaded process. the code could have worked by accident for programs that only used normal mutexes and nothing else (since they don't actually store or care about their owner), but that's about it. broken-by-design interfaces that aren't even in glibc (only solaris) don't belong in musl.
72 lines
1.5 KiB
C
72 lines
1.5 KiB
C
#ifndef LIBC_H
|
|
#define LIBC_H
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
|
|
struct __libc {
|
|
void *main_thread;
|
|
int threaded;
|
|
int secure;
|
|
size_t *auxv;
|
|
int (*atexit)(void (*)(void));
|
|
void (*fini)(void);
|
|
void (*ldso_fini)(void);
|
|
volatile int threads_minus_1;
|
|
int canceldisable;
|
|
FILE *ofl_head;
|
|
int ofl_lock[2];
|
|
};
|
|
|
|
|
|
#if !defined(__PIC__) || 100*__GNUC__+__GNUC_MINOR__ >= 303 || defined(__PCC__) || defined(__TINYC__)
|
|
|
|
#ifdef __PIC__
|
|
#if __GNUC__ < 4
|
|
#define BROKEN_VISIBILITY 1
|
|
#endif
|
|
#define ATTR_LIBC_VISIBILITY __attribute__((visibility("hidden")))
|
|
#else
|
|
#define ATTR_LIBC_VISIBILITY
|
|
#endif
|
|
|
|
extern struct __libc __libc ATTR_LIBC_VISIBILITY;
|
|
#define libc __libc
|
|
|
|
#else
|
|
|
|
#define USE_LIBC_ACCESSOR
|
|
#define ATTR_LIBC_VISIBILITY
|
|
extern struct __libc *__libc_loc(void) __attribute__((const));
|
|
#define libc (*__libc_loc())
|
|
|
|
#endif
|
|
|
|
|
|
/* Designed to avoid any overhead in non-threaded processes */
|
|
void __lock(volatile int *);
|
|
void __unlock(volatile int *);
|
|
int __lockfile(FILE *);
|
|
void __unlockfile(FILE *);
|
|
#define LOCK(x) (libc.threads_minus_1 ? (__lock(x),1) : ((void)(x),1))
|
|
#define UNLOCK(x) (libc.threads_minus_1 ? (__unlock(x),1) : ((void)(x),1))
|
|
|
|
void __synccall(void (*)(void *), void *);
|
|
int __setxid(int, int, int, int);
|
|
|
|
extern char **__environ;
|
|
#define environ __environ
|
|
|
|
#undef weak_alias
|
|
#define weak_alias(old, new) \
|
|
extern __typeof(old) new __attribute__((weak, alias(#old)))
|
|
|
|
#undef LFS64_2
|
|
//#define LFS64_2(x, y) weak_alias(x, y)
|
|
#define LFS64_2(x, y) extern __typeof(x) y
|
|
|
|
#undef LFS64
|
|
#define LFS64(x) LFS64_2(x, x##64)
|
|
|
|
#endif
|