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