diff --git a/.gitattributes b/.gitattributes index 70c1e045b83b0e8a32d1a72223690622cbe32db6..17e4c6b79bf51b81589338f151a7ef1f7f4026ad 100644 --- a/.gitattributes +++ b/.gitattributes @@ -323,6 +323,18 @@ libMEDSannotation/src/MEDS_Register.cpp -text libMEDSannotation/src/MEDS_SafeFuncAnnotation.cpp -text libMEDSannotation/src/Makefile.in -text libMEDSannotation/src/VirtualOffset.cpp -text +libStructDiv/SConscript -text +libStructDiv/SConstruct -text +libStructDiv/include/filebased.h -text +libStructDiv/include/libStructDiv.h -text +libStructDiv/include/structured_diversity.h -text +libStructDiv/src/SConscript -text +libStructDiv/src/SConstruct -text +libStructDiv/src/filebased.cpp -text +libStructDiv/src/structured_diversity.cpp -text +libStructDiv/test/SConscript -text +libStructDiv/test/SConstruct -text +libStructDiv/test/simple_sd_driver.cpp -text libtransform/Makefile -text libtransform/SConscript -text libtransform/SConstruct -text diff --git a/SConscript b/SConscript index 4c3b86e710caa7eba39ffc7a7b425640a81f1aea..072cdd25ed10c62b0482cffdd1547a049f563734 100644 --- a/SConscript +++ b/SConscript @@ -79,6 +79,7 @@ libMEDSannotation=SConscript("libMEDSannotation/SConscript", variant_dir='scons_ libxform=SConscript("xform/SConscript", variant_dir='scons_build/libxform') libtransform=SConscript("libtransform/SConscript", variant_dir='scons_build/libtransform') libIRDB=SConscript("libIRDB/SConscript", variant_dir='scons_build/libIRDB') +libStructDiv=SConscript("libStructDiv/SConscript", variant_dir='scons_build/libStructDiv') if 'build_tools' not in env or env['build_tools'] is None or int(env['build_tools']) == 1: SConscript("tools/SConscript", variant_dir='scons_build/tools') diff --git a/libStructDiv/SConscript b/libStructDiv/SConscript new file mode 100644 index 0000000000000000000000000000000000000000..9a892bbbe37ce72b3e30aa45009940def655d08a --- /dev/null +++ b/libStructDiv/SConscript @@ -0,0 +1,7 @@ +import os + +Import('env') + + +SConscript("src/SConscript") +SConscript("test/SConscript") diff --git a/libStructDiv/SConstruct b/libStructDiv/SConstruct new file mode 100644 index 0000000000000000000000000000000000000000..c0dd68a00d406b0148a93709cf916ad6d05f282c --- /dev/null +++ b/libStructDiv/SConstruct @@ -0,0 +1,6 @@ + + + +env=Environment() +Export('env') +SConscript("SConscript") diff --git a/libStructDiv/include/filebased.h b/libStructDiv/include/filebased.h new file mode 100644 index 0000000000000000000000000000000000000000..0c6cbd0bae792fd090cd4c72c49d9793169853c9 --- /dev/null +++ b/libStructDiv/include/filebased.h @@ -0,0 +1,30 @@ +#ifndef sd_filebased_h +#define sd_filebased_h + +#include <string> +#include <structured_diversity.h> + +namespace libStructDiv +{ + +using namespace std; + + +class FileBased_StructuredDiversity_t : public StructuredDiversity_t +{ + public: + + FileBased_StructuredDiversity_t(string key, int varid, int total_variants, string p_config); + + + protected: + virtual vector<string> DoBarrier(string value); + + string m_shared_dir; + int m_barrier_count; + +}; + +} + +#endif diff --git a/libStructDiv/include/libStructDiv.h b/libStructDiv/include/libStructDiv.h new file mode 100644 index 0000000000000000000000000000000000000000..d643a2a135634806cc4e050736d26f9ecbb0dd03 --- /dev/null +++ b/libStructDiv/include/libStructDiv.h @@ -0,0 +1,6 @@ +#ifndef SD_STRUCTDIV_H +#define SD_STRUCTDIV_H + +#include <structured_diversity.h> + +#endif diff --git a/libStructDiv/include/structured_diversity.h b/libStructDiv/include/structured_diversity.h new file mode 100644 index 0000000000000000000000000000000000000000..121a14a7fc2571c7e50a2586040055f94d23be16 --- /dev/null +++ b/libStructDiv/include/structured_diversity.h @@ -0,0 +1,80 @@ +#ifndef SD_SDBASE_H +#define SD_SDBASE_H + +#include <string> +#include <vector> +#include <assert.h> +#include <sstream> + +namespace libStructDiv +{ + +using namespace std; + + +class StructuredDiversity_t +{ + public: + + // STatic factory + static StructuredDiversity_t* factory(string key, string p_ipc_config); + + + // cannot use directly since there are abstract methods. + // use from children classes. + StructuredDiversity_t(string p_key, int p_variant_num, int p_total_variants) : + m_variant_num(p_variant_num), m_total_variants(p_total_variants), m_key(p_key) + { + // nothing else to do. + } + + + // Perform a barrier of type T. T should be marshable + // via the << and >> operators. To avoid this, the caller can self-marshal + // (Will recommends a protocol buffer package for self-marshalling) + // and invoke Barrier with a string. + template<class T> vector<T> Barrier(T value) + { + /* marshal value into stream s */ + stringstream s; + s<<value; + + // pass marshalled value to DoBarrier + const vector<string> &string_res=DoBarrier(s.str()); + + assert(string_res.size()==m_total_variants); + + /* declare a result */ + vector<T> t_res; + + // for each item + for(int i=0;i<m_total_variants;i++) + { + stringstream t; + T res; + t.str(string_res[i]); + t>>res; + t_res.push_back(res); + } + + return t_res; + } + + + + // Getters that most cfar things will need. + int GetVariantID() const { return m_variant_num; } + int GetNumberOfVariants() const { return m_total_variants; } + string GetKey() const { return m_key; } + + protected: + virtual vector<string> DoBarrier(string value)=0; + + int m_variant_num; + int m_total_variants; + string m_key; + +}; + +} +#endif diff --git a/libStructDiv/src/SConscript b/libStructDiv/src/SConscript new file mode 100644 index 0000000000000000000000000000000000000000..8b2ecd47a9fbaaa02583a43d8926fe258e8b2fad --- /dev/null +++ b/libStructDiv/src/SConscript @@ -0,0 +1,22 @@ +import os + + + +Import('env') +myenv=env.Clone() +myenv.Replace(SECURITY_TRANSFORMS_HOME=os.environ['SECURITY_TRANSFORMS_HOME']) + +files="filebased.cpp structured_diversity.cpp" + +cpppath=''' + $SECURITY_TRANSFORMS_HOME/libStructDiv/include/ + ''' + + +LIBPATH="$SECURITY_TRANSFORMS_HOME/lib" + +myenv=myenv.Clone(CPPPATH=Split(cpppath)) +lib=myenv.Library("StructDiv", Split(files)) +install=myenv.Install("$SECURITY_TRANSFORMS_HOME/lib/", lib) +Default(install) + diff --git a/libStructDiv/src/SConstruct b/libStructDiv/src/SConstruct new file mode 100644 index 0000000000000000000000000000000000000000..c96332f0422ad5df0853931209219d9a2e20bc17 --- /dev/null +++ b/libStructDiv/src/SConstruct @@ -0,0 +1,6 @@ + + + +env=Environment() +Export('env') +lib=SConscript("SConscript") diff --git a/libStructDiv/src/filebased.cpp b/libStructDiv/src/filebased.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0c397b58d314950402396cbf94bd7e975a1c24e9 --- /dev/null +++ b/libStructDiv/src/filebased.cpp @@ -0,0 +1,117 @@ + +#include <string> +#include <structured_diversity.h> +#include <filebased.h> +#include <fstream> +#include <iostream> +#include <stdlib.h> + + + +#if defined(__linux__) +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#endif + +using namespace std; +using namespace libStructDiv; + +template<typename T> std::string toString(const T& value) +{ + std::ostringstream oss; + oss << value; + return oss.str(); +} + + +FileBased_StructuredDiversity_t::FileBased_StructuredDiversity_t(string key, int varid, int total_variants, string p_config) + : StructuredDiversity_t(key, varid, total_variants), m_barrier_count(0) +{ + + assert(varid>=0 && varid<total_variants); + +#if defined(__linux__) + // assume p_config, which previously started with "dir://" already has the protocol stripped. + m_shared_dir=p_config; + + // check path exists. + struct stat info; + if( stat(m_shared_dir.c_str(), &info ) != 0 ) + { + // dir doesn't exist, make it. + if(mkdir(m_shared_dir.c_str(),0755)!=0) + { + perror("FileBased_StructuredDiversity_t::FileBased_StructuredDiversity_t"); + cerr<<"Cannot create dir:"<<endl; + exit(1); + } + } + else + { + // dir exists, + // remove any old Barriers file for my variant.. + string base_filespec=m_shared_dir+"/Barriers_"+GetKey()+"_*_"+toString(GetVariantID())+".*"; + string rm_cmd="/bin/rm -f "+base_filespec; + int res=system(rm_cmd.c_str()); + if(res!=0) + { + perror("FileBased_StructuredDiversity_t::FileBased_StructuredDiversity_t"); + cerr<<"Cannot remove files, cmd="<<rm_cmd<<endl; + exit(1); + } + + + } +#else + assert(0); // filesystem sharing not implement on non-linux platforms yet +#endif + +} + + +bool fexists(const char *filename) { + ifstream ifile(filename); + return ifile; +} + +vector<string> FileBased_StructuredDiversity_t::DoBarrier(string value) +{ + string base_filename=m_shared_dir+"/Barriers_"+GetKey()+"_"+toString(m_barrier_count)+"_"+toString(GetVariantID()); + string data_filename=base_filename+".data"; + string done_filename=base_filename+".done"; + + vector<string> vres; + + + ofstream data_file(data_filename.c_str()); + data_file<<value; + data_file.close(); + + ofstream done_file(done_filename.c_str()); + done_file<<1; + done_file.close(); + + for(int i=0;i<GetNumberOfVariants();i++) + { + string var_base_filename=m_shared_dir+"/Barriers_"+GetKey()+"_"+toString(m_barrier_count)+"_"+toString(i); + string var_data_filename=var_base_filename+".data"; + string var_done_filename=var_base_filename+".done"; + + while(!fexists(var_done_filename.c_str())) + sleep(1); + + ifstream infile(var_data_filename.c_str()); + string res; + infile>>res; + infile.close(); + vres.push_back(res); + } + + // next time, we'll use different file names. + m_barrier_count++; + + return vres; +} + + diff --git a/libStructDiv/src/structured_diversity.cpp b/libStructDiv/src/structured_diversity.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d5b41905b1b11c7eed40751d752002ca30943e4c --- /dev/null +++ b/libStructDiv/src/structured_diversity.cpp @@ -0,0 +1,67 @@ + + +#include <string> +#include <sstream> +#include <iostream> +#include <stdlib.h> +#include <assert.h> + +#include <libStructDiv.h> +#include <filebased.h> + + +using namespace std; +using namespace libStructDiv; + +static string get_next_field(string& input, string delim, bool& success) +{ + success=false; + + size_t pos=input.find(delim, 0); + + if(pos==string::npos) + return string(); // report failure. + + string rest=input.substr(pos+delim.length()); + string beginning=input.substr(0,pos); + + + input=rest; // set output parameter. + success=true; // report success. + return beginning; // return the field we parsed out. +} + + +StructuredDiversity_t* StructuredDiversity_t::factory(string key, string p_ipc_config) +{ + string parse_string=p_ipc_config; + bool success=true; + string var_id=get_next_field(parse_string,":", success); + if(!success) { cout<<"cannot parse variant id from "<<p_ipc_config<<". Expected format: var_id:tot_vars:url"<<endl;exit(1);} + string tot_vars=get_next_field(parse_string,":", success); + if(!success) { cout<<"cannot parse total # of variants from "<<p_ipc_config<<". Expected format: var_id:tot_vars:url"<<endl;exit(1);} + string protocol_type=get_next_field(parse_string,"://", success); + if(!success) { cout<<"cannot protocol from "<<p_ipc_config<<". Expected format: var_id:tot_vars:protocol://path"<<endl;exit(1);} + string config=parse_string; + + + cout<<"Varid: "<<var_id<<endl; + cout<<"Total Variants: "<<tot_vars<<endl; + cout<<"Protocol Type: '"<<protocol_type<<"'"<<endl; + cout<<"config: "<<config<<endl; + + if(protocol_type=="dir") + { + return new FileBased_StructuredDiversity_t(key, strtoul(var_id.c_str(),0,0), strtoul(tot_vars.c_str(),0,0), config); + } + else + { + cerr<<"Cannot parse '"<<protocol_type<<"' k into a protocol name."<<endl; + exit(1); + } + + + + +} + diff --git a/libStructDiv/test/SConscript b/libStructDiv/test/SConscript new file mode 100644 index 0000000000000000000000000000000000000000..bf25fe263c0fd005b85c2274fed5e08a09f5519c --- /dev/null +++ b/libStructDiv/test/SConscript @@ -0,0 +1,27 @@ +import os + + +Import('env') +myenv=env.Clone() +myenv.Replace(SECURITY_TRANSFORMS_HOME=os.environ['SECURITY_TRANSFORMS_HOME']) + +cpppath=''' + $SECURITY_TRANSFORMS_HOME/libStructDiv/include + ''' + +LIBPATH="$SECURITY_TRANSFORMS_HOME/lib" +LIBS=Split( "StructDiv" ) + +# add cpp path +myenv=myenv.Clone(CPPPATH=Split(cpppath)) + + +pgms="simple_sd_driver" +for i in Split(pgms): + pgm=myenv.Program(target=i+".exe", source=Split(i+".cpp"), LIBPATH=LIBPATH, LIBS=LIBS) + install=myenv.Install("$SECURITY_TRANSFORMS_HOME/libStructDiv/test/", pgm) + Default(install) + + + + diff --git a/libStructDiv/test/SConstruct b/libStructDiv/test/SConstruct new file mode 100644 index 0000000000000000000000000000000000000000..c96332f0422ad5df0853931209219d9a2e20bc17 --- /dev/null +++ b/libStructDiv/test/SConstruct @@ -0,0 +1,6 @@ + + + +env=Environment() +Export('env') +lib=SConscript("SConscript") diff --git a/libStructDiv/test/simple_sd_driver.cpp b/libStructDiv/test/simple_sd_driver.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2b9f3f4f8bed365b0fda70f53b80a9aeb54c211e --- /dev/null +++ b/libStructDiv/test/simple_sd_driver.cpp @@ -0,0 +1,54 @@ + +#include <libStructDiv.h> + +#include <iostream> +#include <stdlib.h> +#include <libgen.h> + + +using namespace std; +using namespace libStructDiv; + + + +template<class t> void print_res(int round, StructuredDiversity_t* p, const vector<t> &res) +{ + for(int i=0;i<res.size();i++) + cout<<"round="<<round<<" myid="<<p->GetVariantID()<<":res["<<i<<"]="<<res[i]<<endl; +} + +int main(int argc, char* argv[]) +{ + if(argc!=2) + { + cerr<<"Usage: "<<argv[0]<<" varId:totVars:url"<<endl; + exit(1); + } + + StructuredDiversity_t* p=StructuredDiversity_t::factory(basename(argv[0]), argv[1]); + + int sign=1; + if(p->GetVariantID()==1) + sign=-sign; + + for(int i=1;i<10;i++) + { + + if( i&1 ) + { + const vector<double> &res=p->Barrier<double>((3.14+i)*sign); + print_res(i,p,res); + } + else + { + const vector<int> &res=p->Barrier<int>(i *sign ); + print_res(i,p,res); + } + + } + + + delete p; + + return 0; +}