2015-02-17 2 views
2

Я пытаюсь использовать G3Log (версию логатора Google - glog), чтобы выполнить некоторую регистрацию в статической библиотеке. Все работает очень хорошо, пока я не попытаюсь принести эту статическую библиотеку в управляемую оболочку C++/CLI. Когда я делаю это, я получаю страшный вопрос:Скрытие реализации G3Log

error C1189: #error : <mutex> is not supported when compiling with /clr or /clr:pure. 

Проблема, в том, что функции обратного вызова для мойки требуется g2 :: LogMessageMover, и сделать это, я должен вернуть в заголовочном файле. Итак, как я могу инкапсулировать заголовок glog.hpp, чтобы не сделать его видимым для приложения C++/CLI?

Вот что я пробовал, но я застрял на обратном вызове для раковины.

class Log { 
private: 
    void *log_; 
    void *trace_; 
    void *logworker; 

public: 

    std::string LogPath = ""; 
    std::string LogFile = "Log.txt"; 
    std::string TraceFile = "Trace.txt"; 

    Log(); 

    void Initialize(std::string log_path, std::string log_file, std::string trace_file); 

    // How to define this and hide the implementation?? 
    void LogMessage(g2::LogMessageMover message); 

    // How to define this and hide the implementation?? 
    void TraceMessage(g2::LogMessageMover message); 

    virtual ~Log(); 
}; 

Вот файл CPP:

#include "include/g2logworker.hpp" 
#include "include/g2log.hpp" 

Log::Log() { 
    logworker = (void *)(g2::LogWorker::createWithNoSink().get()); 
}; 

void Log::Initialize(std::string log_path, std::string log_file, std::string trace_file) { 
    auto worker = static_cast<g2::LogWorker *>(logworker); 
    auto loghandle = worker->addSink(std::make_unique<Log>(), &Log::LogMessage); 
    log_ = (void *) loghandle.get(); 

    auto tracehandle = worker->addSink(std::make_unique<Log>(), &Log::TraceMessage); 
    trace_ = (void *) tracehandle.get(); 

    g2::initializeLogging(worker); 
}; 

void Log::LogMessage(g2::LogMessageMover message) { 
    fprintf(stderr, "Got the log message"); 
}; 

void Log::TraceMessage(g2::LogMessageMover message) { 
    fprintf(stderr, "Got the trace message"); 
}; 

ответ

2

Кажется, что это g3log/SRC/shared_queue.hpp, который содержит обижая включает мьютекс

Несколько различных вариантов приходят to mind 1) изменить очередь из заголовка только на реализацию .hpp + .cpp, где часть мьютекса скрыта в pimpl

2) заменить qu eue для бесплатной очереди блокировки. Вероятно, вам нужно иметь оболочку, чтобы иметь возможность предоставить необходимый API. Я не тестировал этот, но выглядит многообещающе. http://moodycamel.com/blog/2014/a-fast-general-purpose-lock-free-queue-for-c++

+0

Чувствительная свободная очередь на верблюжьем замке отлично работает с g3log. Кроме того, вы также получаете значительное увеличение скорости для среднего случая. –

Смежные вопросы