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