aboutsummaryrefslogtreecommitdiffstats
path: root/util/system/file.cpp
diff options
context:
space:
mode:
authorswarmer <swarmer@yandex-team.com>2024-04-14 14:26:05 +0300
committerswarmer <swarmer@yandex-team.com>2024-04-14 14:39:47 +0300
commite646c0d6f331d5baf752fa3dd60e2cde92ffc966 (patch)
tree0f754da5d4a9ce4dbf716a99eb5ffd7faf603529 /util/system/file.cpp
parent89f2322ff646da7f9719ae9f7145368da9ee79d4 (diff)
downloadydb-e646c0d6f331d5baf752fa3dd60e2cde92ffc966.tar.gz
reduce code bloat in the DecodeOpenMode function
The loop version works as fast as unrolled one. But the binary code size is about 7 times smaller. 9c014c6ba2ab744670f9ac2fe3bf57942e01b0a1
Diffstat (limited to 'util/system/file.cpp')
-rw-r--r--util/system/file.cpp100
1 files changed, 56 insertions, 44 deletions
diff --git a/util/system/file.cpp b/util/system/file.cpp
index 349e2a667e..d9acde845d 100644
--- a/util/system/file.cpp
+++ b/util/system/file.cpp
@@ -832,52 +832,64 @@ TString DecodeOpenMode(ui32 mode0) {
TStringBuilder r;
-#define F(flag) \
- if ((mode & flag) == flag) { \
- mode &= ~flag; \
- if (r) { \
- r << TStringBuf("|"); \
- } \
- r << TStringBuf(#flag); \
- }
-
- F(RdWr)
- F(RdOnly)
- F(WrOnly)
-
- F(CreateAlways)
- F(CreateNew)
- F(OpenAlways)
- F(TruncExisting)
- F(ForAppend)
- F(Transient)
- F(CloseOnExec)
-
- F(Temp)
- F(Sync)
- F(Direct)
- F(DirectAligned)
- F(Seq)
- F(NoReuse)
- F(NoReadAhead)
-
- F(AX)
- F(AR)
- F(AW)
- F(ARW)
-
- F(AXOther)
- F(AWOther)
- F(AROther)
- F(AXGroup)
- F(AWGroup)
- F(ARGroup)
- F(AXUser)
- F(AWUser)
- F(ARUser)
+ struct TFlagCombo {
+ ui32 Value;
+ TStringBuf Name;
+ };
+
+ static constexpr TFlagCombo knownFlagCombos[]{
+
+#define F(flag) {flag, #flag}
+
+ F(RdWr),
+ F(RdOnly),
+ F(WrOnly),
+
+ F(CreateAlways),
+ F(CreateNew),
+ F(OpenAlways),
+ F(TruncExisting),
+ F(ForAppend),
+ F(Transient),
+ F(CloseOnExec),
+
+ F(Temp),
+ F(Sync),
+ F(Direct),
+ F(DirectAligned),
+ F(Seq),
+ F(NoReuse),
+ F(NoReadAhead),
+
+ F(AX),
+ F(AR),
+ F(AW),
+ F(ARW),
+
+ F(AXOther),
+ F(AWOther),
+ F(AROther),
+ F(AXGroup),
+ F(AWGroup),
+ F(ARGroup),
+ F(AXUser),
+ F(AWUser),
+ F(ARUser),
#undef F
+ };
+
+ for (const auto& [flag, name] : knownFlagCombos) {
+ if ((mode & flag) == flag) {
+ mode &= ~flag;
+ if (r) {
+ r << '|';
+ }
+ r << name;
+ }
+ }
+
if (mode != 0) {
if (r) {
r << TStringBuf("|");
@@ -890,7 +902,7 @@ TString DecodeOpenMode(ui32 mode0) {
return "0";
}
- return r;
+ return std::move(r);
}
class TFile::TImpl: public TAtomicRefCount<TImpl> {