2017-02-23 79 views
1

我试图从创建的线程调用enif_send。 主要是,我有一个erlang过程,它收听从我的nif发出的收到的消息。创建线程问题的Enif_send函数

首先,在我的危宿功能我得到了我的Erlang进程的PID,我投它,然后我打电话enif_send以如下发送消息:

ErlNifPid* pid = (ErlNifPid*) enif_alloc(sizeof(ErlNifPid)); 
ErlNifPid * erlang_pid = (ErlNifPid*)argv; 
ERL_NIF_TERM pid1 = enif_make_pid(env , erlang_pid); 

if(enif_is_pid(env,pid1)) 
printf(" it's pid\n"); 
else 
printf(" it's not pid\n"); 

msg_env = enif_alloc_env(); 
ERL_NIF_TERM replay = (ERL_NIF_TERM) *text; 
msg = enif_make_tuple(msg_env, replay); 
if(enif_send(NULL, erlang_pid, msg_env,msg)) 
printf(" send succeed\n"); 
else 
printf(" send failed\n"); 

直到这个阶段,我可以送消息给我的erlang进程。

之后,我产生了一个enif_thread,我传递给它Env和PID为参数,在我试图从我的线程像调用enif_send:

ERL_NIF_TERM pid1 = enif_make_pid(conn->env , conn->pid); 
if(enif_is_pid(conn->env,pid1)) 
printf("it's pid\n"); 
else 
printf(" it's not pid\n"); 
for (int i=0;i<index;i++) 
{ 
msg_env = enif_alloc_env(); 

msg = enif_make_int(msg_env, 1); 
if(enif_send(conn->env, conn->pid, msg_env,msg)) 
printf(" send succeed\n"); 
else 
printf(" send failed\n"); 

但是,当我检查了PID与enif_is_pid我得到了一个无效的PID,即使它是在生成线程的函数中检查的pid相同,所以发送失败。 有什么想法吗?

回答

2

documentation for enif_send所述,当从创建的线程调用该函数时,env参数应为NULL

顺便说一句,这是很难说没有看到所有的代码,但是这部分代码显示您可能会出现问题:

ErlNifPid * erlang_pid = (ErlNifPid*)argv; 
ERL_NIF_TERM pid1 = enif_make_pid(env, erlang_pid); 

如果你想呼叫方的PID,您应该使用the enif_self function或如果将pid作为参数传递给NIF,则应使用enif_get_local_pid将其解压。例如,如果是从二郎调用者传递的第一个参数:

ErlNifPid pid; 
if (!enif_get_local_pid(env, argv[0], &pid)) 
    return enif_make_badarg(env); 

然后,您可以复制它在创建发送线程使用。