service_manager.h 2.9 KB
Newer Older
W
wangguibao 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
#ifndef BAIDU_PADDLE_SERVING_PREDICTOR_FORMAT_MANAGER_H
#define BAIDU_PADDLE_SERVING_PREDICTOR_FORMAT_MANAGER_H

#include "common/inner_common.h"

namespace baidu {
namespace paddle_serving {
namespace predictor {

#define REGIST_FORMAT_SERVICE(svr_name, svr)                    \
do {                                                            \
    int ret = ::baidu::paddle_serving::predictor::FormatServiceManager::instance().regist_service(\
              svr_name, svr);                                   \
    if (ret != 0) {                                             \
        LOG(FATAL)                                              \
            << "Failed regist service["                         \
            << svr_name << "]" << "["                           \
            << typeid(svr).name() << "]"                        \
            << "!";                                             \
    } else {                                                    \
        LOG(INFO)                                               \
            << "Success regist service["                        \
            << svr_name << "]["                                 \
            << typeid(svr).name() << "]"                        \
            << "!";                                             \
    }                                                           \
} while (0)

class FormatServiceManager {
public:
    typedef google::protobuf::Service Service;

    int regist_service(const std::string& svr_name, Service* svr) {
        if (_service_map.find(svr_name) != _service_map.end()) {
            LOG(FATAL) 
                << "Service[" << svr_name << "]["
                << typeid(svr).name() << "]"
                << " already exist!";
            return -1;
        }

        std::pair<boost::unordered_map<std::string, Service*>::iterator, bool> ret;
        ret = _service_map.insert(std::make_pair(svr_name, svr));
        if (ret.second == false) {
            LOG(FATAL)
                << "Service[" << svr_name << "]["
                << typeid(svr).name() << "]"
                << " insert failed!";
            return -1;
        }

        LOG(INFO)
            << "Service[" << svr_name << "] insert successfully!";
        return 0;
    }

    Service* get_service(const std::string& svr_name) {
        boost::unordered_map<std::string, Service*>::iterator res;
        if ((res = _service_map.find(svr_name)) == _service_map.end()) {
            LOG(WARNING) 
                << "Service[" << svr_name << "] "
                << "not found in service manager"
                << "!";
            return NULL;
        }
        return (*res).second;
    }

    static FormatServiceManager& instance() {
        static FormatServiceManager service_;
        return service_;
    }

private:
    boost::unordered_map<std::string, Service*> _service_map;
};

} // predictor
} // paddle_serving
} // baidu

#endif