8 #ifndef _SCC_TRACE_GZ_WRITER_HH_ 
    9 #define _SCC_TRACE_GZ_WRITER_HH_ 
   11 #include <boost/lockfree/spsc_queue.hpp> 
   12 #include <boost/atomic.hpp> 
   25     static const size_t queue_size=16*1024;
 
   26     std::deque<char*> pool;
 
   27     std::deque<char*> write_queue;
 
   28     boost::atomic<bool> done {
false};
 
   29     std::condition_variable cond;
 
   31     std::deque<char*> pool_buffer;
 
   32     gzFile vcd_out{
nullptr};
 
   35     inline void write_out(){
 
   36         while (!write_queue.empty()) {
 
   37             auto* value = write_queue.front();
 
   38             write_queue.pop_front();
 
   39             auto len = strlen(value);
 
   40             if(len) gzwrite(vcd_out, value, strlen(value));
 
   41             memset(value, 0, buffer_size);
 
   42             pool.push_back(value);
 
   46         auto const timeout = std::chrono::milliseconds(1);
 
   48             std::unique_lock<std::mutex> lock(writer_mtx);
 
   49             auto now = std::chrono::system_clock::now();
 
   50             cond.wait_until(lock, now+timeout, [
this]() -> 
bool { 
return done || ! write_queue.empty(); });
 
   57         auto buffer_pool = 
new char[queue_size * buffer_size];
 
   58         for (
auto i = 0u; i < queue_size; ++i) {
 
   59             memset(buffer_pool + i * buffer_size, 0, buffer_size);
 
   60             pool.push_back(buffer_pool + i * buffer_size);
 
   62         pool_buffer.push_back(buffer_pool);
 
   66     std::mutex writer_mtx;
 
   67     using lock_type=std::unique_lock<std::mutex>;
 
   68     static const size_t buffer_size=512;
 
   70         vcd_out = gzopen(filename.c_str(), 
"w3");
 
   71         logger=std::thread([
this](){
log();});
 
   78             lock_type lock(writer_mtx);
 
   85         for(
auto b:pool_buffer) 
delete b;
 
   88     inline void write_single(std::string 
const& msg){
 
   89         lock_type lock(writer_mtx);
 
   90         if(pool.empty()) enlarge_pool();
 
   91         auto value = pool.front();
 
   93         strncpy(value, msg.c_str(), std::min(buffer_size-1, msg.length()));
 
   94         write_queue.push_back(value);
 
   96     inline void write(std::string 
const& msg){
 
   97         if(pool.empty()) enlarge_pool();
 
  103     inline void write(
char const* msg, 
size_t size){
 
  104         if(pool.empty()) enlarge_pool();
 
log
enum defining the log levels