// By the time any NDK-built code is running, there are plenty of threads. int __isthreaded = 1;
// These were accidentally declared in <unistd.h> because we used to inline // getpagesize() and __getpageshift(). Needed for backwards compatibility // with old NDK apps. unsignedint __page_size = PAGE_SIZE; unsignedint __page_shift = 12;
// TODO: does anything still need this? int __open() {
abort();
}
// TODO: does anything still need this? void** __get_tls() { return __real_get_tls();
}
// This non-standard function was in our <string.h> for some reason. void memswap(void* m1, void* m2, size_t n) { char* p = reinterpret_cast<char*>(m1); char* p_end = p + n; char* q = reinterpret_cast<char*>(m2); while (p < p_end) { char tmp = *p;
*p = *q;
*q = tmp;
p++;
q++;
}
}
int pthread_attr_setstackaddr(pthread_attr_t*, void*) { // This was removed from POSIX.1-2008, and is not implemented on bionic. // Needed for ABI compatibility with the NDK. return ENOSYS;
}
int pthread_attr_getstackaddr(const pthread_attr_t* attr, void** stack_addr) { // This was removed from POSIX.1-2008. // Needed for ABI compatibility with the NDK.
*stack_addr = (char*)attr->stack_base + attr->stack_size; return0;
}
// Non-standard cruft that should only ever have been in system/core/toolbox. char* strtotimeval(constchar* str, struct timeval* ts) { char* s;
ts->tv_sec = strtoumax(str, &s, 10);
long fractional_seconds = 0; if (*s == '.') {
s++; int count = 0;
// Read up to 6 digits (microseconds). while (*s && isdigit(*s)) { if (++count < 7) {
fractional_seconds = fractional_seconds*10 + (*s - '0');
}
s++;
}
d = (unsigned)(ch - '0'); if (d < 10) return (int)d;
d = (unsigned)(ch - 'a'); if (d < 6) return (int)(d+10);
d = (unsigned)(ch - 'A'); if (d < 6) return (int)(d+10);
return -1;
}
// This non-standard function was in our <inttypes.h> for some reason.
uintmax_t strntoumax(constchar *nptr, char **endptr, int base, size_t n) { constunsignedchar* p = (constunsignedchar *)nptr; constunsignedchar* end = p + n; int minus = 0;
uintmax_t v = 0; int d;
while (p < end && isspace(*p)) {
p++;
}
if (p < end) { char c = p[0]; if (c == '-' || c == '+') {
minus = (c == '-');
p++;
}
}
if (base == 0) { if (p+2 < end && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
p += 2;
base = 16;
} elseif (p+1 < end && p[0] == '0') {
p += 1;
base = 8;
} else {
base = 10;
}
} elseif (base == 16) { if (p+2 < end && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
p += 2;
}
}
while (p < end && (d = digitval(*p)) >= 0 && d < base) {
v = v*base + d;
p += 1;
}
if (endptr) {
*endptr = (char*) p;
}
return minus ? -v : v;
}
// This non-standard function was in our <inttypes.h> for some reason.
intmax_t strntoimax(constchar* nptr, char** endptr, int base, size_t n) { return (intmax_t) strntoumax(nptr, endptr, base, n);
}
// POSIX calls this dprintf, but LP32 Android had fdprintf instead. int fdprintf(int fd, constchar* fmt, ...) {
va_list ap;
va_start(ap, fmt); int rc = vdprintf(fd, fmt, ap);
va_end(ap); return rc;
}
// POSIX calls this vdprintf, but LP32 Android had fdprintf instead. int vfdprintf(int fd, constchar* fmt, va_list ap) { return vdprintf(fd, fmt, ap);
}
// This used to be in <sys/atomics.h>. int __futex_wake(volatilevoid* ftx, int count) { return __real_futex_wake(ftx, count);
}
// This used to be in <sys/atomics.h>. int __futex_wait(volatilevoid* ftx, int value, conststruct timespec* timeout) { return __real_futex_wait(ftx, value, timeout);
}
// Unity's libmono uses this. int tkill(pid_t tid, int sig) { return syscall(__NR_tkill, tid, sig);
}
// This was removed from POSIX 2008. wchar_t* wcswcs(wchar_t* haystack, wchar_t* needle) { return wcsstr(haystack, needle);
}
// This was removed from POSIX 2008.
sighandler_t bsd_signal(int signum, sighandler_t handler) { return signal(signum, handler);
}
// This was removed from POSIX 2008. #undef bcopy void bcopy(constvoid* src, void* dst, size_t n) {
memmove(dst, src, n);
}
// This was removed from POSIX 2008. #undef bzero void bzero(void* dst, size_t n) {
memset(dst, 0, n);
}
// sysv_signal() was never in POSIX. extern"C++" sighandler_t _signal(int signum, sighandler_t handler, int flags);
sighandler_t sysv_signal(int signum, sighandler_t handler) { return _signal(signum, handler, SA_RESETHAND);
}
// This is a system call that was never in POSIX. Use readdir(3) instead. int __getdents64(unsignedint, dirent*, unsignedint); int getdents(unsignedint fd, dirent* dirp, unsignedint count) { return __getdents64(fd, dirp, count);
}
// This is a BSDism that we never implemented correctly. Used by Firefox. int issetugid() { return0;
}
// This was removed from POSIX 2004.
pid_t wait3(int* status, int options, struct rusage* rusage) { return wait4(-1, status, options, rusage);
}
// This was removed from POSIX 2004. int getdtablesize() { struct rlimit r;
if (getrlimit(RLIMIT_NOFILE, &r) < 0) { return sysconf(_SC_OPEN_MAX);
}
return r.rlim_cur;
}
// A leaked BSD stdio implementation detail that's now a no-op. void __sinit() {} int __sdidinit = 1;
// Only used by ftime, which was removed from POSIX 2008. struct timeb {
time_t time; unsignedshort millitm; short timezone; short dstflag;
};
// This was removed from POSIX 2008. int ftime(struct timeb* tb) { struct timeval tv; struct timezone tz;
// This was removed from POSIX 2008. char* index(constchar* str, int ch) { returnconst_cast<char*>(strchr(str, ch));
}
// This was removed from BSD. void arc4random_stir(void) { // The current implementation stirs itself as needed.
}
// This was removed from BSD. void arc4random_addrandom(unsignedchar*, int) { // The current implementation adds randomness as needed.
}
// Old versions of the NDK did not export malloc_usable_size, but did // export dlmalloc_usable_size. We are moving away from dlmalloc in L // so make this call malloc_usable_size.
size_t dlmalloc_usable_size(void* ptr) { return malloc_usable_size(ptr);
}
// In L we added a public pthread_gettid_np, but some apps were using the private API.
pid_t __pthread_gettid(pthread_t t) { return pthread_gettid_np(t);
}
// Older versions of apportable used dlmalloc directly instead of malloc, // so export this compatibility shim that simply calls malloc. void* dlmalloc(size_t size) { return malloc(size);
}
// Various third-party apps contain a backport of our pthread_rwlock implementation that uses this.
pthread_internal_t* __get_thread() { return __real_get_thread();
}
// This one exists only for the LP32 NDK and is not present anywhere else. long __set_errno(int n) {
errno = n; return -1;
}
// Since dlmalloc_inspect_all and dlmalloc_trim are exported for systems // that use dlmalloc, be consistent and export them everywhere. void dlmalloc_inspect_all(void (*)(void*, void*, size_t, void*), void*) {
} int dlmalloc_trim(size_t) { return0;
}
// LP32's <stdio.h> had putw (but not getw). int putw(int value, FILE* fp) { return fwrite(&value, sizeof(value), 1, fp) == 1 ? 0 : EOF;
}
// LP32's <stdio.h> exposed this; LP64 uses __sseek64() which is private.
fpos_t __sseek(void* cookie, fpos_t offset, int whence) {
FILE* fp = reinterpret_cast<FILE*>(cookie); return TEMP_FAILURE_RETRY(lseek(fileno(fp), offset, whence));
}
} // extern "C"
#endif// !defined (__LP64__)
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet am 2026-06-28)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.