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.
		
		
		
		
		
			
		
			
				
					
					
						
							245 lines
						
					
					
						
							3.8 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							245 lines
						
					
					
						
							3.8 KiB
						
					
					
				| /* | |
|   ISC License | |
|  | |
|   Copyright (c) 2020, Antonio SJ Musumeci <trapexit@spawn.link> | |
|  | |
|   Permission to use, copy, modify, and/or distribute this software for any | |
|   purpose with or without fee is hereby granted, provided that the above | |
|   copyright notice and this permission notice appear in all copies. | |
|  | |
|   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
|   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
|   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
|   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
|   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
|   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
|   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
| */ | |
| 
 | |
| #pragma once | |
|  | |
| #include "fmp.h" | |
|  | |
| #include "mutex.hpp" | |
|  | |
| #include <pthread.h> | |
|  | |
| 
 | |
| typedef struct lfmp_t lfmp_t; | |
| struct lfmp_t | |
| { | |
|   fmp_t fmp; | |
|   pthread_mutex_t lock; | |
| }; | |
| 
 | |
| 
 | |
| static | |
| inline | |
| void | |
| lfmp_init(lfmp_t         *lfmp_, | |
|           const uint64_t  obj_size_, | |
|           const uint64_t  page_multiple_) | |
| { | |
|   fmp_init(&lfmp_->fmp,obj_size_,page_multiple_); | |
|   mutex_init(&lfmp_->lock); | |
| } | |
| 
 | |
| static | |
| inline | |
| void | |
| lfmp_lock(lfmp_t *lfmp_) | |
| { | |
|   mutex_lock(&lfmp_->lock); | |
| } | |
| 
 | |
| static | |
| inline | |
| void | |
| lfmp_unlock(lfmp_t *lfmp_) | |
| { | |
|   mutex_unlock(&lfmp_->lock); | |
| } | |
| 
 | |
| static | |
| inline | |
| uint64_t | |
| lfmp_slab_count(lfmp_t *lfmp_) | |
| { | |
|   uint64_t rv; | |
| 
 | |
|   mutex_lock(&lfmp_->lock); | |
|   rv = fmp_slab_count(&lfmp_->fmp); | |
|   mutex_unlock(&lfmp_->lock); | |
| 
 | |
|   return rv; | |
| } | |
| 
 | |
| static | |
| inline | |
| int | |
| lfmp_slab_alloc(lfmp_t *lfmp_) | |
| { | |
|   int rv; | |
| 
 | |
|   mutex_lock(&lfmp_->lock); | |
|   rv = fmp_slab_alloc(&lfmp_->fmp); | |
|   mutex_unlock(&lfmp_->lock); | |
| 
 | |
|   return rv; | |
| } | |
| 
 | |
| static | |
| inline | |
| void* | |
| lfmp_alloc(lfmp_t *lfmp_) | |
| { | |
|   void *rv; | |
| 
 | |
|   mutex_lock(&lfmp_->lock); | |
|   rv = fmp_alloc(&lfmp_->fmp); | |
|   mutex_unlock(&lfmp_->lock); | |
| 
 | |
|   return rv; | |
| } | |
| 
 | |
| static | |
| inline | |
| void* | |
| lfmp_calloc(lfmp_t *lfmp_) | |
| { | |
|   void *rv; | |
| 
 | |
|   mutex_lock(&lfmp_->lock); | |
|   rv = fmp_calloc(&lfmp_->fmp); | |
|   mutex_unlock(&lfmp_->lock); | |
| 
 | |
|   return rv; | |
| } | |
| 
 | |
| static | |
| inline | |
| void | |
| lfmp_free(lfmp_t *lfmp_, | |
|           void   *obj_) | |
| { | |
|   mutex_lock(&lfmp_->lock); | |
|   fmp_free(&lfmp_->fmp,obj_); | |
|   mutex_unlock(&lfmp_->lock); | |
| } | |
| 
 | |
| static | |
| inline | |
| void | |
| lfmp_clear(lfmp_t *lfmp_) | |
| { | |
|   mutex_lock(&lfmp_->lock); | |
|   fmp_clear(&lfmp_->fmp); | |
|   mutex_unlock(&lfmp_->lock); | |
| } | |
| 
 | |
| static | |
| inline | |
| void | |
| lfmp_destroy(lfmp_t *lfmp_) | |
| { | |
|   mutex_lock(&lfmp_->lock); | |
|   fmp_destroy(&lfmp_->fmp); | |
|   mutex_unlock(&lfmp_->lock); | |
|   mutex_destroy(&lfmp_->lock); | |
| } | |
| 
 | |
| static | |
| inline | |
| uint64_t | |
| lfmp_avail_objs(lfmp_t *lfmp_) | |
| { | |
|   uint64_t rv; | |
| 
 | |
|   mutex_lock(&lfmp_->lock); | |
|   rv = fmp_avail_objs(&lfmp_->fmp); | |
|   mutex_unlock(&lfmp_->lock); | |
| 
 | |
|   return rv; | |
| } | |
| 
 | |
| static | |
| inline | |
| uint64_t | |
| lfmp_objs_in_slab(lfmp_t *lfmp_, | |
|                   void   *slab_) | |
| { | |
|   uint64_t rv; | |
| 
 | |
|   mutex_lock(&lfmp_->lock); | |
|   rv = fmp_objs_in_slab(&lfmp_->fmp,slab_); | |
|   mutex_unlock(&lfmp_->lock); | |
| 
 | |
|   return rv; | |
| } | |
| 
 | |
| static | |
| inline | |
| void | |
| lfmp_remove_objs_in_slab(lfmp_t *lfmp_, | |
|                          void   *slab_) | |
| { | |
|   mutex_lock(&lfmp_->lock); | |
|   fmp_remove_objs_in_slab(&lfmp_->fmp,slab_); | |
|   mutex_unlock(&lfmp_->lock); | |
| } | |
| 
 | |
| static | |
| inline | |
| int | |
| lfmp_gc(lfmp_t *lfmp_) | |
| { | |
|   int rv; | |
| 
 | |
|   mutex_lock(&lfmp_->lock); | |
|   rv = fmp_gc(&lfmp_->fmp); | |
|   mutex_unlock(&lfmp_->lock); | |
| 
 | |
|   return rv; | |
| } | |
| 
 | |
| static | |
| inline | |
| uint64_t | |
| lfmp_objs_per_slab(lfmp_t *lfmp_) | |
| { | |
|   uint64_t rv; | |
| 
 | |
|   mutex_lock(&lfmp_->lock); | |
|   rv = fmp_objs_per_slab(&lfmp_->fmp); | |
|   mutex_unlock(&lfmp_->lock); | |
| 
 | |
|   return rv; | |
| } | |
| 
 | |
| static | |
| inline | |
| double | |
| lfmp_slab_usage_ratio(lfmp_t *lfmp_) | |
| { | |
|   double rv; | |
| 
 | |
|   mutex_lock(&lfmp_->lock); | |
|   rv = fmp_slab_usage_ratio(&lfmp_->fmp); | |
|   mutex_unlock(&lfmp_->lock); | |
| 
 | |
|   return rv; | |
| } | |
| 
 | |
| static | |
| inline | |
| uint64_t | |
| lfmp_total_allocated_memory(lfmp_t *lfmp_) | |
| { | |
|   uint64_t rv; | |
| 
 | |
|   mutex_lock(&lfmp_->lock); | |
|   rv = fmp_total_allocated_memory(&lfmp_->fmp); | |
|   mutex_unlock(&lfmp_->lock); | |
| 
 | |
|   return rv; | |
| }
 |