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); | |
| }
 |