QDebug debug_helper(quint64 ptr, DebugLevel level, QtMsgType type) { Q_UNUSED(ptr); DebugData *d = debugData(); if (!d->inited && ObjectGenerator::isInited()) { d->inited = true; Config cfg; cfg.beginGroup(QLatin1String("debug")); d->level = cfg.value(QLatin1String("level"), DebugInfo); } if (d->level > level) return QDebug(devnull()); return QDebug(type) << qPrintable(QTime::currentTime().toString(QLatin1String("[hh:mm:ss]"))); // const QMetaObject *meta = reinterpret_cast<const QMetaObject*>(ptr); // const DebugAreaData *data = meta ? debugAreaMap()->value(meta, 0) : coreData(); // if (!data) { // DebugAreaData *d = new DebugAreaData(); // Config cfg; // cfg.beginGroup("debug"); // QString nameStr = QLatin1String(meta->className()); // cfg.beginGroup(nameStr); // d->name = "[" + cfg.value("name", nameStr).toLocal8Bit() + "]:"; // d->level = cfg.value("level", DebugInfo); // data = d; // } // if (data->level <= level) // return (QDebug(type) << data->name); // else // return QDebug(devnull()); }
int main(int __unused argc, char __unused *argv[]) { struct shared_info *info; pid_t pid; int fd, i; printf("1..15\n"); /* We better start up with fd's 0, 1, and 2 open. */ fd = devnull(); if (fd != 3) fail("open", "bad descriptor %d", fd); ok("open"); /* Make sure highest_fd() works. */ fd = highest_fd(); if (fd != 3) fail("highest_fd", "bad descriptor %d", fd); ok("highest_fd"); /* Try to use closefrom() for just closing fd 3. */ closefrom(3); fd = highest_fd(); if (fd != 2) fail("closefrom", "highest fd %d", fd); ok("closefrom"); /* Eat up 16 descriptors. */ for (i = 0; i < 16; i++) (void)devnull(); fd = highest_fd(); if (fd != 18) fail("open 16", "highest fd %d", fd); ok("open 16"); /* Close half of them. */ closefrom(11); fd = highest_fd(); if (fd != 10) fail("closefrom", "highest fd %d", fd); ok("closefrom"); /* Explicitly close descriptors 6 and 8 to create holes. */ if (close(6) < 0 || close(8) < 0) fail_err("close2 "); ok("close 2"); /* Verify that close on 6 and 8 fails with EBADF. */ if (close(6) == 0) fail("close(6)", "did not fail"); if (errno != EBADF) fail_err("close(6)"); ok("close(6)"); if (close(8) == 0) fail("close(8)", "did not fail"); if (errno != EBADF) fail_err("close(8)"); ok("close(8)"); /* Close from 4 on. */ closefrom(4); fd = highest_fd(); if (fd != 3) fail("closefrom", "highest fd %d", fd); ok("closefrom"); /* Allocate a small SHM region for IPC with our child. */ info = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0); if (info == MAP_FAILED) fail_err("mmap"); ok("mmap"); /* Fork a child process to test closefrom(0). */ pid = fork(); if (pid < 0) fail_err("fork"); if (pid == 0) { /* Child. */ closefrom(0); fd = highest_fd(); if (fd >= 0) cfail(info, "closefrom(0)", "highest fd %d", fd); c*k(info, "closefrom(0)"); } if (wait(NULL) < 0) fail_err("wait"); if (info->failed) fail(info->tag, "%s", info->message); ok(info->tag); /* Fork a child process to test closefrom(-1). */ pid = fork(); if (pid < 0) fail_err("fork"); if (pid == 0) { /* Child. */ closefrom(-1); fd = highest_fd(); if (fd >= 0) cfail(info, "closefrom(-1)", "highest fd %d", fd); c*k(info, "closefrom(-1)"); } if (wait(NULL) < 0) fail_err("wait"); if (info->failed) fail(info->tag, "%s", info->message); ok(info->tag); /* Dup stdout to 6. */ if (dup2(1, 6) < 0) fail_err("dup2"); fd = highest_fd(); if (fd != 6) fail("dup2", "highest fd %d", fd); ok("dup2"); /* Do a closefrom() starting in a hole. */ closefrom(4); fd = highest_fd(); if (fd != 3) fail("closefrom", "highest fd %d", fd); ok("closefrom"); /* Do a closefrom() beyond our highest open fd. */ closefrom(32); fd = highest_fd(); if (fd != 3) fail("closefrom", "highest fd %d", fd); ok("closefrom"); return (0); }
int main(int argc, char *argv[]) { struct stat putfd_1_stat, putfd_2_stat, getfd_1_stat, getfd_2_stat; int fd[2], putfd_1, putfd_2, getfd_1, getfd_2; const char *test; /* * First test: put a temporary file into a UNIX domain socket, then * take it out and make sure it's the same file. First time around, * don't close the reference after sending. */ test = "test1-simplesendfd"; printf("beginning %s\n", test); domainsocketpair(test, fd); tempfile(test, &putfd_1); dofstat(test, putfd_1, &putfd_1_stat); sendfd(test, fd[0], putfd_1); recvfd(test, fd[1], &getfd_1); dofstat(test, getfd_1, &getfd_1_stat); samefile(test, &putfd_1_stat, &getfd_1_stat); close(putfd_1); close(getfd_1); closesocketpair(fd); printf("%s passed\n", test); /* * Second test: same as first, only close the file reference after * sending, so that the only reference is the descriptor in the UNIX * domain socket buffer. */ test = "test2-sendandclose"; printf("beginning %s\n", test); domainsocketpair(test, fd); tempfile(test, &putfd_1); dofstat(test, putfd_1, &putfd_1_stat); sendfd(test, fd[0], putfd_1); close(putfd_1); recvfd(test, fd[1], &getfd_1); dofstat(test, getfd_1, &getfd_1_stat); samefile(test, &putfd_1_stat, &getfd_1_stat); close(getfd_1); closesocketpair(fd); printf("%s passed\n", test); /* * Third test: put a temporary file into a UNIX domain socket, then * close both endpoints causing garbage collection to kick off. */ test = "test3-sendandcancel"; printf("beginning %s\n", test); domainsocketpair(test, fd); tempfile(test, &putfd_1); sendfd(test, fd[0], putfd_1); close(putfd_1); closesocketpair(fd); printf("%s passed\n", test); /* * Send two files. Then receive them. Make sure they are returned * in the right order, and both get there. */ test = "test4-twofile"; printf("beginning %s\n", test); domainsocketpair(test, fd); tempfile(test, &putfd_1); tempfile(test, &putfd_2); dofstat(test, putfd_1, &putfd_1_stat); dofstat(test, putfd_2, &putfd_2_stat); sendfd(test, fd[0], putfd_1); sendfd(test, fd[0], putfd_2); close(putfd_1); close(putfd_2); recvfd(test, fd[1], &getfd_1); recvfd(test, fd[1], &getfd_2); dofstat(test, getfd_1, &getfd_1_stat); dofstat(test, getfd_2, &getfd_2_stat); samefile(test, &putfd_1_stat, &getfd_1_stat); samefile(test, &putfd_2_stat, &getfd_2_stat); close(getfd_1); close(getfd_2); closesocketpair(fd); printf("%s passed\n", test); /* * Big bundling test. Send an endpoint of the UNIX domain socket * over itself, closing the door behind it. */ test = "test5-bundle"; printf("beginning %s\n", test); domainsocketpair(test, fd); sendfd(test, fd[0], fd[0]); close(fd[0]); recvfd(test, fd[1], &getfd_1); close(getfd_1); close(fd[1]); printf("%s passed\n", test); /* * Big bundling test part two: Send an endpoint of the UNIX domain * socket over itself, close the door behind it, and never remove it * from the other end. */ test = "test6-bundlecancel"; printf("beginning %s\n", test); domainsocketpair(test, fd); sendfd(test, fd[0], fd[0]); sendfd(test, fd[1], fd[0]); closesocketpair(fd); printf("%s passed\n", test); /* * Test for PR 151758: Send an character device over the UNIX * domain socket and then close both sockets to orphan the * device. */ test = "test7-devfsorphan"; printf("beginning %s\n", test); domainsocketpair(test, fd); devnull(test, &putfd_1); sendfd(test, fd[0], putfd_1); close(putfd_1); closesocketpair(fd); printf("%s passed\n", test); return (0); }
int main(int argc, char ** argv) { std::cerr << std::fixed << std::setprecision(3); std::ofstream devnull("/dev/null"); DB::ReadBufferFromFileDescriptor in(STDIN_FILENO); size_t n = atoi(argv[1]); size_t elems_show = 1; using Vec = std::vector<std::string>; using Set = std::unordered_map<std::string, int>; using RefsSet = std::unordered_map<StringRef, int, StringRefHash>; using DenseSet = google::dense_hash_map<std::string, int>; using RefsDenseSet = google::dense_hash_map<StringRef, int, StringRefHash>; using RefsHashMap = HashMap<StringRef, int, StringRefHash>; Vec vec; vec.reserve(n); { Stopwatch watch; std::string s; for (size_t i = 0; i < n && !in.eof(); ++i) { DB::readEscapedString(s, in); DB::assertChar('\n', in); vec.push_back(s); } std::cerr << "Read and inserted into vector in " << watch.elapsedSeconds() << " sec, " << vec.size() / watch.elapsedSeconds() << " rows/sec., " << in.count() / watch.elapsedSeconds() / 1000000 << " MB/sec." << std::endl; } { DB::Arena pool; Stopwatch watch; const char * res = nullptr; for (Vec::iterator it = vec.begin(); it != vec.end(); ++it) { const char * tmp = pool.insert(it->data(), it->size()); if (it == vec.begin()) res = tmp; } std::cerr << "Inserted into pool in " << watch.elapsedSeconds() << " sec, " << vec.size() / watch.elapsedSeconds() << " rows/sec., " << in.count() / watch.elapsedSeconds() / 1000000 << " MB/sec." << std::endl; devnull.write(res, 100); devnull << std::endl; } { Set set; Stopwatch watch; for (Vec::iterator it = vec.begin(); it != vec.end(); ++it) set[*it] = 0; std::cerr << "Inserted into std::unordered_map in " << watch.elapsedSeconds() << " sec, " << vec.size() / watch.elapsedSeconds() << " rows/sec., " << in.count() / watch.elapsedSeconds() / 1000000 << " MB/sec." << std::endl; size_t i = 0; for (Set::const_iterator it = set.begin(); i < elems_show && it != set.end(); ++it, ++i) { devnull << it->first; devnull << std::endl; } } { RefsSet set; Stopwatch watch; for (Vec::iterator it = vec.begin(); it != vec.end(); ++it) set[StringRef(*it)] = 0; std::cerr << "Inserted refs into std::unordered_map in " << watch.elapsedSeconds() << " sec, " << vec.size() / watch.elapsedSeconds() << " rows/sec., " << in.count() / watch.elapsedSeconds() / 1000000 << " MB/sec." << std::endl; size_t i = 0; for (RefsSet::const_iterator it = set.begin(); i < elems_show && it != set.end(); ++it, ++i) { devnull.write(it->first.data, it->first.size); devnull << std::endl; } } { DB::Arena pool; RefsSet set; Stopwatch watch; for (Vec::iterator it = vec.begin(); it != vec.end(); ++it) set[StringRef(pool.insert(it->data(), it->size()), it->size())] = 0; std::cerr << "Inserted into pool and refs into std::unordered_map in " << watch.elapsedSeconds() << " sec, " << vec.size() / watch.elapsedSeconds() << " rows/sec., " << in.count() / watch.elapsedSeconds() / 1000000 << " MB/sec." << std::endl; size_t i = 0; for (RefsSet::const_iterator it = set.begin(); i < elems_show && it != set.end(); ++it, ++i) { devnull.write(it->first.data, it->first.size); devnull << std::endl; } } { DenseSet set; set.set_empty_key(DenseSet::key_type()); Stopwatch watch; for (Vec::iterator it = vec.begin(); it != vec.end(); ++it) set[*it] = 0; std::cerr << "Inserted into google::dense_hash_map in " << watch.elapsedSeconds() << " sec, " << vec.size() / watch.elapsedSeconds() << " rows/sec., " << in.count() / watch.elapsedSeconds() / 1000000 << " MB/sec." << std::endl; size_t i = 0; for (DenseSet::const_iterator it = set.begin(); i < elems_show && it != set.end(); ++it, ++i) { devnull << it->first; devnull << std::endl; } } { RefsDenseSet set; set.set_empty_key(RefsDenseSet::key_type()); Stopwatch watch; for (Vec::iterator it = vec.begin(); it != vec.end(); ++it) set[StringRef(it->data(), it->size())] = 0; std::cerr << "Inserted refs into google::dense_hash_map in " << watch.elapsedSeconds() << " sec, " << vec.size() / watch.elapsedSeconds() << " rows/sec., " << in.count() / watch.elapsedSeconds() / 1000000 << " MB/sec." << std::endl; size_t i = 0; for (RefsDenseSet::const_iterator it = set.begin(); i < elems_show && it != set.end(); ++it, ++i) { devnull.write(it->first.data, it->first.size); devnull << std::endl; } } { DB::Arena pool; RefsDenseSet set; set.set_empty_key(RefsDenseSet::key_type()); Stopwatch watch; for (Vec::iterator it = vec.begin(); it != vec.end(); ++it) set[StringRef(pool.insert(it->data(), it->size()), it->size())] = 0; std::cerr << "Inserted into pool and refs into google::dense_hash_map in " << watch.elapsedSeconds() << " sec, " << vec.size() / watch.elapsedSeconds() << " rows/sec., " << in.count() / watch.elapsedSeconds() / 1000000 << " MB/sec." << std::endl; size_t i = 0; for (RefsDenseSet::const_iterator it = set.begin(); i < elems_show && it != set.end(); ++it, ++i) { devnull.write(it->first.data, it->first.size); devnull << std::endl; } } { RefsHashMap set; Stopwatch watch; for (Vec::iterator it = vec.begin(); it != vec.end(); ++it) { RefsHashMap::iterator inserted_it; bool inserted; set.emplace(StringRef(*it), inserted_it, inserted); } std::cerr << "Inserted refs into HashMap in " << watch.elapsedSeconds() << " sec, " << vec.size() / watch.elapsedSeconds() << " rows/sec., " << in.count() / watch.elapsedSeconds() / 1000000 << " MB/sec." << std::endl; size_t i = 0; for (RefsHashMap::const_iterator it = set.begin(); i < elems_show && it != set.end(); ++it, ++i) { devnull.write(it->first.data, it->first.size); devnull << std::endl; } //std::cerr << set.size() << ", " << set.getCollisions() << std::endl; } { DB::Arena pool; RefsHashMap set; Stopwatch watch; for (Vec::iterator it = vec.begin(); it != vec.end(); ++it) { RefsHashMap::iterator inserted_it; bool inserted; set.emplace(StringRef(pool.insert(it->data(), it->size()), it->size()), inserted_it, inserted); } std::cerr << "Inserted into pool and refs into HashMap in " << watch.elapsedSeconds() << " sec, " << vec.size() / watch.elapsedSeconds() << " rows/sec., " << in.count() / watch.elapsedSeconds() / 1000000 << " MB/sec." << std::endl; size_t i = 0; for (RefsHashMap::const_iterator it = set.begin(); i < elems_show && it != set.end(); ++it, ++i) { devnull.write(it->first.data, it->first.size); devnull << std::endl; } } return 0; }