Skip to content

Commit a3da323

Browse files
committed
corected makefule paths, added pool quota options, and added mem tool draft
1 parent cbf4509 commit a3da323

4 files changed

Lines changed: 225 additions & 12 deletions

File tree

Application/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ DataModelHEADERS:=$(patsubst %.h, include/%.h, $(filter %.h, $(subst /, ,$(wildc
2424
MyToolHEADERS:=$(patsubst %.h, include/%.h, $(filter %.h, $(subst /, ,$(wildcard UserTools/*/*.h) $(wildcard UserTools/*.h))))
2525
ToolLibs = $(patsubst %.so, %, $(patsubst lib%, -l%,$(filter lib%, $(subst /, , $(wildcard UserTools/*/*.so)))))
2626
AlreadyCompiled = $(wildcard UserTools/$(filter-out %.so UserTools , $(subst /, ,$(wildcard UserTools/*/*.so)))/*.cpp)
27-
SOURCEFILES:=$(patsubst %.cpp, %.o, $(filter-out Dependencies% , $(filter-out $(AlreadyCompiled), $(wildcard */*.cpp) $(wildcard */*/*.cpp))))
27+
SOURCEFILES:=$(patsubst %.cpp, %.o, $(filter-out Dependencies% , $(filter-out $(AlreadyCompiled), $(wildcard src/*.cpp) $(wildcard UserTools/*/*.cpp) $(wildcard DataModel/*.cpp))))
2828
Libs=-L $(SOURCEDIR)/lib/ -lDataModel -L $(ToolFrameworkCore)/lib/ -lToolChain -lMyTools -lDataModelBase -lLogging -lStore -lpthread $(ToolLibs)
2929

3030

src/DataModelBase/Pool.h

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <cstdint>
88
#include <Utilities.h>
99
#include <chrono>
10+
#include <atomic>
1011

1112
namespace ToolFramework{
1213

@@ -21,18 +22,25 @@ namespace ToolFramework{
2122
std::chrono::high_resolution_clock::time_point now;
2223
std::chrono::high_resolution_clock::time_point managing_timer;
2324
uint64_t count;
25+
unsigned int* sum;
26+
unsigned int* counter;
27+
2428
};
2529

2630

2731
template<class T> class Pool{
2832

2933
public:
3034

31-
Pool(bool in_manage=false, uint16_t period_ms=1000, size_t in_object_cap=1){
32-
35+
Pool(bool in_manage=true, size_t in_object_cap=1, uint16_t period_ms=1000){
36+
37+
counter = 0;
38+
sum = 0;
3339
manage=in_manage;
3440
args.manage_period_ms=period_ms;
3541
args.object_cap=in_object_cap;
42+
args.sum = &sum;
43+
args.counter = &counter;
3644

3745
if(manage) m_utils.CreateThread("pool_manager", &Thread, &args);
3846

@@ -41,10 +49,20 @@ namespace ToolFramework{
4149
~Pool(){
4250
if(manage) m_utils.KillThread(&args);
4351
Clear();
44-
}
52+
}
53+
54+
void SetPeriod(uint16_t period_ms){
55+
args.manage_period_ms=period_ms;
56+
}
57+
58+
void SetObjectCap(size_t in_object_cap){
59+
args.object_cap=in_object_cap;
60+
}
4561

4662
template <typename... Args> T* GetNew(Args... in_args){
4763
mtx.lock();
64+
counter++;
65+
sum+=objects.size();
4866
if(objects.size()>0){
4967
T* tmp=objects.front();
5068
objects.pop();
@@ -53,6 +71,7 @@ namespace ToolFramework{
5371

5472
}
5573
mtx.unlock();
74+
5675
return new T(in_args...);
5776
}
5877

@@ -76,13 +95,17 @@ namespace ToolFramework{
7695
Pool_args<T>* args = reinterpret_cast<Pool_args<T>*>(arg);
7796
args->count = std::chrono::duration<double, std::milli>( std::chrono::high_resolution_clock::now() - args->managing_timer).count();
7897
if(args->count < args->manage_period_ms){
79-
usleep((args->manage_period_ms - args->count)/1000);
98+
usleep((args->manage_period_ms - args->count)*1000);
8099
return;
81100
}
82101
args->mtx->lock();
83-
while(args->objects->size() > args->object_cap){
84-
delete args->objects->front();
85-
args->objects->pop();
102+
if( *args->counter!=0 && (((*args->sum) / (*args->counter)) > args->object_cap)){
103+
while(args->objects->size() > args->object_cap){
104+
delete args->objects->front();
105+
args->objects->pop();
106+
}
107+
*args->counter = 0;
108+
*args->sum = 0;
86109
}
87110
args->mtx->unlock();
88111
args->managing_timer=std::chrono::high_resolution_clock::now();
@@ -96,6 +119,8 @@ namespace ToolFramework{
96119
Utilities m_utils;
97120
Pool_args<T> args;
98121
bool manage;
122+
unsigned int counter;
123+
unsigned int sum;
99124

100125
};
101126

src/main.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,27 @@
11
#include <string>
2+
//#include "mem.hpp"
23
#include "ToolChain.h"
34
#include "DataModel.h"
45
//#include "DummyTool.h"
56

67
using namespace ToolFramework;
78

9+
810
int main(int argc, char* argv[]){
911

12+
//memory_usage.PrintUsage("init");
1013
std::string config_file;
11-
if (argc==1)config_file="configfiles/Dummy/ToolChainConfig";
14+
if (argc==1) config_file="configfiles/Dummy/ToolChainConfig";
1215
else config_file=argv[1];
16+
//memory_usage.PrintUsage("after config");
1317

18+
1419
DataModel* data_model = new DataModel();
20+
//memory_usage.PrintUsage("after DM");
21+
1522
ToolChain tools(config_file, data_model, argc, argv);
16-
17-
23+
//memory_usage.PrintUsage("after tc");
24+
1825
//DummyTool dummytool;
1926

2027
//tools.Add("DummyTool",&dummytool,"configfiles/DummyToolConfig");
@@ -27,7 +34,6 @@ int main(int argc, char* argv[]){
2734
// tools.Execute();
2835
//tools.Finalise();
2936

30-
3137
return 0;
3238

3339
}

src/mem.hpp

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
#ifndef MEM_H
2+
#define MEM_H
3+
4+
#include <cstdio>
5+
#include <cstdlib>
6+
#include <new>
7+
#include <cstdio>
8+
#include <map>
9+
10+
constexpr unsigned long catalogue_range = 60000;
11+
12+
13+
struct MemoryUsage{
14+
15+
~MemoryUsage(){PrintUsage("Destructor");}
16+
uint32_t total_allocated = 0;
17+
uint32_t total_freed = 0;
18+
19+
uint32_t CurrentUsage(){return total_allocated - total_freed;}
20+
21+
void PrintUsage(std::string label=""){
22+
if(label!="") printf("(%s): ",label.c_str());
23+
printf("total_allocated = %u, total_freed = %u, current_usage = %u\n", total_allocated, total_freed, CurrentUsage());
24+
}
25+
26+
void Clear(){
27+
total_allocated = 0;
28+
total_freed = 0;
29+
}
30+
void CatalogueAdd(void* ptr, size_t size){
31+
32+
unsigned long i=0;
33+
for(; i<catalogue_range; i++){
34+
if(catalogue_ptr[i]==0){
35+
catalogue_ptr[i]=(unsigned long) ptr;
36+
catalogue_size[i]=size;
37+
break;
38+
}
39+
}
40+
if(i==catalogue_range) printf("INSUFFICENT CATALOGUE SIZE\n");
41+
42+
43+
}
44+
45+
unsigned long CatalogueDel(void* ptr){
46+
unsigned long ret=0;
47+
unsigned long tmp_ptr=(unsigned long) ptr;
48+
unsigned long i=0;
49+
for(; i<catalogue_range; i++){
50+
if(catalogue_ptr[i]==tmp_ptr){
51+
ret = catalogue_size[i];
52+
catalogue_ptr[i]=0;
53+
catalogue_size[i]=0;
54+
break;
55+
56+
}
57+
}
58+
if(i==catalogue_range) printf("NOT KNOWN IN CATALOGUE (probably trying to delete twice)\n");
59+
return ret;
60+
61+
}
62+
63+
unsigned long catalogue_ptr[catalogue_range];
64+
unsigned long catalogue_size[catalogue_range];
65+
66+
};
67+
68+
static MemoryUsage memory_usage;
69+
70+
/*
71+
void* operator new(size_t size){
72+
printf("calling new\n");
73+
74+
memory_usage.total_allocated += size;
75+
76+
return malloc(size);
77+
}
78+
79+
void operator delete (void* memory, size_t size){
80+
printf("calling delete\n");
81+
memory_usage.total_freed += size;
82+
83+
free(memory);
84+
}
85+
86+
void operator delete[] (void* memory, size_t size){
87+
printf("calling delete[]\n");
88+
memory_usage.total_freed += size;
89+
90+
::delete[](memory);
91+
}
92+
93+
94+
void operator delete (void* memory){
95+
printf("calling delete no size\n");
96+
97+
free(memory);
98+
}
99+
100+
101+
void operator delete[] (void* memory){
102+
printf("calling delete[] no size\n");
103+
104+
::delete[] (memory);
105+
}
106+
*/
107+
108+
109+
// no inline, required by [replacement.functions]/3
110+
void* operator new(std::size_t sz)
111+
{
112+
memory_usage.total_allocated += sz;
113+
void* tmp= std::malloc(sz);
114+
// std::printf("1) new(size_t), size = %zu p =%p\n", sz,tmp);
115+
memory_usage.CatalogueAdd(tmp,sz);
116+
return tmp;
117+
/*
118+
if (sz == 0)
119+
++sz; // avoid std::malloc(0) which may return nullptr on success
120+
121+
if (void *ptr = std::malloc(sz))
122+
return ptr;
123+
124+
throw std::bad_alloc{}; // required by [new.delete.single]/3
125+
*/
126+
}
127+
128+
// no inline, required by [replacement.functions]/3
129+
void* operator new[](std::size_t sz)
130+
{
131+
void* tmp = std::malloc(sz);
132+
memory_usage.CatalogueAdd(tmp,sz);
133+
//std::printf("2) new[](size_t), size = %zu, p = %p\n", sz, tmp);
134+
memory_usage.total_allocated += sz;
135+
return tmp;
136+
/*if (sz == 0)
137+
++sz; // avoid std::malloc(0) which may return nullptr on success
138+
139+
if (void *ptr = std::malloc(sz))
140+
return ptr;
141+
142+
throw std::bad_alloc{}; // required by [new.delete.single]/3
143+
*/
144+
}
145+
146+
void operator delete(void* ptr) noexcept
147+
{
148+
// std::printf("3) delete(void*) p=%p\n",ptr);
149+
memory_usage.total_freed += memory_usage.CatalogueDel(ptr);
150+
151+
152+
std::free(ptr);
153+
}
154+
void operator delete(void* ptr, std::size_t size) noexcept;
155+
void operator delete(void* ptr, std::size_t size) noexcept
156+
{
157+
//std::printf("4) delete(void*, size_t), size = %zu\n", size);
158+
memory_usage.total_freed += size;
159+
memory_usage.CatalogueDel(ptr);
160+
std::free(ptr);
161+
}
162+
163+
void operator delete[](void* ptr) noexcept
164+
{
165+
unsigned long size=memory_usage.CatalogueDel(ptr);
166+
//std::printf("5) delete[](void* ptr) p = %p, size = %u\n", ptr, size);
167+
memory_usage.total_freed += size;
168+
std::free(ptr);
169+
}
170+
171+
void operator delete[](void* ptr, std::size_t size) noexcept;
172+
void operator delete[](void* ptr, std::size_t size) noexcept
173+
{
174+
//std::printf("6) delete[](void*, size_t), size = %zu\n", size);
175+
memory_usage.total_freed += size;
176+
memory_usage.CatalogueDel(ptr);
177+
std::free(ptr);
178+
}
179+
180+
181+
182+
#endif

0 commit comments

Comments
 (0)