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

#include <stdint.h>
#include "erl_nif.h"
#ifdef _WIN32
#define INLINE __inline
#else
#define INLINE inline
#endif
static ErlNifResourceType* ResType = NULL;
ERL_NIF_TERM null;
ERL_NIF_TERM ok;
static int load(ErlNifEnv* env, void** priv, ERL_NIF_TERM load_info)
{
ErlNifResourceFlags flags = ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER;
ResType = enif_open_resource_type(env, NULL, "_nifArray_", NULL, flags, NULL);
if(NULL == ResType)
return -1;
null = enif_make_atom(env, "null");
ok = enif_make_atom(env, "ok");
return 0;
}
static ERL_NIF_TERM new(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
uint32_t Size;
if(!enif_get_uint(env, argv[0], &Size)) {
return enif_make_badarg(env);
}
ErlNifBinary *ArrayPtr = (ErlNifBinary *) enif_alloc_resource(ResType, sizeof(ErlNifBinary)*Size);
int i;
for(i = 0; i < Size; i++){
ErlNifBinary nullBin;
enif_term_to_binary(env, null, &nullBin);
ArrayPtr[i] = nullBin;
}
ERL_NIF_TERM Res = enif_make_resource(env, ArrayPtr);
enif_release_resource(ArrayPtr);
return Res;
}
static ERL_NIF_TERM get(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
uint32_t Index;
if(!enif_get_uint(env, argv[1], &Index)) {
return enif_make_badarg(env);
}
ErlNifBinary *ArrayPtr;
if (!enif_get_resource(env, argv[0], ResType, (void **)&ArrayPtr)){
return enif_make_badarg(env);
}
//enif_fprintf(stdout, "IMY************get %T \n", argv[1]);
ERL_NIF_TERM Ret;
enif_binary_to_term(env, ArrayPtr[Index].data, ArrayPtr[Index].size, &Ret, 0);
return Ret;
}
static ERL_NIF_TERM put(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
//enif_fprintf(stdout, "IMY************put0001 %T \n", argv[1]);
uint32_t Index;
if(!enif_get_uint(env, argv[1], &Index)) {
return enif_make_badarg(env);
}
//enif_fprintf(stdout, "IMY************put0002 %T %T \n", argv[1], argv[2]);
ErlNifBinary Value;
if(!enif_term_to_binary(env, argv[2], &Value))
return enif_make_badarg(env);
ErlNifBinary *ArrayPtr;
//enif_fprintf(stdout, "IMY************put0003 %T \n", argv[1]);
if (!enif_get_resource(env, argv[0], ResType, (void **)&ArrayPtr)){
return enif_make_badarg(env);
}
//enif_fprintf(stdout, "IMY************put111 %T \n", argv[1]);
ErlNifBinary OldValue = ArrayPtr[Index];
// enif_fprintf(stdout, "IMY************put222 %T %d \n", argv[1], Index);
ArrayPtr[Index] = Value;
//enif_fprintf(stdout, "IMY************put333 %T \n", argv[1]);
enif_release_binary(&OldValue);
//enif_fprintf(stdout, "IMY************put444 %T \n", argv[1]);
return ok;
}
static ERL_NIF_TERM test(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
ErlNifBinary Value;
if(!enif_term_to_binary(env, argv[0], &Value))
return enif_make_badarg(env);
// enif_fprintf(stdout, "IMY************ %T", argv[0]);
ERL_NIF_TERM Ret;
enif_binary_to_term(env, Value.data, Value.size, &Ret, 0);
enif_release_binary(&Value);
return Ret;
}
static ErlNifFunc nifFuns[] = {
{"new", 1, new},
{"get", 2, get},
{"put", 3, put},
{"test", 1, test},
};
ERL_NIF_INIT(nifArray, nifFuns, &load, NULL, NULL, NULL)