mirror of https://github.com/trapexit/mergerfs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.1 KiB
65 lines
1.1 KiB
#include "maintenance_thread.hpp"
|
|
|
|
#include "fmt/core.h"
|
|
|
|
#include <cassert>
|
|
#include <mutex>
|
|
#include <vector>
|
|
|
|
#include <pthread.h>
|
|
#include <unistd.h>
|
|
|
|
|
|
pthread_t g_thread;
|
|
std::vector<std::function<void(int)>> g_funcs;
|
|
std::mutex g_mutex;
|
|
|
|
static
|
|
void*
|
|
_thread_loop(void *)
|
|
{
|
|
int count;
|
|
|
|
pthread_setname_np(pthread_self(),"fuse.maint");
|
|
|
|
count = 0;
|
|
while(true)
|
|
{
|
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
|
|
{
|
|
std::lock_guard<std::mutex> lg(g_mutex);
|
|
for(auto &func : g_funcs)
|
|
func(count);
|
|
}
|
|
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
|
|
|
|
count++;
|
|
::sleep(60);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void
|
|
MaintenanceThread::setup()
|
|
{
|
|
int rv;
|
|
|
|
rv = pthread_create(&g_thread,NULL,_thread_loop,NULL);
|
|
assert((rv == 0) && "pthread_create failed");
|
|
}
|
|
|
|
void
|
|
MaintenanceThread::push_job(const std::function<void(int)> &func_)
|
|
{
|
|
std::lock_guard<std::mutex> lg(g_mutex);
|
|
|
|
g_funcs.emplace_back(func_);
|
|
}
|
|
|
|
void
|
|
MaintenanceThread::stop()
|
|
{
|
|
pthread_cancel(g_thread);
|
|
pthread_join(g_thread,NULL);
|
|
}
|