785
788
StopBenchmarkTiming();
787
790
BENCHMARK(BM_lookupEventFormat);
793
* Measure the time it takes for android_lookupEventTagNum plus above
795
static void BM_lookupEventTagNum(int iters) {
799
std::unordered_set<uint32_t>::const_iterator it = set.begin();
801
for (int i = 0; i < iters; ++i) {
803
const char* name = android_lookupEventTag_len(map, &len, (*it));
804
std::string Name(name, len);
805
const char* format = android_lookupEventFormat_len(map, &len, (*it));
806
std::string Format(format, len);
807
StartBenchmarkTiming();
808
android_lookupEventTagNum(map, Name.c_str(), Format.c_str(),
809
ANDROID_LOG_UNKNOWN);
810
StopBenchmarkTiming();
812
if (it == set.end()) it = set.begin();
816
BENCHMARK(BM_lookupEventTagNum);
818
// Must be functionally identical to liblog internal __send_log_msg.
819
static void send_to_control(char *buf, size_t len)
821
int sock = socket_local_client("logd",
822
ANDROID_SOCKET_NAMESPACE_RESERVED,
824
if (sock < 0) return;
825
size_t writeLen = strlen(buf) + 1;
827
ssize_t ret = TEMP_FAILURE_RETRY(write(sock, buf, writeLen));
832
while ((ret = read(sock, buf, len)) > 0) {
833
if (((size_t)ret == len) || (len < PAGE_SIZE)) {
845
ret = poll(&p, 1, 20);
846
if ((ret <= 0) || !(p.revents & POLLIN)) {
853
static void BM_lookupEventTagNum_logd_new(int iters) {
854
fprintf(stderr, "WARNING: "
855
"This test can cause logd to grow in size and hit DOS limiter\n");
857
static const char empty_event_log_tags[] = "# content owned by logd\n";
858
static const char dev_event_log_tags_path[] = "/dev/event-log-tags";
859
std::string dev_event_log_tags;
860
if (android::base::ReadFileToString(dev_event_log_tags_path,
861
&dev_event_log_tags) &&
862
(dev_event_log_tags.length() == 0)) {
863
dev_event_log_tags = empty_event_log_tags;
865
static const char data_event_log_tags_path[] = "/data/misc/logd/event-log-tags";
866
std::string data_event_log_tags;
867
if (android::base::ReadFileToString(data_event_log_tags_path,
868
&data_event_log_tags) &&
869
(data_event_log_tags.length() == 0)) {
870
data_event_log_tags = empty_event_log_tags;
873
for (int i = 0; i < iters; ++i) {
875
memset(buffer, 0, sizeof(buffer));
876
log_time now(CLOCK_MONOTONIC);
878
snprintf(name, sizeof(name), "a%" PRIu64, now.nsec());
879
snprintf(buffer, sizeof(buffer),
880
"getEventTag name=%s format=\"(new|1)\"", name);
881
StartBenchmarkTiming();
882
send_to_control(buffer, sizeof(buffer));
883
StopBenchmarkTiming();
886
// Restore copies (logd still know about them, until crash or reboot)
887
if (dev_event_log_tags.length() &&
888
!android::base::WriteStringToFile(dev_event_log_tags,
889
dev_event_log_tags_path)) {
890
fprintf(stderr, "WARNING: "
891
"failed to restore %s\n", dev_event_log_tags_path);
893
if (data_event_log_tags.length() &&
894
!android::base::WriteStringToFile(data_event_log_tags,
895
data_event_log_tags_path)) {
896
fprintf(stderr, "WARNING: "
897
"failed to restore %s\n", data_event_log_tags_path);
899
fprintf(stderr, "WARNING: "
900
"Restarting logd to make it forget what we just did\n");
901
system("stop logd ; start logd");
903
BENCHMARK(BM_lookupEventTagNum_logd_new);
905
static void BM_lookupEventTagNum_logd_existing(int iters) {
908
std::unordered_set<uint32_t>::const_iterator it = set.begin();
910
for (int i = 0; i < iters; ++i) {
912
const char* name = android_lookupEventTag_len(map, &len, (*it));
913
std::string Name(name, len);
914
const char* format = android_lookupEventFormat_len(map, &len, (*it));
915
std::string Format(format, len);
918
snprintf(buffer, sizeof(buffer),
919
"getEventTag name=%s format=\"%s\"",
920
Name.c_str(), Format.c_str());
922
StartBenchmarkTiming();
923
send_to_control(buffer, sizeof(buffer));
924
StopBenchmarkTiming();
926
if (it == set.end()) it = set.begin();
929
BENCHMARK(BM_lookupEventTagNum_logd_existing);