当前net_plugin和其它plugin都是在同一个线程中运行的,现在希望能把net_plugin独立拿出来做成单独的net_plugin线程。
经分析,主要难度在于修改net_plugin与其它plugin之间的通信,下面是主要的一些通信方式:
appbase::channel通信(本质是使用的boost::signals2::signal)
appbase::method通信(本质也是使用的boost::signals2::signal)
使用原生的boost::signals2::signal
通过引入其它的plugin直接进行调用
net_plugin调用(通知)其它plugin的情况
net_plugin发布消息的通道(在net_plugin新启动的子线程中通过post发送数据给net_plugin父线程函数A,然后由父线程函数A publish给其它plugin):
net_plugin中method相关:
无
net_plugin中boost::signals2::signal相关:
无
net_plugin中函数间接调用其它plugin的channel/method等
fc::logger extern std::unordered_mapstd::string,logger& get_logger_map(); 是否线程安全??
两个方面整改,1. 日志需要打印线程名称;2. 线程之间打印日志不能混乱(需要加锁);
sync_manager
dispatch_manager
struct by_expiry;
chain_plug,
producer_plug
local_txns
net_plugin 依赖chain_plugin, 所以net_plugin可能有直接调用chain_plugin的行为
其它plugin调用net_plugin的情况
net_plugin订阅的消息通道:
net_plugin订阅的method:
无
直接使用boost::signals2::signal
无
其它plugin直接或间接调用
txn_test_gen_plugin.cpp
net_api_plugin.cpp
CALL(net, net_mgr, connect,
INVOKE_R_R(net_mgr, connect, std::string), 201),
CALL(net, net_mgr, disconnect,
INVOKE_R_R(net_mgr, disconnect, std::string), 201),
CALL(net, net_mgr, status,
INVOKE_R_R(net_mgr, status, std::string), 201),
CALL(net, net_mgr, connections,
INVOKE_R_V(net_mgr, connections), 201),
pbft_plugin.cpp
当前net_plugin和其它plugin都是在同一个线程中运行的,现在希望能把net_plugin独立拿出来做成单独的net_plugin线程。
经分析,主要难度在于修改net_plugin与其它plugin之间的通信,下面是主要的一些通信方式:
net_plugin调用(通知)其它plugin的情况
发布点: net_plugin中
pbft_incoming_prepare_channel.publish(std::make_shared<pbft_message_metadata<pbft_prepare>>(std::move(pmm)));
订阅点: chain_plugin中
my->pbft_incoming_prepare_channel.subscribe
发布点: net_plugin中
pbft_incoming_commit_channel.publish(std::make_shared<pbft_message_metadata<pbft_commit>>(std::move(pmm)));
订阅点: chain_plugin
my->pbft_incoming_commit_channel.subscribe
发布点: net_plugin
pbft_incoming_view_change_channel.publish(std::make_shared<pbft_message_metadata<pbft_view_change>>(std::move(pmm)));
订阅点: chain_plugin
my->pbft_incoming_view_change_channel.subscribe
发布点: net_plugin
pbft_incoming_new_view_channel.publish(std::make_shared<pbft_message_metadata<pbft_new_view>>(std::move(pmm)));
订阅点: chain_plugin
my->pbft_incoming_new_view_channel.subscribe
发布点: net_plugin
pbft_incoming_checkpoint_channel.publish(std::make_shared<pbft_message_metadata<pbft_checkpoint>>(std::move(pmm)));
订阅点: chain_plugin
my->pbft_incoming_checkpoint_channel.subscribe
无
无
其它plugin调用net_plugin的情况
无
无
INVOKE_R_R(net_mgr, connect, std::string), 201),
INVOKE_R_R(net_mgr, disconnect, std::string), 201),
INVOKE_R_R(net_mgr, status, std::string), 201),
INVOKE_R_V(net_mgr, connections), 201),