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.

121 lines
2.3 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. ERL_NIF_TERM
  24. make_obj_error(jiffy_st* st, ErlNifEnv* env,
  25. const char* error, ERL_NIF_TERM obj)
  26. {
  27. ERL_NIF_TERM reason = enif_make_tuple2(env, make_atom(env, error), obj);
  28. return enif_make_tuple2(env, st->atom_error, reason);
  29. }
  30. int
  31. get_bytes_per_iter(ErlNifEnv* env, ERL_NIF_TERM val, size_t* bpi)
  32. {
  33. jiffy_st* st = (jiffy_st*) enif_priv_data(env);
  34. const ERL_NIF_TERM* tuple;
  35. int arity;
  36. unsigned int bytes;
  37. if(!enif_get_tuple(env, val, &arity, &tuple)) {
  38. return 0;
  39. }
  40. if(arity != 2) {
  41. return 0;
  42. }
  43. if(enif_compare(tuple[0], st->atom_bytes_per_iter) != 0) {
  44. return 0;
  45. }
  46. if(!enif_get_uint(env, tuple[1], &bytes)) {
  47. return 0;
  48. }
  49. *bpi = (size_t) bytes;
  50. return 1;
  51. }
  52. int
  53. get_null_term(ErlNifEnv* env, ERL_NIF_TERM val, ERL_NIF_TERM *null_term)
  54. {
  55. jiffy_st* st = (jiffy_st*) enif_priv_data(env);
  56. const ERL_NIF_TERM* tuple;
  57. int arity;
  58. if(!enif_get_tuple(env, val, &arity, &tuple)) {
  59. return 0;
  60. }
  61. if(arity != 2) {
  62. return 0;
  63. }
  64. if(enif_compare(tuple[0], st->atom_null_term) != 0) {
  65. return 0;
  66. }
  67. if(!enif_is_atom(env, tuple[1])) {
  68. return 0;
  69. }
  70. *null_term = tuple[1];
  71. return 1;
  72. }
  73. int
  74. should_yield(size_t used, size_t limit)
  75. {
  76. if(limit == 0 || used < limit) {
  77. return 0;
  78. }
  79. return 1;
  80. }
  81. int
  82. consume_timeslice(ErlNifEnv* env, size_t used, size_t limit)
  83. {
  84. #if(ERL_NIF_MAJOR_VERSION >= 2 && ERL_NIF_MINOR_VERSION >= 4)
  85. double u = (double) used;
  86. double l = (double) limit;
  87. int perc = (int) (100.0 * (u / l));
  88. if(perc < 1) {
  89. perc = 1;
  90. } else if(perc > 100) {
  91. perc = 100;
  92. }
  93. return enif_consume_timeslice(env, perc);
  94. #else
  95. return 0;
  96. #endif
  97. }