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