Erlang nif没有升级

时间:2016-06-07 01:27:48

标签: c erlang erlang-nif

我在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函数,它返回123,一切都很好!

之后我将checksum的返回值更改为123456,并使用nif命令编译并将l(mynif)加载到erlang vm。

这是问题所在!如果我运行checksum函数,则返回值必须为123445,但它仍然是123nif尚未升级。

有什么问题?我搜索了很多并测试了一些示例和库jiffy但是没有用。

1 个答案:

答案 0 :(得分:1)

尝试:

code:purge(mynif).
code:delete(mynif).
l(mynif).