25 static const size_t queue_size = 16 * 1024;
26 std::deque<char*> pool;
27 std::deque<char*> write_queue;
28 std::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);
41 gzwrite(vcd_out, value, strlen(value));
42 memset(value, 0, buffer_size);
43 pool.push_back(value);
47 auto const timeout = std::chrono::milliseconds(1);
49 std::unique_lock<std::mutex> lock(writer_mtx);
50 auto now = std::chrono::system_clock::now();
51 cond.wait_until(lock, now + timeout, [
this]() ->
bool {
return done || !write_queue.empty(); });
58 auto buffer_pool =
new char[queue_size * buffer_size];
59 for(
auto i = 0u; i < queue_size; ++i) {
60 memset(buffer_pool + i * buffer_size, 0, buffer_size);
61 pool.push_back(buffer_pool + i * buffer_size);
63 pool_buffer.push_back(buffer_pool);
67 std::mutex writer_mtx;
68 using lock_type = std::unique_lock<std::mutex>;
69 static const size_t buffer_size = 512;
70 gz_writer(std::string
const& filename) {
71 vcd_out = gzopen(filename.c_str(),
"w3");
72 logger = std::thread([
this]() {
log(); });
79 lock_type lock(writer_mtx);
86 for(
auto b : pool_buffer)
90 inline void write_single(std::string
const& msg) {
91 lock_type lock(writer_mtx);
94 auto value = pool.front();
96 strncpy(value, msg.c_str(), std::min(buffer_size - 1, msg.length()));
97 write_queue.push_back(value);
99 inline void write(std::string
const& msg) {
107 inline void write(
char const* msg,
size_t size) {