mirror of https://github.com/trapexit/mergerfs.git
committed by
trapexit
26 changed files with 356 additions and 1148 deletions
-
2Makefile
-
2libfuse/include/fuse_msgbuf.hpp
-
45libfuse/include/mutex.hpp
-
28libfuse/include/mutex_debug.hpp
-
24libfuse/include/mutex_ndebug.hpp
-
109libfuse/include/objpool.hpp
-
0libfuse/include/scope_guard.hpp
-
20libfuse/include/thread_pool.hpp
-
380libfuse/lib/fmp.h
-
142libfuse/lib/fuse.cpp
-
21libfuse/lib/fuse_lowlevel.cpp
-
214libfuse/lib/fuse_msgbuf.cpp
-
245libfuse/lib/lfmp.h
-
9libfuse/lib/maintenance_thread.cpp
-
14src/branches.cpp
-
10src/branches.hpp
-
9src/fileinfo.hpp
-
89src/fixed_mem_pool.hpp
-
8src/fs_statvfs_cache.cpp
-
2src/fuse_readdir_cor.cpp
-
6src/fuse_readdir_cor_getdents.icpp
-
4src/fuse_readdir_cor_readdir.icpp
-
5src/fuse_write.cpp
-
72src/locked_fixed_mem_pool.hpp
-
21src/mempools.cpp
-
23src/mempools.hpp
@ -1,380 +0,0 @@ |
|||
/* |
|||
ISC License |
|||
|
|||
Copyright (c) 2021, 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 "kvec.h" |
|||
|
|||
#include <errno.h> |
|||
#include <stdint.h> |
|||
#include <stdlib.h> |
|||
#include <string.h> |
|||
#include <sys/mman.h> |
|||
#include <unistd.h> |
|||
|
|||
#define ROUND_UP(N,S) ((((N) + (S) - 1) / (S)) * (S)) |
|||
|
|||
typedef kvec_t(void*) slab_kvec_t; |
|||
|
|||
typedef struct mem_stack_t mem_stack_t; |
|||
struct mem_stack_t |
|||
{ |
|||
mem_stack_t *next; |
|||
}; |
|||
|
|||
typedef struct fmp_t fmp_t; |
|||
struct fmp_t |
|||
{ |
|||
mem_stack_t *objs; |
|||
slab_kvec_t slabs; |
|||
uint64_t avail_objs; |
|||
uint64_t obj_size; |
|||
uint64_t page_size; |
|||
uint64_t slab_size; |
|||
}; |
|||
|
|||
static |
|||
inline |
|||
uint64_t |
|||
fmp_page_size() |
|||
{ |
|||
return sysconf(_SC_PAGESIZE); |
|||
} |
|||
|
|||
static |
|||
inline |
|||
void |
|||
fmp_init(fmp_t *fmp_, |
|||
const uint64_t obj_size_, |
|||
const uint64_t page_multiple_) |
|||
{ |
|||
kv_init(fmp_->slabs); |
|||
fmp_->objs = NULL; |
|||
fmp_->avail_objs = 0; |
|||
fmp_->obj_size = ROUND_UP(obj_size_,sizeof(void*)); |
|||
fmp_->page_size = fmp_page_size(); |
|||
fmp_->slab_size = (fmp_->page_size * page_multiple_); |
|||
} |
|||
|
|||
static |
|||
inline |
|||
uint64_t |
|||
fmp_slab_count(fmp_t *fmp_) |
|||
{ |
|||
return kv_size(fmp_->slabs); |
|||
} |
|||
|
|||
static |
|||
inline |
|||
void* |
|||
fmp_slab_alloc_posix_memalign(fmp_t *fmp_) |
|||
{ |
|||
int rv; |
|||
void *mem; |
|||
const size_t alignment = fmp_->page_size; |
|||
const size_t size = fmp_->slab_size; |
|||
|
|||
rv = posix_memalign(&mem,alignment,size); |
|||
if(rv != 0) |
|||
return NULL; |
|||
|
|||
return NULL; |
|||
} |
|||
|
|||
static |
|||
inline |
|||
void* |
|||
fmp_slab_alloc_mmap(fmp_t *fmp_) |
|||
{ |
|||
void *mem; |
|||
void *address = NULL; |
|||
const size_t length = fmp_->slab_size; |
|||
const int protect = PROT_READ|PROT_WRITE; |
|||
const int flags = MAP_PRIVATE|MAP_ANONYMOUS; |
|||
const int filedes = -1; |
|||
const off_t offset = 0; |
|||
|
|||
mem = mmap(address,length,protect,flags,filedes,offset); |
|||
if(mem == MAP_FAILED) |
|||
return NULL; |
|||
|
|||
return mem; |
|||
} |
|||
|
|||
static |
|||
inline |
|||
void |
|||
fmp_slab_free_posix_memalign(fmp_t* fmp_, |
|||
void *mem_) |
|||
{ |
|||
(void)fmp_; |
|||
free(mem_); |
|||
} |
|||
|
|||
static |
|||
inline |
|||
void |
|||
fmp_slab_free_mmap(fmp_t* fmp_, |
|||
void *mem_) |
|||
{ |
|||
void *addr = mem_; |
|||
size_t length = fmp_->slab_size; |
|||
|
|||
(void)munmap(addr,length); |
|||
} |
|||
|
|||
static |
|||
inline |
|||
int |
|||
fmp_slab_alloc(fmp_t *fmp_) |
|||
{ |
|||
char *i; |
|||
void *mem; |
|||
|
|||
mem = fmp_slab_alloc_mmap(fmp_); |
|||
if(mem == NULL) |
|||
return -ENOMEM; |
|||
|
|||
kv_push(void*,fmp_->slabs,mem); |
|||
|
|||
i = ((char*)mem + fmp_->slab_size - fmp_->obj_size); |
|||
while(i >= (char*)mem) |
|||
{ |
|||
mem_stack_t *obj = (mem_stack_t*)i; |
|||
|
|||
obj->next = fmp_->objs; |
|||
fmp_->objs = obj; |
|||
fmp_->avail_objs++; |
|||
|
|||
i -= fmp_->obj_size; |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
static |
|||
inline |
|||
void* |
|||
fmp_alloc(fmp_t *fmp_) |
|||
{ |
|||
void *rv; |
|||
|
|||
if(fmp_->objs == NULL) |
|||
fmp_slab_alloc(fmp_); |
|||
if(fmp_->objs == NULL) |
|||
return NULL; |
|||
|
|||
rv = fmp_->objs; |
|||
|
|||
fmp_->objs = fmp_->objs->next; |
|||
fmp_->avail_objs--; |
|||
|
|||
return rv; |
|||
} |
|||
|
|||
static |
|||
inline |
|||
void* |
|||
fmp_calloc(fmp_t *fmp_) |
|||
{ |
|||
void *obj; |
|||
|
|||
obj = fmp_alloc(fmp_); |
|||
if(obj == NULL) |
|||
return NULL; |
|||
|
|||
memset(obj,0,fmp_->obj_size); |
|||
|
|||
return obj; |
|||
} |
|||
|
|||
static |
|||
inline |
|||
void |
|||
fmp_free(fmp_t *fmp_, |
|||
void *obj_) |
|||
{ |
|||
mem_stack_t *obj = (mem_stack_t*)obj_; |
|||
|
|||
obj->next = fmp_->objs; |
|||
fmp_->objs = obj; |
|||
fmp_->avail_objs++; |
|||
} |
|||
|
|||
static |
|||
inline |
|||
void |
|||
fmp_clear(fmp_t *fmp_) |
|||
{ |
|||
while(kv_size(fmp_->slabs)) |
|||
{ |
|||
void *slab = kv_pop(fmp_->slabs); |
|||
|
|||
fmp_slab_free_mmap(fmp_,slab); |
|||
} |
|||
|
|||
fmp_->objs = NULL; |
|||
fmp_->avail_objs = 0; |
|||
} |
|||
|
|||
static |
|||
inline |
|||
void |
|||
fmp_destroy(fmp_t *fmp_) |
|||
{ |
|||
fmp_clear(fmp_); |
|||
kv_destroy(fmp_->slabs); |
|||
} |
|||
|
|||
static |
|||
inline |
|||
uint64_t |
|||
fmp_avail_objs(fmp_t *fmp_) |
|||
{ |
|||
return fmp_->avail_objs; |
|||
} |
|||
|
|||
static |
|||
inline |
|||
uint64_t |
|||
fmp_objs_per_slab(fmp_t *fmp_) |
|||
{ |
|||
return (fmp_->slab_size / fmp_->obj_size); |
|||
} |
|||
|
|||
static |
|||
inline |
|||
uint64_t |
|||
fmp_objs_in_slab(fmp_t *fmp_, |
|||
void *slab_) |
|||
{ |
|||
char *slab; |
|||
uint64_t objs_per_slab; |
|||
uint64_t objs_in_slab; |
|||
|
|||
slab = (char*)slab_; |
|||
objs_in_slab = 0; |
|||
objs_per_slab = fmp_objs_per_slab(fmp_); |
|||
for(mem_stack_t *stack = fmp_->objs; stack != NULL; stack = stack->next) |
|||
{ |
|||
char *obj = (char*)stack; |
|||
if((obj >= slab) && (obj < (slab + fmp_->slab_size))) |
|||
objs_in_slab++; |
|||
if(objs_in_slab >= objs_per_slab) |
|||
break; |
|||
} |
|||
|
|||
return objs_in_slab; |
|||
} |
|||
|
|||
static |
|||
inline |
|||
void |
|||
fmp_remove_objs_in_slab(fmp_t *fmp_, |
|||
void *slab_) |
|||
{ |
|||
char *slab; |
|||
uint64_t objs_per_slab; |
|||
uint64_t objs_in_slab; |
|||
mem_stack_t **p; |
|||
|
|||
p = &fmp_->objs; |
|||
slab = (char*)slab_; |
|||
objs_in_slab = 0; |
|||
objs_per_slab = fmp_objs_per_slab(fmp_); |
|||
while((*p) != NULL) |
|||
{ |
|||
char *obj = (char*)*p; |
|||
|
|||
if((obj >= slab) && (obj < (slab + fmp_->slab_size))) |
|||
{ |
|||
objs_in_slab++; |
|||
*p = (*p)->next; |
|||
fmp_->avail_objs--; |
|||
|
|||
if(objs_in_slab >= objs_per_slab) |
|||
break; |
|||
continue; |
|||
} |
|||
|
|||
p = &(*p)->next; |
|||
} |
|||
} |
|||
|
|||
static |
|||
inline |
|||
int |
|||
fmp_gc_slab(fmp_t *fmp_, |
|||
uint64_t slab_idx_) |
|||
{ |
|||
char *slab; |
|||
uint64_t objs_in_slab; |
|||
uint64_t objs_per_slab; |
|||
|
|||
slab_idx_ = (slab_idx_ % kv_size(fmp_->slabs)); |
|||
|
|||
slab = (char*)kv_A(fmp_->slabs,slab_idx_); |
|||
|
|||
objs_per_slab = fmp_objs_per_slab(fmp_); |
|||
objs_in_slab = fmp_objs_in_slab(fmp_,slab); |
|||
if(objs_in_slab != objs_per_slab) |
|||
return 0; |
|||
|
|||
fmp_remove_objs_in_slab(fmp_,slab); |
|||
kv_delete(fmp_->slabs,slab_idx_); |
|||
fmp_slab_free_mmap(fmp_,slab); |
|||
|
|||
return 1; |
|||
} |
|||
|
|||
|
|||
static |
|||
inline |
|||
int |
|||
fmp_gc(fmp_t *fmp_) |
|||
{ |
|||
uint64_t slab_idx; |
|||
|
|||
slab_idx = rand(); |
|||
|
|||
return fmp_gc_slab(fmp_,slab_idx); |
|||
} |
|||
|
|||
static |
|||
inline |
|||
double |
|||
fmp_slab_usage_ratio(fmp_t *fmp_) |
|||
{ |
|||
double avail_objs; |
|||
double objs_per_slab; |
|||
double nums_of_slabs; |
|||
|
|||
avail_objs = fmp_->avail_objs; |
|||
objs_per_slab = fmp_objs_per_slab(fmp_); |
|||
nums_of_slabs = kv_size(fmp_->slabs); |
|||
|
|||
return (avail_objs / (objs_per_slab * nums_of_slabs)); |
|||
} |
|||
|
|||
static |
|||
inline |
|||
uint64_t |
|||
fmp_total_allocated_memory(fmp_t *fmp_) |
|||
{ |
|||
return (fmp_->slab_size * kv_size(fmp_->slabs)); |
|||
} |
|||
@ -1,245 +0,0 @@ |
|||
/* |
|||
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; |
|||
} |
|||
@ -1,89 +0,0 @@ |
|||
/*
|
|||
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 <cstdint>
|
|||
|
|||
#include <stdlib.h>
|
|||
|
|||
|
|||
typedef struct fixed_mem_pool_t fixed_mem_pool_t; |
|||
struct fixed_mem_pool_t |
|||
{ |
|||
fixed_mem_pool_t *next; |
|||
}; |
|||
|
|||
template<uint64_t SIZE> |
|||
class FixedMemPool |
|||
{ |
|||
public: |
|||
FixedMemPool() |
|||
{ |
|||
list.next = NULL; |
|||
} |
|||
|
|||
~FixedMemPool() |
|||
{ |
|||
void *mem; |
|||
while(!empty()) |
|||
{ |
|||
mem = alloc(); |
|||
::free(mem); |
|||
} |
|||
} |
|||
|
|||
bool |
|||
empty(void) |
|||
{ |
|||
return (list.next == NULL); |
|||
} |
|||
|
|||
uint64_t |
|||
size(void) |
|||
{ |
|||
return SIZE; |
|||
} |
|||
|
|||
void* |
|||
alloc(void) |
|||
{ |
|||
void *rv; |
|||
|
|||
if(list.next == NULL) |
|||
return malloc(SIZE); |
|||
|
|||
rv = (void*)list.next; |
|||
list.next = list.next->next; |
|||
|
|||
return rv; |
|||
} |
|||
|
|||
void |
|||
free(void *mem_) |
|||
{ |
|||
fixed_mem_pool_t *next; |
|||
|
|||
next = (fixed_mem_pool_t*)mem_; |
|||
next->next = list.next; |
|||
list.next = next; |
|||
} |
|||
|
|||
private: |
|||
fixed_mem_pool_t list; |
|||
}; |
|||
@ -1,72 +0,0 @@ |
|||
/*
|
|||
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 "fixed_mem_pool.hpp"
|
|||
|
|||
#include "mutex.hpp"
|
|||
|
|||
#include <pthread.h>
|
|||
|
|||
|
|||
template<size_t SIZE> |
|||
class LockedFixedMemPool |
|||
{ |
|||
public: |
|||
LockedFixedMemPool() |
|||
{ |
|||
mutex_init(&_mutex); |
|||
} |
|||
|
|||
~LockedFixedMemPool() |
|||
{ |
|||
mutex_destroy(&_mutex); |
|||
} |
|||
|
|||
public: |
|||
void* |
|||
alloc(void) |
|||
{ |
|||
void *mem; |
|||
|
|||
mutex_lock(&_mutex); |
|||
mem = _fmp.alloc(); |
|||
mutex_unlock(&_mutex); |
|||
|
|||
return mem; |
|||
} |
|||
|
|||
void |
|||
free(void *mem_) |
|||
{ |
|||
mutex_lock(&_mutex); |
|||
_fmp.free(mem_); |
|||
mutex_unlock(&_mutex); |
|||
} |
|||
|
|||
uint64_t |
|||
size(void) |
|||
{ |
|||
return _fmp.size(); |
|||
} |
|||
|
|||
private: |
|||
FixedMemPool<SIZE> _fmp; |
|||
pthread_mutex_t _mutex; |
|||
}; |
|||
@ -1,21 +0,0 @@ |
|||
/*
|
|||
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. |
|||
*/ |
|||
|
|||
#include "locked_fixed_mem_pool.hpp"
|
|||
|
|||
LockedFixedMemPool<128 * 1024> g_DENTS_BUF_POOL; |
|||
@ -1,23 +0,0 @@ |
|||
/*
|
|||
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 "locked_fixed_mem_pool.hpp"
|
|||
|
|||
extern LockedFixedMemPool<128 * 1024> g_DENTS_BUF_POOL; |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue