P4C
The P4 Compiler
Loading...
Searching...
No Matches
filelog.h
1
19
#ifndef _BACKENDS_TOFINO_BF_P4C_LOGGING_FILELOG_H_
20
#define _BACKENDS_TOFINO_BF_P4C_LOGGING_FILELOG_H_
21
22
#include <sys/stat.h>
23
24
#include <fstream>
25
#include <streambuf>
26
#include <string>
27
#include <utility>
28
29
#include "backends/tofino/bf-p4c/logging/manifest.h"
30
#include "lib/cstring.h"
31
32
namespace
Logging
{
33
35
enum
Mode
{
37
APPEND
,
38
40
CREATE
,
41
43
AUTO
44
};
45
47
48
class
FileLog
{
49
private
:
50
std::basic_streambuf<char> *clog_buff =
nullptr
;
51
std::ofstream *log =
nullptr
;
52
53
static
const
cstring
&name2type(
cstring
logName);
54
static
std::set<cstring> filesWritten;
55
56
public
:
57
explicit
FileLog
(
int
pipe,
cstring
logName,
Mode
mode =
AUTO
) {
58
bool
append =
true
;
59
switch
(mode) {
60
case
APPEND
:
61
append =
true
;
62
break
;
63
case
CREATE
:
64
append =
false
;
65
break
;
66
case
AUTO
:
67
append = filesWritten.count(logName);
68
break
;
69
}
70
71
filesWritten.insert(logName);
72
73
auto
logDir =
BFNContext::get
().
getOutputDirectory
(
"logs"
_cs, pipe);
74
if
(logDir) {
75
// Assuming cstring has a method to convert to std::string
76
std::filesystem::path fullPath =
77
std::filesystem::path(logDir.string_view()) / logName.string_view();
78
79
// Open the file stream with the full path
80
LOG1(
"Open logfile "
<< fullPath.string() <<
" append: "
<< append);
81
Manifest::getManifest
().addLog(pipe, name2type(logName), logName);
82
clog_buff = std::clog.rdbuf();
83
auto
flags = std::ios_base::out;
84
if
(append) flags |= std::ios_base::app;
85
log =
new
std::ofstream(fullPath, flags);
86
std::clog.rdbuf(log->rdbuf());
87
}
88
}
89
91
~FileLog
() {
close
(); }
92
94
void
close
() {
95
if
(clog_buff !=
nullptr
) {
96
std::clog.rdbuf(clog_buff);
97
}
98
if
(log) {
99
log->flush();
100
log->close();
101
delete
log;
102
log =
nullptr
;
103
}
104
}
105
107
static
void
close
(
FileLog
*&log) {
108
if
(!log)
return
;
109
delete
log;
110
log =
nullptr
;
111
}
112
};
113
114
}
// end namespace Logging
115
116
#endif
/* _BACKENDS_TOFINO_BF_P4C_LOGGING_FILELOG_H_ */
BFNContext::get
static BFNContext & get()
Definition
bf-p4c-options.cpp:777
BFNContext::getOutputDirectory
cstring getOutputDirectory(const cstring &suffix=cstring(), int pipe_id=-1)
Definition
bf-p4c-options.cpp:795
Logging::FileLog
A FileLog is used to redirect the logging output of a visitor pass to a file.
Definition
filelog.h:48
Logging::FileLog::~FileLog
~FileLog()
Closes the log using close.
Definition
filelog.h:91
Logging::FileLog::close
void close()
Untie the file and close the filestream.
Definition
filelog.h:94
Logging::FileLog::close
static void close(FileLog *&log)
Closes a FileLog and cleans up.
Definition
filelog.h:107
Logging::Manifest::getManifest
static Manifest & getManifest()
Return the singleton object.
Definition
manifest.cpp:414
P4::cstring
Definition
cstring.h:85
Logging
Definition
filelog.h:32
Logging::Mode
Mode
specifies how the log file is created and/or reused.
Definition
filelog.h:35
Logging::APPEND
@ APPEND
Appends to a log. Creates a new log if it doesn't already exist.
Definition
filelog.h:37
Logging::CREATE
@ CREATE
Creates a new log. Overwrites if the log already exists.
Definition
filelog.h:40
Logging::AUTO
@ AUTO
Creates if this is the first time writing to the log; otherwise, appends.
Definition
filelog.h:43
backends
tofino
bf-p4c
logging
filelog.h
Generated by
1.12.0