1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include <array>
16 #include <atomic>
17 #include <cassert>
18 #include <climits>
19 #include <cstdio>
20 #include <cstring>
21 #include <ctime>
22 #include <fstream>
23 #include <functional>
24 #include <iostream>
25 #include <pthread.h>
26 #include <shared_mutex>
27 #include <string>
28 #include <sys/uio.h>
29 #include <unistd.h>
30 #include <unordered_map>
31
32 #include <parameter.h>
33 #include <sysparam_errno.h>
34 #include <hilog/log.h>
35 #include <hilog_common.h>
36 #include <log_utils.h>
37
38 #include "properties.h"
39
40 namespace OHOS {
41 namespace HiviewDFX {
42 using namespace std;
43
44 enum class PropType {
45 // Below properties are used in HiLog API, which will be invoked frequently, so they should be cached
46 PROP_PRIVATE = 0,
47 PROP_ONCE_DEBUG,
48 PROP_PERSIST_DEBUG,
49 PROP_GLOBAL_LOG_LEVEL,
50 PROP_PERSIST_GLOBAL_LOG_LEVEL,
51 PROP_DOMAIN_LOG_LEVEL,
52 PROP_PERSIST_DOMAIN_LOG_LEVEL,
53 PROP_TAG_LOG_LEVEL,
54 PROP_PERSIST_TAG_LOG_LEVEL,
55 PROP_DOMAIN_FLOWCTRL,
56 PROP_PROCESS_FLOWCTRL,
57
58 // Below properties needn't be cached, used in low frequency
59 PROP_KMSG,
60 PROP_BUFFER_SIZE,
61 PROP_PROC_QUOTA,
62 PROP_STATS_ENABLE,
63 PROP_STATS_TAG_ENABLE,
64 PROP_DOMAIN_QUOTA,
65
66 PROP_MAX,
67 };
68 using ReadLock = shared_lock<shared_timed_mutex>;
69 using InsertLock = unique_lock<shared_timed_mutex>;
70
71 static constexpr int HILOG_PROP_VALUE_MAX = 92;
72 static constexpr int DEFAULT_QUOTA = 51200;
73 static int LockByProp(PropType propType);
74 static void UnlockByProp(PropType propType);
75
76 static pthread_mutex_t g_privateLock = PTHREAD_MUTEX_INITIALIZER;
77 static pthread_mutex_t g_onceDebugLock = PTHREAD_MUTEX_INITIALIZER;
78 static pthread_mutex_t g_persistDebugLock = PTHREAD_MUTEX_INITIALIZER;
79 static pthread_mutex_t g_globalLevelLock = PTHREAD_MUTEX_INITIALIZER;
80 static pthread_mutex_t g_persistGlobalLevelLock = PTHREAD_MUTEX_INITIALIZER;
81 static pthread_mutex_t g_domainLevelLock = PTHREAD_MUTEX_INITIALIZER;
82 static pthread_mutex_t g_persistDomainLevelLock = PTHREAD_MUTEX_INITIALIZER;
83 static pthread_mutex_t g_tagLevelLock = PTHREAD_MUTEX_INITIALIZER;
84 static pthread_mutex_t g_persistTagLevelLock = PTHREAD_MUTEX_INITIALIZER;
85 static pthread_mutex_t g_domainFlowLock = PTHREAD_MUTEX_INITIALIZER;
86 static pthread_mutex_t g_processFlowLock = PTHREAD_MUTEX_INITIALIZER;
87 static constexpr const char* HAP_DEBUGGABLE = "HAP_DEBUGGABLE";
88
89 using PropRes = struct {
90 string name;
91 pthread_mutex_t* lock;
92 };
93
94 static PropRes *g_propResources = nullptr;
InitProps()95 static __attribute__((constructor)) void InitProps()
96 {
97 g_propResources = new PropRes[static_cast<int>(PropType::PROP_MAX)]{
98 // Cached:
99 {"hilog.private.on", &g_privateLock}, // PROP_PRIVATE
100 {"hilog.debug.on", &g_onceDebugLock}, // PROP_ONCE_DEBUG
101 {"persist.sys.hilog.debug.on", &g_persistDebugLock}, // PROP_PERSIST_DEBUG
102 {"hilog.loggable.global", &g_globalLevelLock}, // PROP_GLOBAL_LOG_LEVEL
103 {"persist.sys.hilog.loggable.global", &g_persistGlobalLevelLock}, // PROP_PERSIST_GLOBAL_LOG_LEVEL
104 {"hilog.loggable.domain.", &g_domainLevelLock}, // PROP_DOMAIN_LOG_LEVEL
105 {"persist.sys.hilog.loggable.domain.", &g_persistDomainLevelLock}, // PROP_PERSIST_DOMAIN_LOG_LEVEL
106 {"hilog.loggable.tag.", &g_tagLevelLock}, // PROP_TAG_LOG_LEVEL
107 {"persist.sys.hilog.loggable.tag.", &g_persistTagLevelLock}, // PROP_PERSIST_TAG_LOG_LEVEL
108 {"hilog.flowctrl.domain.on", &g_domainFlowLock}, // PROP_DOMAIN_FLOWCTRL
109 {"hilog.flowctrl.proc.on", &g_processFlowLock}, // PROP_PROCESS_FLOWCTRL
110
111 // Non cached:
112 {"persist.sys.hilog.kmsg.on", nullptr}, // PROP_KMSG,
113 {"hilog.buffersize.", nullptr}, // PROP_BUFFER_SIZE,
114 {"hilog.quota.proc.", nullptr}, // PROP_PROC_QUOTA
115 {"persist.sys.hilog.stats", nullptr}, // PROP_STATS_ENABLE,
116 {"persist.sys.hilog.stats.tag", nullptr}, // PROP_STATS_TAG_ENABLE,
117 {"hilog.quota.domain.", nullptr}, // DOMAIN_QUOTA
118 };
119 }
120
GetPropertyName(PropType propType)121 static string GetPropertyName(PropType propType)
122 {
123 return g_propResources[static_cast<int>(propType)].name;
124 }
125
LockByProp(PropType propType)126 static int LockByProp(PropType propType)
127 {
128 if (g_propResources[static_cast<int>(propType)].lock == nullptr) {
129 return -1;
130 }
131 return pthread_mutex_trylock(g_propResources[static_cast<int>(propType)].lock);
132 }
133
UnlockByProp(PropType propType)134 static void UnlockByProp(PropType propType)
135 {
136 if (g_propResources[static_cast<int>(propType)].lock == nullptr) {
137 return;
138 }
139 pthread_mutex_unlock(g_propResources[static_cast<int>(propType)].lock);
140 return;
141 }
142
PropertyGet(const string & key,char * value,int len)143 static int PropertyGet(const string &key, char *value, int len)
144 {
145 int handle = static_cast<int>(FindParameter(key.c_str()));
146 if (handle == -1) {
147 return RET_FAIL;
148 }
149
150 auto res = GetParameterValue(handle, value, len);
151 if (res < 0) {
152 std::cerr << "PropertyGet() -> GetParameterValue -> Can't get value for key: " << key;
153 std::cerr << " handle: " << handle << " Result: " << res << "\n";
154 return RET_FAIL;
155 }
156 return RET_SUCCESS;
157 }
158
PropertySet(const string & key,const string & value)159 static int PropertySet(const string &key, const string &value)
160 {
161 auto result = SetParameter(key.c_str(), value.c_str());
162 if (result < 0) {
163 if (result == EC_INVALID) {
164 std::cerr << "PropertySet(): Invalid arguments.\n";
165 } else {
166 std::cerr << "PropertySet(): key: " << key.c_str() << ", value: " << value <<
167 ", error: " << result << "\n";
168 }
169 return RET_FAIL;
170 }
171 return RET_SUCCESS;
172 }
173
174 class PropertyTypeLocker {
175 public:
PropertyTypeLocker(PropType propType)176 explicit PropertyTypeLocker(PropType propType) : m_propType(propType), m_isLocked(false)
177 {
178 m_isLocked = !LockByProp(m_propType);
179 }
180
~PropertyTypeLocker()181 ~PropertyTypeLocker()
182 {
183 if (m_isLocked) {
184 UnlockByProp(m_propType);
185 }
186 }
187
isLocked() const188 bool isLocked() const
189 {
190 return m_isLocked;
191 }
192
193 private:
194 PropType m_propType;
195 bool m_isLocked;
196 };
197
198 using RawPropertyData = std::array<char, HILOG_PROP_VALUE_MAX>;
199
200 template<typename T>
201 class CacheData {
202 public:
203 using DataConverter = std::function<T(const RawPropertyData&, const T& defaultVal)>;
204
CacheData(DataConverter converter,const T & defaultValue,PropType propType,const std::string & suffix="")205 CacheData(DataConverter converter, const T& defaultValue, PropType propType, const std::string& suffix = "")
206 : m_value(defaultValue), m_defaultValue(defaultValue), m_propType(propType), m_converter(converter)
207 {
208 m_key = GetPropertyName(m_propType) + suffix;
209 }
210
getValue()211 T getValue()
212 {
213 long long sysCommitId = GetSystemCommitId();
214 if (sysCommitId == m_sysCommit) {
215 return m_value;
216 }
217 m_sysCommit = sysCommitId;
218 if (m_handle == -1) {
219 int handle = static_cast<int>(FindParameter(m_key.c_str()));
220 if (handle == -1) {
221 return m_defaultValue;
222 }
223 m_handle = handle;
224 }
225 int currentCommit = static_cast<int>(GetParameterCommitId(m_handle));
226 PropertyTypeLocker locker(m_propType);
227 if (locker.isLocked()) {
228 if (currentCommit != m_commit) {
229 updateValue();
230 m_commit = currentCommit;
231 }
232 return m_value;
233 } else {
234 return getDirectValue();
235 }
236 }
237
238 private:
getRawValue(char * value,unsigned int len)239 bool getRawValue(char *value, unsigned int len)
240 {
241 auto res = GetParameterValue(m_handle, value, len);
242 if (res < 0) {
243 std::cerr << "CacheData -> GetParameterValue -> Can't get value for key: " << m_key;
244 std::cerr << " handle: " << m_handle << " Result: " << res << "\n";
245 return false;
246 }
247 return true;
248 }
249
getDirectValue()250 T getDirectValue()
251 {
252 RawPropertyData tempData;
253 if (!getRawValue(tempData.data(), tempData.size())) {
254 return m_defaultValue;
255 }
256 m_value = m_converter(tempData, m_defaultValue);
257 return m_value;
258 }
259
updateValue()260 void updateValue()
261 {
262 RawPropertyData rawData = {0};
263 if (!getRawValue(rawData.data(), rawData.size())) {
264 m_value = m_defaultValue;
265 return;
266 }
267 m_value = m_converter(rawData, m_defaultValue);
268 }
269
270 int m_handle = -1;
271 int m_commit = -1;
272 long long m_sysCommit = -1;
273 T m_value;
274 const T m_defaultValue;
275 const PropType m_propType;
276 std::string m_key;
277 DataConverter m_converter;
278 };
279
280 using SwitchCache = CacheData<bool>;
281 using LogLevelCache = CacheData<uint16_t>;
282
TextToBool(const RawPropertyData & data,bool defaultVal)283 static bool TextToBool(const RawPropertyData& data, bool defaultVal)
284 {
285 if (!strcmp(data.data(), "true")) {
286 return true;
287 } else if (!strcmp(data.data(), "false")) {
288 return false;
289 }
290 return defaultVal;
291 }
292
TextToLogLevel(const RawPropertyData & data,uint16_t defaultVal)293 static uint16_t TextToLogLevel(const RawPropertyData& data, uint16_t defaultVal)
294 {
295 uint16_t level = PrettyStr2LogLevel(data.data());
296 if (level == LOG_LEVEL_MIN) {
297 level = defaultVal;
298 }
299 return level;
300 }
301
IsPrivateSwitchOn()302 bool IsPrivateSwitchOn()
303 {
304 static auto *switchCache = new SwitchCache(TextToBool, true, PropType::PROP_PRIVATE);
305 if (switchCache == nullptr) {
306 return false;
307 }
308 return switchCache->getValue();
309 }
310
IsOnceDebugOn()311 bool IsOnceDebugOn()
312 {
313 static auto *switchCache = new SwitchCache(TextToBool, false, PropType::PROP_ONCE_DEBUG);
314 if (switchCache == nullptr) {
315 return false;
316 }
317 return switchCache->getValue();
318 }
319
IsPersistDebugOn()320 bool IsPersistDebugOn()
321 {
322 static auto *switchCache = new SwitchCache(TextToBool, false, PropType::PROP_PERSIST_DEBUG);
323 if (switchCache == nullptr) {
324 return false;
325 }
326 return switchCache->getValue();
327 }
328
IsDebugOn()329 bool IsDebugOn()
330 {
331 return IsOnceDebugOn() || IsPersistDebugOn();
332 }
333
IsDebuggableHap()334 bool IsDebuggableHap()
335 {
336 const char *path = getenv(HAP_DEBUGGABLE);
337 if ((path == nullptr) || (strcmp(path, "true") != 0)) {
338 return false;
339 }
340 return true;
341 }
342
GetGlobalLogLevel()343 uint16_t GetGlobalLogLevel()
344 {
345 uint16_t globalLevel = GetGlobalLevel();
346 if (globalLevel == LOG_LEVEL_MIN) {
347 globalLevel = GetPersistGlobalLevel();
348 }
349 return globalLevel;
350 }
351
GetGlobalLevel()352 uint16_t GetGlobalLevel()
353 {
354 static auto *logLevelCache = new LogLevelCache(TextToLogLevel, LOG_LEVEL_MIN, PropType::PROP_GLOBAL_LOG_LEVEL);
355 return logLevelCache->getValue();
356 }
357
GetPersistGlobalLevel()358 uint16_t GetPersistGlobalLevel()
359 {
360 static auto *logLevelCache =
361 new LogLevelCache(TextToLogLevel, LOG_LEVEL_MIN, PropType::PROP_PERSIST_GLOBAL_LOG_LEVEL);
362 return logLevelCache->getValue();
363 }
364
GetLevel(std::unordered_map<uint32_t,LogLevelCache * > * map,uint32_t key,PropType propType)365 uint16_t GetLevel(std::unordered_map<uint32_t, LogLevelCache*>* map, uint32_t key, PropType propType)
366 {
367 static shared_timed_mutex* levelMtx = new shared_timed_mutex;
368 std::decay<decltype(*map)>::type::iterator it;
369 {
370 ReadLock lock(*levelMtx);
371 it = map->find(key);
372 if (it != map->end()) {
373 LogLevelCache* levelCache = it->second;
374 return levelCache->getValue();
375 }
376 }
377 InsertLock lock(*levelMtx);
378 it = map->find(key); // secured for two thread went across above condition
379 if (it == map->end()) {
380 LogLevelCache* levelCache = new LogLevelCache(TextToLogLevel, LOG_LEVEL_MIN, propType, Uint2HexStr(key));
381 auto result = map->insert({ key, levelCache });
382 if (!result.second) {
383 delete levelCache;
384 return LOG_LEVEL_MIN;
385 }
386 it = result.first;
387 }
388 LogLevelCache* levelCache = it->second;
389 return levelCache->getValue();
390 }
391
GetLevel(std::unordered_map<std::string,LogLevelCache * > * map,const string & key,PropType propType)392 uint16_t GetLevel(std::unordered_map<std::string, LogLevelCache*>* map, const string& key, PropType propType)
393 {
394 static shared_timed_mutex* levelMtx = new shared_timed_mutex;
395 std::decay<decltype(*map)>::type::iterator it;
396 {
397 ReadLock lock(*levelMtx);
398 it = map->find(key);
399 if (it != map->end()) {
400 LogLevelCache* levelCache = it->second;
401 return levelCache->getValue();
402 }
403 }
404 InsertLock lock(*levelMtx);
405 it = map->find(key); // secured for two thread went across above condition
406 if (it == map->end()) {
407 LogLevelCache* levelCache = new LogLevelCache(TextToLogLevel, LOG_LEVEL_MIN, propType, key);
408 auto result = map->insert({ key, levelCache });
409 if (!result.second) {
410 delete levelCache;
411 return LOG_LEVEL_MIN;
412 }
413 it = result.first;
414 }
415 LogLevelCache* levelCache = it->second;
416 return levelCache->getValue();
417 }
418
GetDomainLevel(uint32_t domain)419 uint16_t GetDomainLevel(uint32_t domain)
420 {
421 static auto *domainMap = new std::unordered_map<uint32_t, LogLevelCache*>();
422 return GetLevel(domainMap, domain, PropType::PROP_DOMAIN_LOG_LEVEL);
423 }
424
GetPersistDomainLevel(uint32_t domain)425 uint16_t GetPersistDomainLevel(uint32_t domain)
426 {
427 static auto *persistDomainMap = new std::unordered_map<uint32_t, LogLevelCache*>();
428 return GetLevel(persistDomainMap, domain, PropType::PROP_PERSIST_DOMAIN_LOG_LEVEL);
429 }
430
GetTagLevel(const std::string & tag)431 uint16_t GetTagLevel(const std::string& tag)
432 {
433 static auto *tagMap = new std::unordered_map<std::string, LogLevelCache*>();
434 return GetLevel(tagMap, tag, PropType::PROP_TAG_LOG_LEVEL);
435 }
436
GetPersistTagLevel(const std::string & tag)437 uint16_t GetPersistTagLevel(const std::string& tag)
438 {
439 static auto *persistTagMap = new std::unordered_map<std::string, LogLevelCache*>();
440 return GetLevel(persistTagMap, tag, PropType::PROP_PERSIST_TAG_LOG_LEVEL);
441 }
442
443
IsProcessSwitchOn()444 bool IsProcessSwitchOn()
445 {
446 static auto *switchCache = new SwitchCache(TextToBool, false, PropType::PROP_PROCESS_FLOWCTRL);
447 if (switchCache == nullptr) {
448 return false;
449 }
450 return switchCache->getValue();
451 }
452
IsDomainSwitchOn()453 bool IsDomainSwitchOn()
454 {
455 static auto *switchCache = new SwitchCache(TextToBool, false, PropType::PROP_DOMAIN_FLOWCTRL);
456 if (switchCache == nullptr) {
457 return false;
458 }
459 return switchCache->getValue();
460 }
461
IsKmsgSwitchOn()462 bool IsKmsgSwitchOn()
463 {
464 RawPropertyData rawData;
465 int ret = PropertyGet(GetPropertyName(PropType::PROP_KMSG), rawData.data(), HILOG_PROP_VALUE_MAX);
466 if (ret == RET_FAIL) {
467 return false;
468 }
469 return TextToBool(rawData, false);
470 }
471
GetBufferSizePropName(uint16_t type,bool persist)472 static string GetBufferSizePropName(uint16_t type, bool persist)
473 {
474 string name = persist ? "persist.sys." : "";
475 string suffix;
476
477 if (type >= LOG_TYPE_MAX) {
478 suffix = "global";
479 } else {
480 suffix = LogType2Str(type);
481 }
482
483 return name + GetPropertyName(PropType::PROP_BUFFER_SIZE) + suffix;
484 }
485
GetBufferSize(uint16_t type,bool persist)486 size_t GetBufferSize(uint16_t type, bool persist)
487 {
488 char value[HILOG_PROP_VALUE_MAX] = {0};
489
490 if (type > LOG_TYPE_MAX || type < LOG_TYPE_MIN) {
491 return 0;
492 }
493
494 int ret = PropertyGet(GetBufferSizePropName(type, persist), value, HILOG_PROP_VALUE_MAX);
495 if (ret == RET_FAIL || value[0] == 0) {
496 return 0;
497 }
498
499 return std::stoi(value);
500 }
501
IsStatsEnable()502 bool IsStatsEnable()
503 {
504 RawPropertyData rawData;
505 int ret = PropertyGet(GetPropertyName(PropType::PROP_STATS_ENABLE), rawData.data(), HILOG_PROP_VALUE_MAX);
506 if (ret == RET_FAIL) {
507 return false;
508 }
509 return TextToBool(rawData, false);
510 }
511
IsTagStatsEnable()512 bool IsTagStatsEnable()
513 {
514 RawPropertyData rawData;
515 int ret = PropertyGet(GetPropertyName(PropType::PROP_STATS_TAG_ENABLE), rawData.data(), HILOG_PROP_VALUE_MAX);
516 if (ret == RET_FAIL) {
517 return false;
518 }
519 return TextToBool(rawData, false);
520 }
521
GetProcessQuota(const string & proc)522 int GetProcessQuota(const string& proc)
523 {
524 char value[HILOG_PROP_VALUE_MAX] = {0};
525 string prop = GetPropertyName(PropType::PROP_PROC_QUOTA) + proc;
526
527 int ret = PropertyGet(prop, value, HILOG_PROP_VALUE_MAX);
528 if (ret == RET_FAIL || value[0] == 0) {
529 return DEFAULT_QUOTA;
530 }
531 return std::stoi(value);
532 }
533
GetDomainQuota(uint32_t domain)534 int GetDomainQuota(uint32_t domain)
535 {
536 char value[HILOG_PROP_VALUE_MAX] = {0};
537 string prop = GetPropertyName(PropType::PROP_DOMAIN_QUOTA) + Uint2HexStr(domain);
538
539 int ret = PropertyGet(prop, value, HILOG_PROP_VALUE_MAX);
540 if (ret == RET_FAIL || value[0] == 0) {
541 return DEFAULT_QUOTA;
542 }
543 return std::stoi(value);
544 }
545
SetBoolValue(PropType type,bool val)546 static int SetBoolValue(PropType type, bool val)
547 {
548 string key = GetPropertyName(type);
549 return key == "" ? RET_FAIL : (PropertySet(key, val ? "true" : "false"));
550 }
551
SetLevel(PropType type,const string & suffix,uint16_t lvl)552 static int SetLevel(PropType type, const string& suffix, uint16_t lvl)
553 {
554 string key = GetPropertyName(type) + suffix;
555 return key == "" ? RET_FAIL : (PropertySet(key, LogLevel2ShortStr(lvl)));
556 }
557
SetPrivateSwitchOn(bool on)558 int SetPrivateSwitchOn(bool on)
559 {
560 return SetBoolValue(PropType::PROP_PRIVATE, on);
561 }
562
SetOnceDebugOn(bool on)563 int SetOnceDebugOn(bool on)
564 {
565 return SetBoolValue(PropType::PROP_ONCE_DEBUG, on);
566 }
567
SetPersistDebugOn(bool on)568 int SetPersistDebugOn(bool on)
569 {
570 return SetBoolValue(PropType::PROP_PERSIST_DEBUG, on);
571 }
572
SetGlobalLevel(uint16_t lvl)573 int SetGlobalLevel(uint16_t lvl)
574 {
575 return SetLevel(PropType::PROP_GLOBAL_LOG_LEVEL, "", lvl);
576 }
577
SetPersistGlobalLevel(uint16_t lvl)578 int SetPersistGlobalLevel(uint16_t lvl)
579 {
580 return SetLevel(PropType::PROP_PERSIST_GLOBAL_LOG_LEVEL, "", lvl);
581 }
582
SetTagLevel(const std::string & tag,uint16_t lvl)583 int SetTagLevel(const std::string& tag, uint16_t lvl)
584 {
585 return SetLevel(PropType::PROP_TAG_LOG_LEVEL, tag, lvl);
586 }
587
SetPersistTagLevel(const std::string & tag,uint16_t lvl)588 int SetPersistTagLevel(const std::string& tag, uint16_t lvl)
589 {
590 return SetLevel(PropType::PROP_PERSIST_TAG_LOG_LEVEL, tag, lvl);
591 }
592
SetDomainLevel(uint32_t domain,uint16_t lvl)593 int SetDomainLevel(uint32_t domain, uint16_t lvl)
594 {
595 return SetLevel(PropType::PROP_DOMAIN_LOG_LEVEL, Uint2HexStr(domain), lvl);
596 }
597
SetPersistDomainLevel(uint32_t domain,uint16_t lvl)598 int SetPersistDomainLevel(uint32_t domain, uint16_t lvl)
599 {
600 return SetLevel(PropType::PROP_PERSIST_DOMAIN_LOG_LEVEL, Uint2HexStr(domain), lvl);
601 }
602
SetProcessSwitchOn(bool on)603 int SetProcessSwitchOn(bool on)
604 {
605 return SetBoolValue(PropType::PROP_PROCESS_FLOWCTRL, on);
606 }
607
SetDomainSwitchOn(bool on)608 int SetDomainSwitchOn(bool on)
609 {
610 return SetBoolValue(PropType::PROP_DOMAIN_FLOWCTRL, on);
611 }
612
SetKmsgSwitchOn(bool on)613 int SetKmsgSwitchOn(bool on)
614 {
615 return SetBoolValue(PropType::PROP_KMSG, on);
616 }
617
SetBufferSize(uint16_t type,bool persist,size_t size)618 int SetBufferSize(uint16_t type, bool persist, size_t size)
619 {
620 if (type > LOG_TYPE_MAX || type < LOG_TYPE_MIN) {
621 return RET_FAIL;
622 }
623 return PropertySet(GetBufferSizePropName(type, persist), to_string(size));
624 }
625 } // namespace HiviewDFX
626 } // namespace OHOS