// 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;
|
|
}
|