/
zOMGdev
/
cppcms
Обзор
Документация
Войти
/
zOMGdev
/
cppcms
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
private/shmem_allocator.h
118 строк
2 KB
Artyom Beilis
replaced home written allocator with well known design
30 ноя 2015, 18:43
30 ноя 2015, 18:43
2033d55
Код
Авторство
О чём код?
/////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com> // // See accompanying file COPYING.TXT file for licensing details. // /////////////////////////////////////////////////////////////////////////////// #ifndef CPPCMS_IMPL_SHMEM_ALLOCATOR_H #define CPPCMS_IMPL_SHMEM_ALLOCATOR_H #include <assert.h> #include <string.h> #include <iostream> #include <iomanip> #include <cppcms/cstdint.h> #include <cppcms/config.h> #include "basic_allocator.h" #include "posix_util.h" #include "buddy_allocator.h" #include <cppcms/cppcms_error.h> #include <string> #include <limits> namespace cppcms { namespace impl { class shmem_control : public booster::noncopyable{ public: shmem_control(size_t size) : size_(size), region_(mmap_anonymous(size)), memory_(0) { if(size < sizeof(*memory_)) throw cppcms_error("shared memory size is too small"); memory_ = new (region_) cppcms::impl::buddy_allocator(size_); } ~shmem_control() { memory_->~buddy_allocator(); ::munmap(region_,size_); } inline size_t size() { return size_; } inline size_t available() { mutex::guard g(lock_); return memory_->total_free_memory(); } inline size_t max_available() { mutex::guard g(lock_); return memory_->max_free_chunk(); } inline void *malloc(size_t s) { mutex::guard g(lock_); return memory_->malloc(s); } inline void free(void *p) { mutex::guard g(lock_); return memory_->free(p); } private: mutex lock_; size_t size_; void *region_; cppcms::impl::buddy_allocator *memory_; }; template<typename T,shmem_control *&mm> class shmem_allocator : public basic_allocator<shmem_allocator<T,mm>, T > { public : typedef basic_allocator<shmem_allocator<T,mm>, T > super; template<typename U> struct rebind { typedef shmem_allocator<U,mm> other; }; template<typename U> shmem_allocator (const shmem_allocator< U, mm > &) : super() { } shmem_allocator (const shmem_allocator &) : super() { } shmem_allocator() { } void *malloc(size_t n) const { return mm->malloc(n); } void free(void *p) const { return mm->free(p); } }; } // } // #endif