From 3138d0f68a13192fa8f552a016cfea69f42dc7d2 Mon Sep 17 00:00:00 2001 From: Saturneic Date: Fri, 18 Jan 2019 22:57:54 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整了CPart 的结构与计算模块获取参数的方式,使之更加合理。为以后的对更加复杂的传参要求的支持奠定了基础。 --- Net.xcodeproj/project.pbxproj | 4 ++ cpart.cpp | 21 ++++----- cpart.h | 85 ++++++++++++++++++++++------------- main.cpp | 47 +++++++++---------- memory.h | 35 +++++++++++++-- 5 files changed, 123 insertions(+), 69 deletions(-) diff --git a/Net.xcodeproj/project.pbxproj b/Net.xcodeproj/project.pbxproj index d8d8bac..e5472d8 100644 --- a/Net.xcodeproj/project.pbxproj +++ b/Net.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ 92A1F29B21F0C5CC00340EFA /* clock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92A1F29921F0C5CC00340EFA /* clock.cpp */; }; 92A1F29E21F0C72C00340EFA /* addr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92A1F29D21F0C72C00340EFA /* addr.cpp */; }; 92A1F2A121F1663300340EFA /* memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92A1F29F21F1663300340EFA /* memory.cpp */; }; + 92A1F2A521F21DC700340EFA /* a.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92A1F2A421F21DC700340EFA /* a.cpp */; }; 92D6CE6921EE4920005AEF3B /* server.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92D6CE6721EE4920005AEF3B /* server.cpp */; }; /* End PBXBuildFile section */ @@ -48,6 +49,7 @@ 92A1F29D21F0C72C00340EFA /* addr.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = addr.cpp; sourceTree = ""; }; 92A1F29F21F1663300340EFA /* memory.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = memory.cpp; sourceTree = ""; }; 92A1F2A021F1663300340EFA /* memory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = memory.h; sourceTree = ""; }; + 92A1F2A421F21DC700340EFA /* a.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = a.cpp; path = build/Debug/PCS/a.cpp; sourceTree = ""; }; 92D6CE6721EE4920005AEF3B /* server.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = server.cpp; sourceTree = ""; }; 92D6CE6821EE4920005AEF3B /* server.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = server.h; sourceTree = ""; }; /* End PBXFileReference section */ @@ -82,6 +84,7 @@ 9221DA0E21EB5FAD007310A7 /* Net */ = { isa = PBXGroup; children = ( + 92A1F2A421F21DC700340EFA /* a.cpp */, 925A13AA21EC989500CBD427 /* include */, 9221DA1021EB5FB8007310A7 /* main.cpp */, 92A1F29721F0C19500340EFA /* socket.cpp */, @@ -169,6 +172,7 @@ buildActionMask = 2147483647; files = ( 9221DA1121EB5FB8007310A7 /* main.cpp in Sources */, + 92A1F2A521F21DC700340EFA /* a.cpp in Sources */, 925A13A621EC68D500CBD427 /* cpart.cpp in Sources */, 92A1F29B21F0C5CC00340EFA /* clock.cpp in Sources */, 925A13A921EC973000CBD427 /* cmap.cpp in Sources */, diff --git a/cpart.cpp b/cpart.cpp index 3e84c84..3da483c 100644 --- a/cpart.cpp +++ b/cpart.cpp @@ -17,7 +17,7 @@ @param name 计算模块的名字 @param ffresh 每次建立该结构都重新编译一次源文件 */ -CPart::CPart(string src_path,string src_name,string name,bool ffresh):func(nullptr),handle(nullptr),libargs_in(nullptr),libargs_out(nullptr){ +CPart::CPart(string src_path,string src_name,string name,bool ffresh):func(nullptr),handle(nullptr){ this->src_path = src_path; this->name = name; @@ -59,17 +59,17 @@ int CPart::BuildSo(void){ */ int CPart::GetSo(void){ // 读取lib文件 - this->handle = dlopen(("Libs/"+libname).data(), RTLD_NOW | RTLD_GLOBAL); + this->handle = dlopen(("Libs/"+libname).data(), RTLD_NOW | RTLD_LOCAL); if(this->handle == nullptr) throw "can not open lib file"; // 获得该模块的入口 this->func = (PCSFUNC) dlsym(this->handle, this->name.data()); if(this->func == nullptr) throw "can not get func "+this->name; // 获得向该模块传入参数的vector的地址 - this->libargs_in = (vector *) dlsym(this->handle, ("__"+name+"_args_in").data()); - if(this->libargs_in == nullptr) throw "can not get the address of __"+name+"_args_in"; + this->libargs_in.args = (vector *) dlsym(this->handle, ("__"+name+"_args_in").data()); + if(this->libargs_in.args == nullptr) throw "can not get the address of __"+name+"_args_in"; // 获得该函数传出参数所在的vector的地址 - this->libargs_out = (vector *) dlsym(this->handle, ("__"+name+"_args_out").data()); - if(this->libargs_out == nullptr) throw "can not get the address of __"+name+"_args_out"; + this->libargs_out.args = (vector *) dlsym(this->handle, ("__"+name+"_args_out").data()); + if(this->libargs_out.args == nullptr) throw "can not get the address of __"+name+"_args_out"; return 0; } @@ -103,16 +103,17 @@ void CPart::setArgsType(vector fargs_in, vector fargs_out){ int CPart::Run(void){ if(func == nullptr) throw "func is nullptr"; // 对计算模块传入参数 - for(auto arg : args_in) libargs_in->push_back(arg); + for(auto arg : args_in) + libargs_in.addArgPtr(main_pool.size(arg), arg); // 执行计算模块 if(func() == SUCCESS){ //储存计算结果 - for(auto arg : *libargs_out){ + for(auto libarg : *libargs_out.args){ // 获得内存块的访问量 - main_pool.b_get(arg); + void *arg = main_pool.bp_malloc(libarg.size, libarg.pvle); args_out.push_back(arg); } - libargs_out->clear(); + libargs_out.clear(); return SUCCESS; } else return -1; diff --git a/cpart.h b/cpart.h index f7cc39d..4a598da 100644 --- a/cpart.h +++ b/cpart.h @@ -13,17 +13,17 @@ #include "memory.h" //声明计算模块的传入与传出参数列表 -#define ARGS_DECLAER(name) vector __##name##_args_in, __##name##_args_out +#define ARGS_DECLAER(name) vector __##name##_args_in, __##name##_args_out //声明计算模块的入口 #define PCSFUNC_DEFINE(name) extern "C" int name(void) -#define GET_ARGS(name,type) CPart::popArg(&__##name##_args_in) -#define ADD_ARGS(name,type,value) CPart::addArg(&__##name##_args_out, value); +#define _PCSFUNC(name) ARGS_DECLAER(name); \ +PCSFUNC_DEFINE(name) //从传入参数列表的第一个值,并删除该值 -#define POP_ARGS(name,type) GET_ARGS( name ,type) +#define ARGS_IN(name) __##name##_args_in //向传出参数列表中添加值 -#define PUSH_ARGS(name,type,value) ADD_ARGS( name ,type,value) +#define ARGS_OUT(name) __##name##_args_out //整型 #define INT 0 @@ -49,6 +49,53 @@ public: vector args; }; +class LibArgsTransfer{ +public: + vector *args = nullptr; + LibArgsTransfer(vector &args){ + this->args = &args; + } + LibArgsTransfer(){ + + } + void addArgPtr(int size, void *p_arg){ + void *pc_arg = malloc(size); + memcpy(pc_arg, p_arg, size); + block_info pbifo(size,pc_arg); + args->push_back(pbifo); + } + template + T getArg(int idx){ + T *pvle = (T *)(*args)[idx].pvle; + if((*args)[idx].size == sizeof(T)) return *pvle; + else throw "arg size conflict"; + } + template + T *getArgPtr(int idx){ + T *pvle = (*args)[idx].pvle; + return pvle; + } + void LibAddArgPtr(int size, void *p_arg){ + block_info pbifo(size,p_arg); + args->push_back(pbifo); + } + template + void LibAddArg(T arg){ + T *p_arg = (T *)malloc(sizeof(T)); + *p_arg = arg; + block_info pbifo(sizeof(T),p_arg); + args->push_back(pbifo); + } + void clear(void){ + for(auto arg : *args) + free(arg.pvle); + args->clear(); + } + ~LibArgsTransfer(){ + //clear(); + } +}; + //计算模块类 class CPart{ public: @@ -57,7 +104,7 @@ public: // 参数操纵列表 vector args_in, args_out; // lib文件中相关参数操纵列表的地址 - vector *libargs_in,*libargs_out; + LibArgsTransfer libargs_in, libargs_out; // 所依赖的计算对象列表 vector depends; // lib文件中的计算模块的入口地址 @@ -73,8 +120,6 @@ public: // 源文件名 string src_name; -// 当计算模块随着该工具同时编译时可以直接使用该构造函数 - CPart(PCSFUNC func):func(func),handle(nullptr){} // 一般构造函数,计算模块在文件中以源文件的形式独立存在时使用该构造函数 CPart(string src_path,string src_name,string name,bool ffresh = true); // 析构函数 @@ -96,28 +141,8 @@ public: if(p_value == nullptr) throw "information lost"; args_in.push_back(p_value); } - -// 一般由lib文件中的计算模块调用的向vector中添加参数并分配内存空间而后初始化 - static void addArg(vector *args, void *arg){ - void *p_value = main_pool.b_get(arg); - if(p_value == nullptr) throw "information lost"; - args->push_back(p_value); - } -// 一般由lib文件中的计算模块调用的从vector中获得参数并释放其占用的内存空间而后返回相关值 - template - static T popArg(vector *args){ - if(args == nullptr) throw "the pointer to vector is null"; - - T *p_value = (T *)args->back(); - - p_value = main_pool.b_get(p_value); - if(p_value == nullptr) throw "infomation lost"; - - p_value = main_pool.b_free(p_value); - T value = *p_value; - args->pop_back(); - return value; - } }; + + #endif /* cpart_h */ diff --git a/main.cpp b/main.cpp index e870c15..cec6bd8 100644 --- a/main.cpp +++ b/main.cpp @@ -14,34 +14,9 @@ #include "cmap.h" #include "cthread.h" - - -int main(void){ - initClock(); - Server srvr(9048); - //srvr.Deamon(); - vector fargs = {1,0,0,1}; - vectorargs; - CPart::addArg(&args, 12.63); - CPart::addArg(&args, 10); - CPart::addArg(&args, 6); - CPart::addArg(&args, 8.2); -// 输入过程 - /* struct compute_result cpur = {"Test",&args,&args,&fargs,&fargs}; - packet pkt = srvr.CPURS2Packet(cpur); - raw_data rwd = srvr.Packet2Rawdata(pkt);*/ - -// 输出过程 - //srvr.Rawdata2Packet(rwd); - //srvr.Deamon(NULL); - while(1){ - sleep(100); - } - return 0; -} - void CPMT(void){ CMap map("./PCS"); + CThread thread(&map); thread.Analyse(); thread.DoLine(); @@ -49,4 +24,24 @@ void CPMT(void){ thread.CancelChildPCS(0); } +int main(void){ + initClock(); + CPart ncp("./PCS","a.cpp","A"); + void *a = main_pool.bv_malloc(2.0); + void *b = main_pool.bv_malloc(3.5); + void *c = main_pool.bv_malloc(5); + ncp.AddCPArgsIn(a); + ncp.AddCPArgsIn(b); + ncp.AddCPArgsIn(c); + ncp.Run(); + void *oa = ncp.args_out[0]; + printf("%d",*((int *)oa)); + main_pool.b_free(a); + main_pool.b_free(b); + main_pool.b_free(c); + return 0; +} + + + diff --git a/memory.h b/memory.h index 51f27ed..9c0d20a 100644 --- a/memory.h +++ b/memory.h @@ -11,12 +11,18 @@ #include "type.h" - - struct block_info{ uint32_t size = 0; int lock = 0; bool pted = false; + void *pvle = nullptr; + block_info(uint32_t size,void *pvle){ + this->size = size; + this->pvle = pvle; + } + block_info(){ + + } }; class BlocksPool{ @@ -27,9 +33,32 @@ public: void *b_malloc(uint32_t size){ void *ptr = malloc(size); if(ptr == nullptr) return nullptr; - blocks_list.insert({ptr,{size,1}}); + + block_info bifo; + bifo.size = size; + bifo.lock = 1; + bifo.pted = false; + bifo.pvle = ptr; + + blocks_list.insert(pair(ptr,bifo)); return ptr; } + + template + void *bv_malloc(T value){ + T *pvalue = (T *)b_malloc(sizeof(T)); + *pvalue = T(value); + return pvalue; + } + + void *bp_malloc(uint32_t size, void *ptvle){ + void *pvalue = b_malloc(size); + memcpy(pvalue, ptvle, size); + return pvalue; + } + uint32_t size(void *ptr){ + return blocks_list.find(ptr)->second.size; + } // 标记使用某内存块 void *b_get(void *ptr){ auto blk = blocks_list.find(ptr);