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.
 
 
 
 
 
 

111 lines
3.4 KiB

#include "erl_nif.h"
#include <stdio.h>
#include <string.h>
static ErlNifResourceType* test_RESOURCE = NULL;
// Prototypes
static ERL_NIF_TERM get_bin_address(ErlNifEnv* env, int argc,
const ERL_NIF_TERM argv[]);
static ERL_NIF_TERM new_array(ErlNifEnv* env, int argc,
const ERL_NIF_TERM argv[]);
static ERL_NIF_TERM size_array(ErlNifEnv* env, int argc,
const ERL_NIF_TERM argv[]);
static ERL_NIF_TERM put_array(ErlNifEnv* env, int argc,
const ERL_NIF_TERM argv[]);
static ERL_NIF_TERM get_array(ErlNifEnv* env, int argc,
const ERL_NIF_TERM argv[]);
static ErlNifFunc nif_funcs[] =
{
{"get_bin_address", 1, get_bin_address},
{"new_array", 1, new_array},
{"size_array", 1, size_array},
{"put_array", 3, put_array},
{"get_array", 2, get_array}
};
static ERL_NIF_TERM get_bin_address(ErlNifEnv* env, int argc,
const ERL_NIF_TERM argv[])
{
ErlNifBinary bin;
enif_inspect_binary(env, argv[0], &bin);
char buf[256];
sprintf(buf, "bin: size=%zu, ptr=%p", bin.size, bin.data);
return enif_make_string(env, buf, ERL_NIF_LATIN1);
}
static ERL_NIF_TERM new_array(ErlNifEnv* env, int argc,
const ERL_NIF_TERM argv[])
{
ErlNifBinary bin;
unsigned long size;
// unsigned char* data;
enif_get_ulong(env, argv[0], &size);
// enif_inspect_binary(env, argv[1], &bin);
enif_alloc_binary(size * sizeof(long), &bin);
return enif_make_binary(env, &bin);
}
static ERL_NIF_TERM size_array(ErlNifEnv* env, int argc,
const ERL_NIF_TERM argv[])
{
ErlNifBinary bin;
enif_inspect_binary(env, argv[0], &bin);
return enif_make_int64(env, bin.size);
}
static ERL_NIF_TERM put_array(ErlNifEnv* env, int argc,
const ERL_NIF_TERM argv[])
{
ErlNifBinary bin;
unsigned long* array;
unsigned long pos, value;
enif_get_ulong(env, argv[0], &pos);
enif_get_ulong(env, argv[1], &value);
enif_inspect_binary(env, argv[2], &bin);
array = (unsigned long*)bin.data;
array[pos] = value;
return enif_make_atom(env, "ok");
}
static ERL_NIF_TERM get_array(ErlNifEnv* env, int argc,
const ERL_NIF_TERM argv[])
{
ErlNifBinary bin;
unsigned long* array;
unsigned long pos;
enif_get_ulong(env, argv[0], &pos);
enif_inspect_binary(env, argv[1], &bin);
array = (unsigned long*)bin.data;
return enif_make_int64(env, *(array + pos));
}
static void test_resource_cleanup(ErlNifEnv* env, void* arg)
{
/* Delete any dynamically allocated memory stored in test_handle */
/* test_handle* handle = (test_handle*)arg; */
}
static int on_load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
{
ErlNifResourceFlags flags = ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER;
ErlNifResourceType* rt = enif_open_resource_type(env, NULL,
"test_resource",
&test_resource_cleanup,
flags, NULL);
if (rt == NULL)
return -1;
test_RESOURCE = rt;
return 0;
}
ERL_NIF_INIT(binary_tools, nif_funcs, &on_load, NULL, NULL, NULL);