- all RAN code, CI code, configuration files, dockerfiles, in CSSL v1.0
- all deployment code (openshift, charts, ancillary files like shell
scripts), in MIT
- documentation in CC-BY-4.0
- exceptions might apply and are listed in NOTICE
- there is a new LICENSES folder with all licenses
- CONTRIBUTIONS.md has been updated accordingly
For automated changes based on OAI PL v1.1:
perl -i~ -0pe 's/\/\*.*Licensed to the OpenAirInterface.*openairinterface.org\n#?/\/*\n * SPDX-License-Identifier: LicenseRef-CSSL-1.0\n/s' **/*.{c,h,cpp}
perl -i~ -0pe 's/\/\*.*Licensed to the OpenAirInterface.*openairinterface.org\n#?/\/*\n * SPDX-License-Identifier: LicenseRef-CSSL-1.0\n/s' **/*.ts
perl -i~ -0pe 's/<!--.*Licensed to the OpenAirInterface.*openairinterface.org\n.*-->/<!-- SPDX-License-Identifier: LicenseRef-CSSL-1.0 -->/s' **/*.xml
The rest (cmake, files with missing license, cmake) manually.
177 lines
3.5 KiB
C++
177 lines
3.5 KiB
C++
/*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Copyright 2017 Cisco Systems, Inc.
|
|
*/
|
|
|
|
#ifndef _POOL_H_
|
|
#define _POOL_H_
|
|
|
|
#include <mutex>
|
|
#include <map>
|
|
#include <queue>
|
|
#include <cassert>
|
|
|
|
|
|
class pool_config
|
|
{
|
|
public:
|
|
|
|
size_t size;
|
|
uint16_t initial_count;
|
|
};
|
|
|
|
class memory_pool
|
|
{
|
|
std::mutex mutex;
|
|
std::map<size_t, std::queue<uint8_t*>> free_store;
|
|
std::map<size_t, uint16_t> allocated_store;
|
|
|
|
void init(std::vector<pool_config> config)
|
|
{
|
|
printf("memory_pool::init\n");
|
|
|
|
for(pool_config c : config)
|
|
{
|
|
// todo : use the initial count to allocate initial pool memory
|
|
free_store.insert(std::pair<size_t,
|
|
std::queue<uint8_t*>>
|
|
(c.size, std::queue<uint8_t*>()));
|
|
allocated_store.insert(std::pair<size_t, uint16_t>(c.size, 0));
|
|
}
|
|
}
|
|
|
|
memory_pool()
|
|
{
|
|
std::vector<pool_config> config
|
|
{
|
|
{8, 0}, {32, 0}, {64, 0}, {128, 0}, {256, 0},
|
|
{1024, 0}, {4096, 0}, {8912, 0}
|
|
|
|
};
|
|
|
|
init(config);
|
|
}
|
|
|
|
|
|
uint16_t determine_pool_size(size_t size)
|
|
{
|
|
for(auto pool : free_store)
|
|
{
|
|
if(pool.first >= size)
|
|
return pool.first;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint8_t* alloc(size_t size)
|
|
{
|
|
if(size == 0)
|
|
return 0;
|
|
|
|
uint8_t* ptr = 0;
|
|
size_t psize = determine_pool_size(size + 4);
|
|
|
|
if(psize == 0)
|
|
{
|
|
ptr = (uint8_t*)malloc(size + 4);
|
|
memset(ptr, 0, size + 4);
|
|
}
|
|
else
|
|
{
|
|
mutex.lock();
|
|
|
|
auto it = free_store.find(psize);
|
|
|
|
if(it == free_store.end())
|
|
{
|
|
// Unknown pool size
|
|
ptr = (uint8_t*)malloc(psize + 4);
|
|
memcpy(ptr, &psize, 4);
|
|
}
|
|
else
|
|
{
|
|
if(it->second.size() > 0)
|
|
{
|
|
// Take from the pool
|
|
ptr = (uint8_t*)(it->second.front());
|
|
it->second.pop();
|
|
}
|
|
else
|
|
{
|
|
// No memory left in pool
|
|
ptr = (uint8_t*)malloc(psize + 4);
|
|
memcpy(ptr, &psize, 4);
|
|
}
|
|
}
|
|
|
|
mutex.unlock();
|
|
}
|
|
|
|
return (ptr + 4);
|
|
}
|
|
|
|
void dealloc(uint8_t* ptr)
|
|
{
|
|
if(ptr == 0)
|
|
return;
|
|
|
|
uint8_t* _ptr = (uint8_t*)ptr;
|
|
|
|
size_t psize;
|
|
memcpy(&psize, _ptr - 4, 4);
|
|
|
|
if(psize == 0)
|
|
{
|
|
free(_ptr - 4);
|
|
}
|
|
else
|
|
{
|
|
mutex.lock();
|
|
|
|
auto it = free_store.find(psize);
|
|
if(it == free_store.end())
|
|
{
|
|
free(_ptr - 4);
|
|
}
|
|
else
|
|
{
|
|
assert((_ptr - 4) != 0);
|
|
it->second.push(_ptr - 4);
|
|
}
|
|
|
|
mutex.unlock();
|
|
}
|
|
|
|
}
|
|
|
|
public:
|
|
|
|
memory_pool(memory_pool const&) = delete;
|
|
void operator=(memory_pool const&) = delete;
|
|
|
|
/*! Get the memory_pool instance */
|
|
static memory_pool& instance()
|
|
{
|
|
static memory_pool instance;
|
|
return instance;
|
|
}
|
|
|
|
/*! Allocate a buffer from the memory_pool is at least size */
|
|
static uint8_t* allocate(size_t size)
|
|
{
|
|
return instance().alloc(size);
|
|
}
|
|
|
|
/*! Return the buffer to the memory_pool */
|
|
static void deallocate(uint8_t* ptr)
|
|
{
|
|
return instance().dealloc(ptr);
|
|
}
|
|
|
|
|
|
};
|
|
|
|
#endif // _POOL_H_
|