skynetソース分析(4)--monitor
2080 ワード
作成者:[email protected]、転載は作者を明記してください
skynetのサービスに対する監視は比較的に粗末で、設計の原則から言えば、このようにするのも正しいです.フレームワーク層ができることは、基本的には報告とログを打つことです.上層部の業務は変化が万千で、いくら書いても、上層部の業務需要を満たすことができない可能性があります.skynetでのサービスのモニタリングはskynet_で実現monitor.cとskynet_monitor.hでは,サービスがデッドサイクルに陥る可能性がある場合にログを打つ.具体的なログの内容はコードを参照してください.
メッセージが送信されるたびにskynet_が呼び出されます.monitor_triggerは、合計2回調整され、1回目のパラメータsourceとdestinationは実際の値、すなわち0ではありません.2回目のコールは、メッセージの配布が完了したときにsourceとdestinationが0を付与します.
最初のtrigger呼び出し以降、メッセージの送信が遅れた場合、monitorスレッドが最初にチェックされるとcheck_バージョンの値はバージョンに割り当てられます.次にmonitorスレッドが2回目にチェックされ、この時点でversionとcheck_バージョンは等しくなり、destinationも0ではなく、ターゲットサービスの解放とアラームの印刷の流れに入ります.
この文章は簡単に事について論じるしかなく、本当にはっきり話すには、脈絡全体が貫通しているので、メッセージの配布を終えなければならない.
skynetのサービスに対する監視は比較的に粗末で、設計の原則から言えば、このようにするのも正しいです.フレームワーク層ができることは、基本的には報告とログを打つことです.上層部の業務は変化が万千で、いくら書いても、上層部の業務需要を満たすことができない可能性があります.skynetでのサービスのモニタリングはskynet_で実現monitor.cとskynet_monitor.hでは,サービスがデッドサイクルに陥る可能性がある場合にログを打つ.具体的なログの内容はコードを参照してください.
#include "skynet_monitor.h"
#include "skynet_server.h"
#include "skynet.h"
#include "atomic.h"
#include
#include
struct skynet_monitor {
int version; //
int check_version; //
uint32_t source; //
uint32_t destination; //
};
//
struct skynet_monitor *
skynet_monitor_new() {
struct skynet_monitor * ret = skynet_malloc(sizeof(*ret));
memset(ret, 0, sizeof(*ret));
return ret;
}
//
void
skynet_monitor_delete(struct skynet_monitor *sm) {
skynet_free(sm);
}
//
void
skynet_monitor_trigger(struct skynet_monitor *sm, uint32_t source, uint32_t destination) {
sm->source = source; //
sm->destination = destination; //
ATOM_INC(&sm->version); //
}
// ,
void
skynet_monitor_check(struct skynet_monitor *sm) {
if (sm->version == sm->check_version) {//
if (sm->destination) { //destination 0
//
skynet_context_endless(sm->destination);
// ,
skynet_error(NULL, "A message from [ :%08x ] to [ :%08x ] maybe in an endless loop (version = %d)", sm->source , sm->destination, sm->version);
}
} else { //�
sm->check_version = sm->version;
}
}
メッセージが送信されるたびにskynet_が呼び出されます.monitor_triggerは、合計2回調整され、1回目のパラメータsourceとdestinationは実際の値、すなわち0ではありません.2回目のコールは、メッセージの配布が完了したときにsourceとdestinationが0を付与します.
最初のtrigger呼び出し以降、メッセージの送信が遅れた場合、monitorスレッドが最初にチェックされるとcheck_バージョンの値はバージョンに割り当てられます.次にmonitorスレッドが2回目にチェックされ、この時点でversionとcheck_バージョンは等しくなり、destinationも0ではなく、ターゲットサービスの解放とアラームの印刷の流れに入ります.
この文章は簡単に事について論じるしかなく、本当にはっきり話すには、脈絡全体が貫通しているので、メッセージの配布を終えなければならない.