Erlang nif 不升级
Erlang nif does not upgrades
我用 erlang 写了一个 nif
库。我还编写了 load
、upgrade
和 unload
函数。
这是我的代码:
#include "erl_nif.h"
int checksum(char *s)
{
return 123;
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
static ERL_NIF_TERM
checksum_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
return enif_make_int(env, checksum(""));
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
static int
load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
{
*priv_data = enif_open_resource_type(env,
NULL,
"cwm_utils_buf",
NULL,
ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER,
NULL);
return 0;
}
static int
upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
{
*priv_data = enif_open_resource_type(env,
NULL,
"cwm_utils_buf",
NULL,
ERL_NIF_RT_TAKEOVER,
NULL);
return 0;
}
static void
unload(ErlNifEnv* env, void* priv_data)
{
return ;
}
static ErlNifFunc nif_funcs[] = {
{"checksum", 1, checksum_nif}
};
ERL_NIF_INIT(mynif, nif_funcs, &load, NULL, &upgrade, &unload);
在 erlang shell 中我加载了这个 nif
和 运行 checksum
函数并且它 returns 123
一切都很好!
之后,我将 checksum
的 return 值更改为 123456
,并使用 l(mynif)
命令将 nif
编译并加载到 erlang vm。
问题来了!如果我运行checksum
函数,return值必须是123445
但它仍然是123
并且nif
还没有升级。
有什么问题?我搜索了很多并测试了一些示例和库,例如 jiffy
但没有用。
尝试:
code:purge(mynif).
code:delete(mynif).
l(mynif).
我用 erlang 写了一个 nif
库。我还编写了 load
、upgrade
和 unload
函数。
这是我的代码:
#include "erl_nif.h"
int checksum(char *s)
{
return 123;
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
static ERL_NIF_TERM
checksum_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
return enif_make_int(env, checksum(""));
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
static int
load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
{
*priv_data = enif_open_resource_type(env,
NULL,
"cwm_utils_buf",
NULL,
ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER,
NULL);
return 0;
}
static int
upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
{
*priv_data = enif_open_resource_type(env,
NULL,
"cwm_utils_buf",
NULL,
ERL_NIF_RT_TAKEOVER,
NULL);
return 0;
}
static void
unload(ErlNifEnv* env, void* priv_data)
{
return ;
}
static ErlNifFunc nif_funcs[] = {
{"checksum", 1, checksum_nif}
};
ERL_NIF_INIT(mynif, nif_funcs, &load, NULL, &upgrade, &unload);
在 erlang shell 中我加载了这个 nif
和 运行 checksum
函数并且它 returns 123
一切都很好!
之后,我将 checksum
的 return 值更改为 123456
,并使用 l(mynif)
命令将 nif
编译并加载到 erlang vm。
问题来了!如果我运行checksum
函数,return值必须是123445
但它仍然是123
并且nif
还没有升级。
有什么问题?我搜索了很多并测试了一些示例和库,例如 jiffy
但没有用。
尝试:
code:purge(mynif).
code:delete(mynif).
l(mynif).