From 4c5736db5ef0dd49978195fa31ff258c6b01bd35 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 10 Mar 2016 18:18:50 +0100 Subject: [PATCH] works for get setttings and for loadsettingsfile --- .../multiSlsDetector/multiSlsDetector.cpp | 70 ++++++++++++----- .../slsDetector/slsDetector.cpp | 4 +- slsDetectorSoftware/threadFiles/Multi.cpp | 10 +-- slsDetectorSoftware/threadFiles/Task.h | 78 ++++++++++++++----- .../threadFiles/ThreadPool.cpp | 5 +- 5 files changed, 118 insertions(+), 49 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index de722afef..aa8f25aa5 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -293,10 +293,14 @@ int multiSlsDetector::createThreadPool(){ cerr << "Failed to initialize thread pool!" << endl; return FAIL; case 1: +#ifdef VERBOSE cout << "Not initializing threads, only one detector" << endl; +#endif break; default: +#ifdef VERBOSE cout << "Initialized Threadpool" << endl; +#endif break; } return OK; @@ -306,7 +310,9 @@ void multiSlsDetector::destroyThreadPool(){ if(threadpool){ threadpool->destroy_threadpool(); threadpool=0; +#ifdef VERBOSE cout<<"Destroyed Threadpool"<(&slsDetector::getSettings, + Task* task = new Task(new func1_t(&slsDetector::getSettings, detectors[idet],-1,iret[idet])); threadpool->add_task(task); } } threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idetgetSettings();cout<<"ret1:"<getErrorMask()) - setErrorMask(getErrorMask()|(1<currentSettings=(detectorSettings)ret; return (detectorSettings)ret; } @@ -3837,7 +3831,7 @@ int multiSlsDetector::executeTrimming(trimMode mode, int par1, int par2, int imo int multiSlsDetector::loadSettingsFile(string fname, int imod) { - int id, im, ret; + int id, im, ret=-100,ret1=-1; if (decodeNMod(imod, id, im)>=0) { if (detectors[id]) { @@ -3847,13 +3841,47 @@ int multiSlsDetector::loadSettingsFile(string fname, int imod) { return ret; } } else if (imod<0) { + + + if(!threadpool){ + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + }else{ + //return storage values + int* iret[thisMultiDetector->numberOfDetectors]; + for(int idet=0; idetnumberOfDetectors; idet++){ + if(detectors[idet]){ + iret[idet]= new int(-1); + Task* task = new Task(new func2_t (&slsDetector::loadSettingsFile, + detectors[idet],fname,imod,iret[idet])); + threadpool->add_task(task); + } + } + threadpool->wait_for_tasks_to_complete(); + for(int idet=0; idetnumberOfDetectors; idet++){ + if(detectors[idet]){ + if(iret[idet] != NULL){ + ret1 = *iret[idet]; + delete iret[idet]; + } + if(detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask()|(1<numberOfDetectors; idet++) { if (detectors[idet]) { ret=detectors[idet]->loadSettingsFile(fname, imod); if(detectors[idet]->getErrorMask()) setErrorMask(getErrorMask()|(1<ReceiveDataOnly(&retval,sizeof(retval)); thisDetector->currentSettings=(detectorSettings)retval; -//#ifdef VERBOSE +#ifdef VERBOSE std::cout<< "Settings are "<< retval << std::endl; -//#endif +#endif } disconnectControl(); if (ret==FORCE_UPDATE) diff --git a/slsDetectorSoftware/threadFiles/Multi.cpp b/slsDetectorSoftware/threadFiles/Multi.cpp index 7740de5fe..02e34438e 100644 --- a/slsDetectorSoftware/threadFiles/Multi.cpp +++ b/slsDetectorSoftware/threadFiles/Multi.cpp @@ -94,7 +94,7 @@ int Multi::printNumber(int inum){ iret[i]= new int(-1); //func_t * binder = // new func_t(&Single::printNumber,singles[i],inum,iret[i]); - Task* task = new Task(new func_t(&Single::printNumber,singles[i],inum,iret[i])); + Task* task = new Task(new func1_t(&Single::printNumber,singles[i],inum,iret[i])); threadpool->add_task(task); } threadpool->wait_for_tasks_to_complete(); @@ -125,8 +125,8 @@ string Multi::printString(string s){ for(int i=0;i* binder = - new func_t(&Single::printString,singles[i],s,sret[i]); + func1_t * binder = + new func1_t(&Single::printString,singles[i],s,sret[i]); Task* task = new Task(binder); threadpool->add_task(task); } @@ -164,8 +164,8 @@ char* Multi::printCharArray(char a[]){ for(int i=0;i* binder = - new func_t (&Single::printCharArray,singles[i],a,sret[i]); + func1_t * binder = + new func1_t (&Single::printCharArray,singles[i],a,sret[i]); Task* task = new Task(binder); threadpool->add_task(task); } diff --git a/slsDetectorSoftware/threadFiles/Task.h b/slsDetectorSoftware/threadFiles/Task.h index 3f096382e..ad907c187 100644 --- a/slsDetectorSoftware/threadFiles/Task.h +++ b/slsDetectorSoftware/threadFiles/Task.h @@ -18,13 +18,12 @@ class slsDetector; template -class func_t{ +class func1_t{ public: - func_t(_Ret (_Class::*fn)(_Arg1),_Class* ptr,_Arg1 arg1, _Store* sto):m_fn(fn),m_ptr(ptr),m_arg1(arg1),m_store(sto){} - ~func_t() {} - + func1_t(_Ret (_Class::*fn)(_Arg1),_Class* ptr,_Arg1 arg1, _Store* sto): + m_fn(fn),m_ptr(ptr),m_arg1(arg1),m_store(sto){} + ~func1_t() {} void operator()() const {*m_store = ((m_ptr->*m_fn)(m_arg1));} - private: _Class* m_ptr; _Ret (_Class::*m_fn)(_Arg1); @@ -32,22 +31,53 @@ private: _Store* m_store; }; +template +class func2_t{ +public: + func2_t(_Ret (_Class::*fn)(_Arg1,_Arg2),_Class* ptr,_Arg1 arg1,_Arg2 arg2,_Store* sto): + m_fn(fn),m_ptr(ptr),m_arg1(arg1),m_arg2(arg2),m_store(sto){} + ~func2_t() {} + void operator()() const {*m_store = ((m_ptr->*m_fn)(m_arg1,m_arg2));} +private: + _Class* m_ptr; + _Ret (_Class::*m_fn)(_Arg1,_Arg2); + _Arg1 m_arg1; + _Arg2 m_arg2; + _Store* m_store; +}; + +template +class func4_t{ +public: + func4_t(_Ret (_Class::*fn)(_Arg1,_Arg2,_Arg3,_Arg4),_Class* ptr,_Arg1 arg1,_Arg2 arg2,_Arg3 arg3,_Arg4 arg4,_Store* sto): + m_fn(fn),m_ptr(ptr),m_arg1(arg1),m_arg2(arg2),m_arg3(arg3),m_arg4(arg4),m_store(sto){} + ~func4_t() {} + void operator()() const {*m_store = ((m_ptr->*m_fn)(m_arg1,m_arg2,m_arg3,m_arg4));} +private: + _Class* m_ptr; + _Ret (_Class::*m_fn)(_Arg1,_Arg2,_Arg3,_Arg4); + _Arg1 m_arg1; + _Arg2 m_arg2; + _Arg3 m_arg3; + _Arg4 m_arg4; + _Store* m_store; +}; class Task: public virtual slsDetectorDefs{ public: - Task(func_t * t):m_int1(t),m_string1(0),m_chararr1(0), - m_settings(0){}; - Task(func_t * t): m_int1(0),m_string1(t),m_chararr1(0), - m_settings(0){}; - Task(func_t * t):m_int1(0),m_string1(0),m_chararr1(t), - m_settings(0){}; + Task(func1_t * t): + m_int1(t),m_string1(0),m_chararr1(0),m_f2_1(0),m_settings(0){}; + Task(func1_t * t): + m_int1(0),m_string1(t),m_chararr1(0),m_f2_1(0),m_settings(0){}; + Task(func1_t * t): + m_int1(0),m_string1(0),m_chararr1(t),m_f2_1(0),m_settings(0){}; + Task(func2_t * t): + m_int1(0),m_string1(0),m_chararr1(0),m_f2_1(t),m_settings(0){}; - //settings - Task(func_t * t): - m_int1(0),m_string1(0),m_chararr1(0), - m_settings(t) - {}; + //specialized + Task(func1_t * t): + m_int1(0),m_string1(0),m_chararr1(0),m_f2_1(0),m_settings(t){}; ~Task(){} @@ -55,14 +85,22 @@ public: if(m_int1) (*m_int1)(); else if(m_string1) (*m_string1)(); else if(m_chararr1) (*m_chararr1)(); + + else if(m_f2_1) (*m_f2_1)(); + + //specialized else if(m_settings) (*m_settings)(); } private: - func_t * m_int1; - func_t * m_string1; - func_t * m_chararr1; - func_t * m_settings; + func1_t * m_int1; + func1_t * m_string1; + func1_t * m_chararr1; + func2_t * m_f2_1; + + //specialized + func1_t * m_settings; + }; diff --git a/slsDetectorSoftware/threadFiles/ThreadPool.cpp b/slsDetectorSoftware/threadFiles/ThreadPool.cpp index bb5a06419..ee1e5beaa 100644 --- a/slsDetectorSoftware/threadFiles/ThreadPool.cpp +++ b/slsDetectorSoftware/threadFiles/ThreadPool.cpp @@ -3,7 +3,9 @@ ThreadPool::ThreadPool(int pool_size) : m_pool_size(pool_size) { +#ifdef VERBOSE cout << "Constructed ThreadPool of size " << m_pool_size << endl; +#endif m_tasks_loaded = false; thread_started = false; current_thread_number = -1; @@ -49,8 +51,9 @@ int ThreadPool::initialize_threadpool() m_threads.push_back(tid); while(!thread_started); } +#ifdef VERBOSE cout << m_pool_size << " threads created by the thread pool" << endl; - +#endif return m_pool_size; }