int enif_get_long(ErlNifEnv* env, Eterm term, long* ip) { #if SIZEOF_LONG == ERTS_SIZEOF_ETERM return term_to_Sint(term, ip); #elif SIZEOF_LONG == 8 return term_to_Sint64(term, ip); #else # error Unknown long word size #endif }
int erts_debug_set_unique_monotonic_integer_state(Eterm et_value) { Sint64 value; if (!term_to_Sint64(et_value, &value)) { Uint64 uvalue; if (!term_to_Uint64(et_value, &uvalue)) return 0; value = (Sint64) uvalue; } erts_atomic64_set_mb(&raw_unique_monotonic_integer.w.value, (erts_aint64_t) value); return 1; }
int enif_get_long(ErlNifEnv* env, Eterm term, long* ip) { #if SIZEOF_LONG == ERTS_SIZEOF_ETERM return term_to_Sint(term, ip); #elif SIZEOF_LONG == 8 return term_to_Sint64(term, ip); #elif SIZEOF_LONG == SIZEOF_INT int tmp,ret; ret = enif_get_int(env,term,&tmp); if (ret) { *ip = (long) tmp; } return ret; #else # error Unknown long word size #endif }
static int ms_wait(Process *c_p, Eterm etimeout, int busy) { ErtsSchedulerData *esdp = erts_proc_sched_data(c_p); ErtsMonotonicTime time, timeout_time; Sint64 ms; if (!term_to_Sint64(etimeout, &ms)) return 0; time = erts_get_monotonic_time(esdp); if (ms < 0) timeout_time = time; else timeout_time = time + ERTS_MSEC_TO_MONOTONIC(ms); while (time < timeout_time) { if (busy) erts_thr_yield(); else { ErtsMonotonicTime timeout = timeout_time - time; #ifdef __WIN32__ Sleep((DWORD) ERTS_MONOTONIC_TO_MSEC(timeout)); #else { ErtsMonotonicTime to = ERTS_MONOTONIC_TO_USEC(timeout); struct timeval tv; tv.tv_sec = (long) to / (1000*1000); tv.tv_usec = (long) to % (1000*1000); select(0, NULL, NULL, NULL, &tv); } #endif } time = erts_get_monotonic_time(esdp); } return 1; }
int enif_get_int64(ErlNifEnv* env, ERL_NIF_TERM term, ErlNifSInt64* ip) { return term_to_Sint64(term, ip); }