Skip to content
Snippets Groups Projects
Commit 08bbef86 authored by Florian Fischer's avatar Florian Fischer
Browse files

[fsearch] add global semaphore to limit the amount of concurrent requests

parent 11aa4a38
Branches
Tags
No related merge requests found
......@@ -15,6 +15,7 @@
#include "CountingPrivateSemaphore.hpp"
#include "Fiber.hpp"
#include "Runtime.hpp"
#include "Semaphore.hpp"
#include "emper.hpp"
#include "io.hpp"
......@@ -25,7 +26,13 @@ namespace fs = std::filesystem;
const char* needle;
size_t needle_len;
emper::Semaphore* max_running;
void search(const std::string& path) {
if (max_running) {
max_running->acquire();
}
int fd = emper::io::openAndWait(path.c_str(), O_RDONLY);
if (fd < 0) {
DIE_MSG_ERRNO("open failed");
......@@ -50,6 +57,10 @@ void search(const std::string& path) {
}
out:
if (max_running) {
max_running->release();
}
emper::io::closeAndForget(fd);
}
......@@ -67,8 +78,12 @@ void walk_dir() {
auto main(int argc, char* argv[]) -> int {
if (argc < 2) {
std::cerr << "Usage: " << argv[0] << " <needle>" << std::endl;
return EXIT_FAILURE;
std::cerr << "Usage: " << argv[0] << " <needle> [max fibers]" << std::endl;
return EXIT_SUCCESS;
}
if (argc == 3) {
max_running = new emper::Semaphore(std::stoi(argv[2]));
}
needle = argv[1];
......@@ -80,4 +95,5 @@ auto main(int argc, char* argv[]) -> int {
runtime.scheduleFromAnywhere(*dirWalker);
runtime.waitUntilFinished();
return EXIT_SUCCESS;
}
......@@ -17,6 +17,9 @@ class Semaphore {
std::mutex mutex;
public:
Semaphore() = default;
Semaphore(unsigned int count) : count(count){};
auto acquire() -> bool {
bool blocked;
mutex.lock();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment