// This file is part of Jiffy released under the MIT license. // See the LICENSE file for more information. #include "jiffy.h" ERL_NIF_TERM make_atom(ErlNifEnv* env, const char* name) { ERL_NIF_TERM ret; if(enif_make_existing_atom(env, name, &ret, ERL_NIF_LATIN1)) { return ret; } return enif_make_atom(env, name); } ERL_NIF_TERM make_ok(jiffy_st* st, ErlNifEnv* env, ERL_NIF_TERM value) { return enif_make_tuple2(env, st->atom_ok, value); } ERL_NIF_TERM make_error(jiffy_st* st, ErlNifEnv* env, const char* error) { return enif_make_tuple2(env, st->atom_error, make_atom(env, error)); } int get_reductions(ErlNifEnv *env, ERL_NIF_TERM term, jiffy_st* st, size_t* val) { int arity; const ERL_NIF_TERM *tuple; return enif_get_tuple(env, term, &arity, &tuple) && arity == 2 && enif_compare(tuple[0], st->atom_reductions) == 0 && enif_get_int(env, tuple[1], (int*) val) && val >= 0; } int jiffy_consume_timeslice(ErlNifEnv *env, size_t reds, size_t cur, size_t* proc) { #if ERL_NIF_MAJOR_VERSION >= 2 && ERL_NIF_MINOR_VERSION >= 4 #define PERCENTS 10 if (reds > 0 && cur - *proc >= reds / PERCENTS) { int percents = 100 * (cur - *proc) / reds; percents = (percents < 1) ? 1 : ( (percents > 100) ? 100 : percents ); *proc = cur; return enif_consume_timeslice(env, percents); } #endif return 0; }