static int __crystax_vlogcat(int prio, const char *tag, const char *fmt, va_list ap) { if (__crystax_atomic_fetch(&initialized) == 0) { void *pc; void *pf; pc = dlopen("liblog.so", RTLD_NOW); if (!pc) abort(); pf = dlsym(pc, "__android_log_vprint"); if (!pf) abort(); __crystax_atomic_swap((void*)&func_android_log_vprint, pf); __crystax_atomic_swap(&initialized, 1); } return func_android_log_vprint(prio, tag, fmt, ap); }
int pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *abstime) { if (!mutex) abort(); if (__crystax_atomic_fetch(&initialized) == 0) { bionic_pthread_mutex_timedlock = __crystax_bionic_symbol(__CRYSTAX_BIONIC_SYMBOL_PTHREAD_MUTEX_TIMEDLOCK, 1); bionic_pthread_mutex_lock_timeout_np = __crystax_bionic_symbol(__CRYSTAX_BIONIC_SYMBOL_PTHREAD_MUTEX_LOCK_TIMEOUT_NP, 1); __crystax_atomic_swap(&initialized, 1); } if (bionic_pthread_mutex_timedlock) return bionic_pthread_mutex_timedlock(mutex, abstime); else if (bionic_pthread_mutex_lock_timeout_np) return crystax_pthread_mutex_timedlock(mutex, abstime); else return EFAULT; }