skynetソース分析(4)--monitor

2080 ワード

作成者:[email protected]、転載は作者を明記してください
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ではなく、ターゲットサービスの解放とアラームの印刷の流れに入ります.
この文章は簡単に事について論じるしかなく、本当にはっきり話すには、脈絡全体が貫通しているので、メッセージの配布を終えなければならない.