erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
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.

108 regels
3.2 KiB

5 jaren geleden
  1. #include <stdint.h>
  2. #include "erl_nif.h"
  3. #ifdef _WIN32
  4. #define INLINE __inline
  5. #else
  6. #define INLINE inline
  7. #endif
  8. static ErlNifResourceType* ResType = NULL;
  9. ERL_NIF_TERM null;
  10. ERL_NIF_TERM ok;
  11. static int load(ErlNifEnv* env, void** priv, ERL_NIF_TERM load_info)
  12. {
  13. ErlNifResourceFlags flags = ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER;
  14. ResType = enif_open_resource_type(env, NULL, "_nifArray_", NULL, flags, NULL);
  15. if(NULL == ResType)
  16. return -1;
  17. null = enif_make_atom(env, "null");
  18. ok = enif_make_atom(env, "ok");
  19. return 0;
  20. }
  21. static ERL_NIF_TERM new(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
  22. {
  23. uint32_t Size;
  24. if(!enif_get_uint(env, argv[0], &Size)) {
  25. return enif_make_badarg(env);
  26. }
  27. ErlNifBinary *ArrayPtr = (ErlNifBinary *) enif_alloc_resource(ResType, sizeof(ErlNifBinary)*Size);
  28. int i;
  29. for(i = 0; i < Size; i++){
  30. ErlNifBinary nullBin;
  31. enif_term_to_binary(env, null, &nullBin);
  32. ArrayPtr[i] = nullBin;
  33. }
  34. ERL_NIF_TERM Res = enif_make_resource(env, ArrayPtr);
  35. enif_release_resource(ArrayPtr);
  36. return Res;
  37. }
  38. static ERL_NIF_TERM get(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
  39. {
  40. uint32_t Index;
  41. if(!enif_get_uint(env, argv[1], &Index)) {
  42. return enif_make_badarg(env);
  43. }
  44. ErlNifBinary *ArrayPtr;
  45. if (!enif_get_resource(env, argv[0], ResType, (void **)&ArrayPtr)){
  46. return enif_make_badarg(env);
  47. }
  48. //enif_fprintf(stdout, "IMY************get %T \n", argv[1]);
  49. ERL_NIF_TERM Ret;
  50. enif_binary_to_term(env, ArrayPtr[Index].data, ArrayPtr[Index].size, &Ret, 0);
  51. return Ret;
  52. }
  53. static ERL_NIF_TERM put(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
  54. {
  55. //enif_fprintf(stdout, "IMY************put0001 %T \n", argv[1]);
  56. uint32_t Index;
  57. if(!enif_get_uint(env, argv[1], &Index)) {
  58. return enif_make_badarg(env);
  59. }
  60. //enif_fprintf(stdout, "IMY************put0002 %T %T \n", argv[1], argv[2]);
  61. ErlNifBinary Value;
  62. if(!enif_term_to_binary(env, argv[2], &Value))
  63. return enif_make_badarg(env);
  64. ErlNifBinary *ArrayPtr;
  65. //enif_fprintf(stdout, "IMY************put0003 %T \n", argv[1]);
  66. if (!enif_get_resource(env, argv[0], ResType, (void **)&ArrayPtr)){
  67. return enif_make_badarg(env);
  68. }
  69. //enif_fprintf(stdout, "IMY************put111 %T \n", argv[1]);
  70. ErlNifBinary OldValue = ArrayPtr[Index];
  71. // enif_fprintf(stdout, "IMY************put222 %T %d \n", argv[1], Index);
  72. ArrayPtr[Index] = Value;
  73. //enif_fprintf(stdout, "IMY************put333 %T \n", argv[1]);
  74. enif_release_binary(&OldValue);
  75. //enif_fprintf(stdout, "IMY************put444 %T \n", argv[1]);
  76. return ok;
  77. }
  78. static ERL_NIF_TERM test(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
  79. {
  80. ErlNifBinary Value;
  81. if(!enif_term_to_binary(env, argv[0], &Value))
  82. return enif_make_badarg(env);
  83. // enif_fprintf(stdout, "IMY************ %T", argv[0]);
  84. ERL_NIF_TERM Ret;
  85. enif_binary_to_term(env, Value.data, Value.size, &Ret, 0);
  86. enif_release_binary(&Value);
  87. return Ret;
  88. }
  89. static ErlNifFunc nifFuns[] = {
  90. {"new", 1, new},
  91. {"get", 2, get},
  92. {"put", 3, put},
  93. {"test", 1, test},
  94. };
  95. ERL_NIF_INIT(nifArray, nifFuns, &load, NULL, NULL, NULL)