You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
1.4 KiB

  1. // This file is part of Jiffy released under the MIT license.
  2. // See the LICENSE file for more information.
  3. #include "jiffy.h"
  4. ERL_NIF_TERM
  5. make_atom(ErlNifEnv* env, const char* name)
  6. {
  7. ERL_NIF_TERM ret;
  8. if(enif_make_existing_atom(env, name, &ret, ERL_NIF_LATIN1)) {
  9. return ret;
  10. }
  11. return enif_make_atom(env, name);
  12. }
  13. ERL_NIF_TERM
  14. make_ok(jiffy_st* st, ErlNifEnv* env, ERL_NIF_TERM value)
  15. {
  16. return enif_make_tuple2(env, st->atom_ok, value);
  17. }
  18. ERL_NIF_TERM
  19. make_error(jiffy_st* st, ErlNifEnv* env, const char* error)
  20. {
  21. return enif_make_tuple2(env, st->atom_error, make_atom(env, error));
  22. }
  23. int
  24. get_reductions(ErlNifEnv *env, ERL_NIF_TERM term, jiffy_st* st, size_t* val)
  25. {
  26. int arity;
  27. const ERL_NIF_TERM *tuple;
  28. return enif_get_tuple(env, term, &arity, &tuple) &&
  29. arity == 2 &&
  30. enif_compare(tuple[0], st->atom_reductions) == 0 &&
  31. enif_get_int(env, tuple[1], (int*) val) &&
  32. val >= 0;
  33. }
  34. int
  35. jiffy_consume_timeslice(ErlNifEnv *env, size_t reds, size_t cur, size_t* proc) {
  36. #if ERL_NIF_MAJOR_VERSION >= 2 && ERL_NIF_MINOR_VERSION >= 4
  37. #define PERCENTS 10
  38. if (reds > 0 && cur - *proc >= reds / PERCENTS) {
  39. int percents = 100 * (cur - *proc) / reds;
  40. percents = (percents < 1) ? 1 : (
  41. (percents > 100) ? 100 :
  42. percents );
  43. *proc = cur;
  44. return enif_consume_timeslice(env, percents);
  45. }
  46. #endif
  47. return 0;
  48. }