erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

111 行
3.4 KiB

  1. #include "erl_nif.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. static ErlNifResourceType* test_RESOURCE = NULL;
  5. // Prototypes
  6. static ERL_NIF_TERM get_bin_address(ErlNifEnv* env, int argc,
  7. const ERL_NIF_TERM argv[]);
  8. static ERL_NIF_TERM new_array(ErlNifEnv* env, int argc,
  9. const ERL_NIF_TERM argv[]);
  10. static ERL_NIF_TERM size_array(ErlNifEnv* env, int argc,
  11. const ERL_NIF_TERM argv[]);
  12. static ERL_NIF_TERM put_array(ErlNifEnv* env, int argc,
  13. const ERL_NIF_TERM argv[]);
  14. static ERL_NIF_TERM get_array(ErlNifEnv* env, int argc,
  15. const ERL_NIF_TERM argv[]);
  16. static ErlNifFunc nif_funcs[] =
  17. {
  18. {"get_bin_address", 1, get_bin_address},
  19. {"new_array", 1, new_array},
  20. {"size_array", 1, size_array},
  21. {"put_array", 3, put_array},
  22. {"get_array", 2, get_array}
  23. };
  24. static ERL_NIF_TERM get_bin_address(ErlNifEnv* env, int argc,
  25. const ERL_NIF_TERM argv[])
  26. {
  27. ErlNifBinary bin;
  28. enif_inspect_binary(env, argv[0], &bin);
  29. char buf[256];
  30. sprintf(buf, "bin: size=%zu, ptr=%p", bin.size, bin.data);
  31. return enif_make_string(env, buf, ERL_NIF_LATIN1);
  32. }
  33. static ERL_NIF_TERM new_array(ErlNifEnv* env, int argc,
  34. const ERL_NIF_TERM argv[])
  35. {
  36. ErlNifBinary bin;
  37. unsigned long size;
  38. // unsigned char* data;
  39. enif_get_ulong(env, argv[0], &size);
  40. // enif_inspect_binary(env, argv[1], &bin);
  41. enif_alloc_binary(size * sizeof(long), &bin);
  42. return enif_make_binary(env, &bin);
  43. }
  44. static ERL_NIF_TERM size_array(ErlNifEnv* env, int argc,
  45. const ERL_NIF_TERM argv[])
  46. {
  47. ErlNifBinary bin;
  48. enif_inspect_binary(env, argv[0], &bin);
  49. return enif_make_int64(env, bin.size);
  50. }
  51. static ERL_NIF_TERM put_array(ErlNifEnv* env, int argc,
  52. const ERL_NIF_TERM argv[])
  53. {
  54. ErlNifBinary bin;
  55. unsigned long* array;
  56. unsigned long pos, value;
  57. enif_get_ulong(env, argv[0], &pos);
  58. enif_get_ulong(env, argv[1], &value);
  59. enif_inspect_binary(env, argv[2], &bin);
  60. array = (unsigned long*)bin.data;
  61. array[pos] = value;
  62. return enif_make_atom(env, "ok");
  63. }
  64. static ERL_NIF_TERM get_array(ErlNifEnv* env, int argc,
  65. const ERL_NIF_TERM argv[])
  66. {
  67. ErlNifBinary bin;
  68. unsigned long* array;
  69. unsigned long pos;
  70. enif_get_ulong(env, argv[0], &pos);
  71. enif_inspect_binary(env, argv[1], &bin);
  72. array = (unsigned long*)bin.data;
  73. return enif_make_int64(env, *(array + pos));
  74. }
  75. static void test_resource_cleanup(ErlNifEnv* env, void* arg)
  76. {
  77. /* Delete any dynamically allocated memory stored in test_handle */
  78. /* test_handle* handle = (test_handle*)arg; */
  79. }
  80. static int on_load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
  81. {
  82. ErlNifResourceFlags flags = ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER;
  83. ErlNifResourceType* rt = enif_open_resource_type(env, NULL,
  84. "test_resource",
  85. &test_resource_cleanup,
  86. flags, NULL);
  87. if (rt == NULL)
  88. return -1;
  89. test_RESOURCE = rt;
  90. return 0;
  91. }
  92. ERL_NIF_INIT(binary_tools, nif_funcs, &on_load, NULL, NULL, NULL);