[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/himdd/bigflow/master/bigflow_python/python_interpreter.h [Back]  [Original]

/***************************************************************************
 *
 * Copyright (c) 2015 Baidu, Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 **************************************************************************/
// Author: Wang Cong (wangcong09@baidu.com)
//

#ifndef BIGFLOW_PYTHON_PYTHON_INTERPRETER_H
#define BIGFLOW_PYTHON_PYTHON_INTERPRETER_H

#include 
#include 

#include "boost/python/object_fwd.hpp"
#include "boost/serialization/singleton.hpp"
#include "glog/logging.h"
#include "toft/base/singleton.h"
#include "toft/base/scoped_array.h"

// #include "flume/util/singleton.h"

namespace baidu {
namespace bigflow {
namespace python {

/* A singleton that wraps CPython Interpreter. */
class PythonInterpreter : public toft::SingletonBase {
    friend class toft::SingletonBase;

public:
    PythonInterpreter();
    virtual ~PythonInterpreter();

public:
    typedef void (*ExceptionHandlerFunc)(const char* file, const char* function, int line_num);
    typedef void (*ExceptionHandlerWithMsgFunc)(const std::string&,
                                                const char* file,
                                                const char* function,
                                                int line_num);

    void set_exception_handler(ExceptionHandlerFunc handler);

    const void handle_exception(const char* file,
                                const char* function,
                                int line_num);

    void set_exception_handler_with_error_msg(ExceptionHandlerWithMsgFunc handler_with_msg);

    const void handle_exception_with_error_msg(const std::string& err_msg,
                                               const char* file,
                                               const char* function,
                                               int line_num);


    void initialize_interpreter();
    bool is_interpreter_initialized();
    void finalize_interpreter();

private:
    void set_python_home();
    void __set_python_home(const std::string& path);
    void apply_initialize_hooks();
    void apply_finalize_hooks();
    void apply(const std::string& file_name);

private:
    toft::scoped_array _python_home_chars;
    toft::scoped_array _python_prog_chars;
    toft::scoped_array _python_path_chars;

    ExceptionHandlerFunc _handler;
    ExceptionHandlerWithMsgFunc _handler_with_error_msg;
};

}  // namespace python
}  // namespace bigflow
}  // namespace baidu

namespace boost {
namespace python {

// for gtest output
std::ostream& operatorhandle_exception_with_error_msg(ERR_MSG,  __FILE__, __PRETTY_FUNCTION__, __LINE__)


#define BIGFLOW_PYTHON_RAISE_EXCEPTION(ERR_MSG) BIGFLOW_HANDLE_PYTHON_EXCEPTION_WITH_ERROR_MESSAGE(ERR_MSG)

#define BIGFLOW_PYTHON_RAISE_EXCEPTION_IF(condition, msg) do{ \
    if (condition) { \
        std::string errmsg = "Condition [" + std::string(#condition) + "] return true, so raise exception\n" + msg; \
        BIGFLOW_HANDLE_PYTHON_EXCEPTION_WITH_ERROR_MESSAGE(errmsg); \
    } \
}while(0)

#endif //  BIGFLOW_PYTHON_PYTHON_INTERPRETER_H

Web Proxy Viewer  |  New URL  |  Original Page