edit scripts
[c11concurrency-benchmarks.git] / iris / src / file_writer.cpp
1 #include <file_writer.h>
2 #include <errno.h>
3 #include <string.h>
4 #include <unistd.h>
5
6
7 using namespace iris;
8
9 file_writer::file_writer(const char * filename): stream_writer(nullptr) {
10     FILE *fp = fopen(filename, "a");
11     if (fp == nullptr) {
12         std::string error_string = "[iris] failed to open log file <";
13         error_string += filename;
14         error_string += ">, reason: ";
15         error_string += strerror(errno);
16         throw error_string;
17     }
18     m_stream = fp;
19     m_fd = fileno(m_stream);
20 }
21
22 file_writer::~file_writer() {
23     if (m_stream == nullptr)
24         return;
25     fclose(m_stream);
26     m_stream = nullptr;
27     m_fd = -1;
28 }
29
30 void file_writer::write(const char * buffer, size_t len) {
31     size_t offset = 0;
32     while (len) {
33         size_t written = ::write(m_fd, buffer + offset, len);
34         if (written <= 0) {
35             if (errno == EINTR)
36                 continue;
37             fprintf(stderr, "[iris] error, should write %lu byts, only %lu bytes written, reason: %s.\n", len, written, strerror(errno));
38             break;
39         }   
40         len -= written;
41         offset += written;
42     }   
43 }