Erlang nif 不升级

Erlang nif does not upgrades

我用 erlang 写了一个 nif 库。我还编写了 loadupgradeunload 函数。

这是我的代码:

#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).