i write nif library in erlang. write load, upgrade , unload functions.
this code:
#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); in erlang shell load nif , run checksum function , returns 123 , fine!
after change return value of checksum 123456 , compile , load nif erlang vm using l(mynif) command.
here problem! if run checksum function, return value must 123445 still 123 , nif have not been upgraded.
what problem? search lot , tested examples , libraries jiffy didn`t work.
try:
code:purge(mynif). code:delete(mynif). l(mynif).