探讨erlang消息选择性接收特性

/* * beam_emu.c process_main() 线程入口函数,实现VM调度 * 以下截取 i_loop_rec_fr 处理过程 * 作用是从信箱取出一条消息放到 x(0) 寄存器;没消息则跳到 wait或者 wait_timeout指令 */ OpCase(i_loop_rec_fr): {BeamInstr *next;ErlMessage* msgp; loop_rec__:PROCESS_MAIN_CHK_LOCKS(c_p);// 取出“当前位置”的消息msgp = PEEK_MESSAGE(c_p);if (!msgp) { //如果消息不存在,尝试从SMP下public queue获取消息#ifdef ERTS_SMP erts_smp_proc_lock(c_p, ERTS_PROC_LOCKS_MSG_RECEIVE); if (ERTS_PROC_PENDING_EXIT(c_p)) {// 如果进程准备退出,则不处理消息了erts_smp_proc_unlock(c_p, ERTS_PROC_LOCKS_MSG_RECEIVE);SWAPOUT;goto do_schedule; // 等待下一次调度 } // SMP下把消息移到进程私有堆尾部(纯指针操作) ERTS_SMP_MSGQ_MV_INQ2PRIVQ(c_p);// 再尝试取出“当前位置”的消息 msgp = PEEK_MESSAGE(c_p); if (msgp)erts_smp_proc_unlock(c_p, ERTS_PROC_LOCKS_MSG_RECEIVE); else#endif {// 信箱没消息则跳到 wait或者 wait_timeout指令(实际上就是执行下一条执行)SET_I((BeamInstr *) Arg(0));Goto(*I); }}// 解析分布式消息,把消息附加的数据复制到进程私有堆ErtsMoveMsgAttachmentIntoProc(msgp, c_p, E, HTOP, FCALLS,{SWAPOUT;reg[0] = r(0);PROCESS_MAIN_CHK_LOCKS(c_p);},{ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);PROCESS_MAIN_CHK_LOCKS(c_p);r(0) = reg[0];SWAPIN;});if (is_non_value(ERL_MESSAGE_TERM(msgp))) { /* * 如果消息损坏就移除(出现这种情况是分布式消息解码出现错误) */ ASSERT(!msgp->data.attached); UNLINK_MESSAGE(c_p, msgp); // 移除消息,,侧重将“当前”位置指向下一条消息 free_message(msgp); // 销毁消息 goto loop_rec__; // 跳到上面继续}PreFetch(1, next); // 标记下一条指令位置r(0) = ERL_MESSAGE_TERM(msgp);NextPF(1, next); // 执行下一条指令 }来看下这两个宏定义:

一切伟大的行动和思想,都有一个微不足道的开始

探讨erlang消息选择性接收特性

相关文章:

你感兴趣的文章:

标签云: