changed API for setting network parameter to remove memory leak, fixed lock issues in streaming print outs to gui, deleted return from threadpool in the right place

This commit is contained in:
Dhanya Maliakal 2017-06-19 14:29:45 +02:00
parent c2af014dad
commit e2e25f6e62
7 changed files with 83 additions and 69 deletions

View File

@ -1192,10 +1192,10 @@ int multiSlsDetector::setThresholdEnergy(int e_eV, int pos, detectorSettings ise
ret=*iret[idet];
else if (ret<(*iret[idet]-200) || ret>(*iret[idet]+200))
ret=-1;
delete iret[idet];
}else ret=-1;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
delete iret[idet];
}
}
}
@ -1243,10 +1243,10 @@ slsDetectorDefs::detectorSettings multiSlsDetector::getSettings(int pos) {
ret=*iret[idet];
else if (ret!=*iret[idet])
ret=GET_SETTINGS;
delete iret[idet];
}else ret=GET_SETTINGS;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
delete iret[idet];
}
}
}
@ -1291,10 +1291,10 @@ slsDetectorDefs::detectorSettings multiSlsDetector::setSettings(detectorSettings
ret=*iret[idet];
else if (ret!=*iret[idet])
ret=GET_SETTINGS;
delete iret[idet];
}else ret=GET_SETTINGS;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
delete iret[idet];
}
}
}
@ -1680,10 +1680,10 @@ int multiSlsDetector::startAndReadAllNoWait(){
if(iret[idet] != NULL){
if(*iret[idet] != OK)
ret = FAIL;
delete iret[idet];
}else ret = FAIL;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
delete iret[idet];
}
}
}
@ -3327,9 +3327,9 @@ char* multiSlsDetector::setCalDir(string s){
returns the location of the calibration files
\sa sharedSlsDetector
*/
char* multiSlsDetector::getNetworkParameter(networkParameter p) {
string multiSlsDetector::getNetworkParameter(networkParameter p) {
string s0="", s1="",s ;
string ans="";
//char ans[1000];
for (int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++) {
if (detectors[idet]) {
@ -3348,9 +3348,11 @@ char* multiSlsDetector::getNetworkParameter(networkParameter p) {
}
}
if (s1=="bad")
strcpy(ans,s0.c_str());
ans=s0;
// strcpy(ans,s0.c_str());
else
strcpy(ans,s1.c_str());
ans=s1;
// strcpy(ans,s1.c_str());
return ans;
}
@ -3359,7 +3361,7 @@ char* multiSlsDetector::getNetworkParameter(networkParameter p) {
sets the location of the calibration files
\sa sharedSlsDetector
*/
char* multiSlsDetector::setNetworkParameter(networkParameter p, string s){
string multiSlsDetector::setNetworkParameter(networkParameter p, string s){
if (s.find('+')==string::npos) {
@ -3371,7 +3373,7 @@ char* multiSlsDetector::setNetworkParameter(networkParameter p, string s){
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){
if(detectors[idet]){
sret[idet]=new string("error");
Task* task = new Task(new func2_t <char*,slsDetector,networkParameter,string,string>(&slsDetector::setNetworkParameter,
Task* task = new Task(new func2_t <string,slsDetector,networkParameter,string,string>(&slsDetector::setNetworkParameter,
detectors[idet],p,s,sret[idet]));
threadpool->add_task(task);
}
@ -3380,6 +3382,8 @@ char* multiSlsDetector::setNetworkParameter(networkParameter p, string s){
threadpool->wait_for_tasks_to_complete();
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){
if(detectors[idet]){
if(sret[idet]!= NULL)
delete sret[idet];
//doing nothing with the return values
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
@ -4028,10 +4032,10 @@ int multiSlsDetector::executeTrimming(trimMode mode, int par1, int par2, int imo
ret=*iret[idet];
else if (ret!=*iret[idet])
ret=-1;
delete iret[idet];
}else ret=-1;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
delete iret[idet];
}
}
}
@ -4126,10 +4130,10 @@ int multiSlsDetector::loadSettingsFile(string fname, int imod) {
if(iret[idet] != NULL){
if(*iret[idet] != OK)
ret = FAIL;
delete iret[idet];
}else ret = FAIL;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
delete iret[idet];
}
}
}
@ -4203,10 +4207,10 @@ int multiSlsDetector::setAllTrimbits(int val, int imod){
ret=*iret[idet];
else if (ret!=*iret[idet])
ret=-1;
delete iret[idet];
}else ret=-1;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
delete iret[idet];
}
}
}
@ -4251,10 +4255,10 @@ int multiSlsDetector::loadCalibrationFile(string fname, int imod) {
if(iret[idet] != NULL){
if(*iret[idet] != OK)
ret = FAIL;
delete iret[idet];
}else ret = FAIL;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
delete iret[idet];
}
}
}
@ -4535,6 +4539,7 @@ int multiSlsDetector::writeConfigurationFile(string const fname){
for (int ia=0; ia<100; ia++) {
args[ia]=new char[1000];
}
int ret=OK;
@ -4577,15 +4582,19 @@ int multiSlsDetector::writeConfigurationFile(string const fname){
delete cmd;
outfile.close();
} else {
std::cout<< "Error opening configuration file " << fname << " for writing" << std::endl;
return FAIL;
}
#ifdef VERBOSE
std::cout<< "wrote " <<iline << " lines to configuration file " << std::endl;
#endif
} else {
std::cout<< "Error opening configuration file " << fname << " for writing" << std::endl;
ret = FAIL;
}
for (int ia=0; ia<100; ia++) {
delete [] args[ia];
}
return OK;
return ret;
};
@ -4928,10 +4937,10 @@ int multiSlsDetector::startReceiver(){
if(iret[idet] != NULL){
if(*iret[idet] != OK)
ret = FAIL;
delete iret[idet];
}else ret = FAIL;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
delete iret[idet];
}
}
}
@ -4990,10 +4999,10 @@ int multiSlsDetector::stopReceiver(){
if(iret[idet] != NULL){
if(*iret[idet] != OK)
ret = FAIL;
delete iret[idet];
}else ret = FAIL;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
delete iret[idet];
}
}
}
@ -5160,7 +5169,7 @@ int multiSlsDetector::createReceivingDataSockets(const bool destroy){
for(int i=0;i<numSockets; ++i){
uint32_t portnum = DEFAULT_ZMQ_PORTNO +
(i/numSocketsPerDetector)*numSocketsPerDetector + (i%numSocketsPerDetector);
zmqSocket[i] = new ZmqSocket(detectors[i/numSocketsPerDetector]->getReceiver(), portnum);
zmqSocket[i] = new ZmqSocket(detectors[i/numSocketsPerDetector]->getReceiver().c_str(), portnum);
if (zmqSocket[i]->IsError()) {
cprintf(RED, "Error: Could not create Zmq socket on port %d\n", portnum);
createReceivingDataSockets(true);
@ -5866,10 +5875,10 @@ int multiSlsDetector::pulsePixel(int n,int x,int y) {
ret=*iret[idet];
else if (ret!=*iret[idet])
ret=-1;
delete iret[idet];
}else ret=-1;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
delete iret[idet];
}
}
}
@ -5903,10 +5912,10 @@ int multiSlsDetector::pulsePixelNMove(int n,int x,int y) {
ret=*iret[idet];
else if (ret!=*iret[idet])
ret=-1;
delete iret[idet];
}else ret=-1;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
delete iret[idet];
}
}
}
@ -5940,10 +5949,10 @@ int multiSlsDetector::pulseChip(int n) {
ret=*iret[idet];
else if (ret!=*iret[idet])
ret=-1;
delete iret[idet];
}else ret=-1;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
delete iret[idet];
}
}
}

View File

@ -980,8 +980,8 @@ class multiSlsDetector : public slsDetectorUtils {
char* setCalDir(string s);
char *getNetworkParameter(networkParameter);
char *setNetworkParameter(networkParameter, std::string);
string getNetworkParameter(networkParameter);
string setNetworkParameter(networkParameter, std::string);
int setPort(portType, int);
int lockServer(int);

View File

@ -539,14 +539,19 @@ int slsDetector::initializeDetectorSize(detectorType type) {
/** set receiver udp port for Eiger */
thisDetector->receiverUDPPort2=DEFAULT_UDP_PORTNO+1;
/** set receiver ip address/hostname */
memset(thisDetector->receiver_hostname,0,MAX_STR_LENGTH);
strcpy(thisDetector->receiver_hostname,"none");
/** set receiver udp ip address */
memset(thisDetector->receiverUDPIP,0,MAX_STR_LENGTH);
strcpy(thisDetector->receiverUDPIP,"none");
/** set receiver udp mac address */
memset(thisDetector->receiverUDPMAC,0,MAX_STR_LENGTH);
strcpy(thisDetector->receiverUDPMAC,"none");
/** set detector mac address */
memset(thisDetector->detectorMAC,0,MAX_STR_LENGTH);
strcpy(thisDetector->detectorMAC,DEFAULT_DET_MAC);
/** set detector ip address */
memset(thisDetector->detectorIP,0,MAX_STR_LENGTH);
strcpy(thisDetector->detectorIP,DEFAULT_DET_IP);
/** sets onlineFlag to OFFLINE_FLAG */
@ -5813,7 +5818,7 @@ int slsDetector::exitServer(){
};
char* slsDetector::setNetworkParameter(networkParameter index, string value) {
string slsDetector::setNetworkParameter(networkParameter index, string value) {
int i;
switch (index) {
@ -5854,7 +5859,7 @@ char* slsDetector::setNetworkParameter(networkParameter index, string value) {
char* slsDetector::getNetworkParameter(networkParameter index) {
string slsDetector::getNetworkParameter(networkParameter index) {
switch (index) {
case DETECTOR_MAC:
@ -5889,7 +5894,7 @@ char* slsDetector::getNetworkParameter(networkParameter index) {
}
char* slsDetector::setDetectorMAC(string detectorMAC){
string slsDetector::setDetectorMAC(string detectorMAC){
if(detectorMAC.length()==17){
if((detectorMAC[2]==':')&&(detectorMAC[5]==':')&&(detectorMAC[8]==':')&&
(detectorMAC[11]==':')&&(detectorMAC[14]==':')){
@ -5908,12 +5913,12 @@ char* slsDetector::setDetectorMAC(string detectorMAC){
std::cout << "Warning: server MAC Address should be in xx:xx:xx:xx:xx:xx format" << std::endl;
}
return thisDetector->detectorMAC;
return string(thisDetector->detectorMAC);
};
char* slsDetector::setDetectorIP(string detectorIP){
string slsDetector::setDetectorIP(string detectorIP){
struct sockaddr_in sa;
//taking function arguments into consideration
if(detectorIP.length()){
@ -5931,12 +5936,12 @@ char* slsDetector::setDetectorIP(string detectorIP){
}
}
}
return thisDetector->detectorIP;
return string(thisDetector->detectorIP);
}
char* slsDetector::setReceiver(string receiverIP){
string slsDetector::setReceiver(string receiverIP){
if(getRunStatus()==RUNNING){
cprintf(RED,"Acquisition already running, Stopping it.\n");
stopAcquisition();
@ -6002,16 +6007,18 @@ char* slsDetector::setReceiver(string receiverIP){
setUDPConnection();
if(thisDetector->myDetectorType == EIGER)
enableTenGigabitEthernet(thisDetector->tenGigaEnable);
//datastreamenable
//fifodepth
}
}
return thisDetector->receiver_hostname;
return string(thisDetector->receiver_hostname);
}
char* slsDetector::setReceiverUDPIP(string udpip){
string slsDetector::setReceiverUDPIP(string udpip){
struct sockaddr_in sa;
//taking function arguments into consideration
if(udpip.length()){
@ -6022,21 +6029,22 @@ char* slsDetector::setReceiverUDPIP(string udpip){
std::cout << "Warning: Receiver UDP IP Address should be VALID and in xxx.xxx.xxx.xxx format" << std::endl;
}else{
strcpy(thisDetector->receiverUDPIP,udpip.c_str());
if(!strcmp(thisDetector->receiver_hostname,"none"))
if(!strcmp(thisDetector->receiver_hostname,"none")) {
std::cout << "Warning: Receiver hostname not set yet." << endl;
}
else if(setUDPConnection()==FAIL){
std::cout<< "Warning: UDP connection set up failed" << std::endl;
}
}
}
}
return thisDetector->receiverUDPIP;
return string(thisDetector->receiverUDPIP);
}
char* slsDetector::setReceiverUDPMAC(string udpmac){
string slsDetector::setReceiverUDPMAC(string udpmac){
if(udpmac.length()!=17){
setErrorMask((getErrorMask())|(COULDNOT_SET_NETWORK_PARAMETER));
std::cout << "Warning: receiver udp mac address should be in xx:xx:xx:xx:xx:xx format" << std::endl;
@ -6057,7 +6065,7 @@ char* slsDetector::setReceiverUDPMAC(string udpmac){
}
return thisDetector->receiverUDPMAC;
return string(thisDetector->receiverUDPMAC);
}
@ -6083,9 +6091,8 @@ int slsDetector::setReceiverUDPPort2(int udpport){
}
char* slsDetector::setDetectorNetworkParameter(networkParameter index, int delay){
string slsDetector::setDetectorNetworkParameter(networkParameter index, int delay){
int fnum = F_SET_NETWORK_PARAMETER;
char* cretval = new char[MAX_STR_LENGTH];
int ret = FAIL;
int retval = -1;
char mess[MAX_STR_LENGTH]="";
@ -6114,9 +6121,10 @@ char* slsDetector::setDetectorNetworkParameter(networkParameter index, int delay
std::cout<< "Speed set to "<< retval << std::endl;
#endif
sprintf(cretval,"%d",retval);
return cretval;
ostringstream ss;
ss << retval;
string s = ss.str();
return s;
}
@ -6609,12 +6617,10 @@ int slsDetector::printReceiverConfiguration(){
std::cout << "Receiver Hostname:\t" << getNetworkParameter(RECEIVER_HOSTNAME) << std::endl;
std::cout << "Receiver UDP IP:\t" << getNetworkParameter(RECEIVER_UDP_IP) << std::endl;
std::cout << "Receiver UDP MAC:\t" << getNetworkParameter(RECEIVER_UDP_MAC) << std::endl;
std::cout << "Receiver UDP Port:\t" << getNetworkParameter(RECEIVER_UDP_PORT) << std::endl;
if(thisDetector->myDetectorType == EIGER)
std::cout << "Receiver UDP Port2:\t" << getNetworkParameter(RECEIVER_UDP_PORT2) << std::endl;
if(thisDetector->myDetectorType == EIGER)
std::cout << "Receiver UDP Port2:\t" << getNetworkParameter(RECEIVER_UDP_PORT2) << std::endl;
std::cout << std::endl;
return OK;

View File

@ -444,7 +444,7 @@ class slsDetector : public slsDetectorUtils, public energyConversion {
\returns parameter
*/
char* setNetworkParameter(networkParameter index, string value);
string setNetworkParameter(networkParameter index, string value);
/**
gets the network parameters
@ -452,7 +452,7 @@ class slsDetector : public slsDetectorUtils, public energyConversion {
\returns parameter
*/
char* getNetworkParameter(networkParameter index);
string getNetworkParameter(networkParameter index);
/* I/O */
@ -1704,36 +1704,36 @@ class slsDetector : public slsDetectorUtils, public energyConversion {
/** returns the detector MAC address\sa sharedSlsDetector */
char* getDetectorMAC() {return thisDetector->detectorMAC;};
string getDetectorMAC() {return string(thisDetector->detectorMAC);};
/** returns the detector IP address\sa sharedSlsDetector */
char* getDetectorIP() {return thisDetector->detectorIP;};
string getDetectorIP() {return string(thisDetector->detectorIP);};
/** returns the receiver IP address \sa sharedSlsDetector */
char* getReceiver() {return thisDetector->receiver_hostname;};
string getReceiver() {return string(thisDetector->receiver_hostname);};
/** returns the receiver UDP IP address \sa sharedSlsDetector */
char* getReceiverUDPIP() {return thisDetector->receiverUDPIP;};
string getReceiverUDPIP() {return string(thisDetector->receiverUDPIP);};
/** returns the receiver UDP MAC address \sa sharedSlsDetector */
char* getReceiverUDPMAC() {return thisDetector->receiverUDPMAC;};
string getReceiverUDPMAC() {return string(thisDetector->receiverUDPMAC);};
/** returns the receiver UDP IP address \sa sharedSlsDetector */
char* getReceiverUDPPort() {char *c= new char[MAX_STR_LENGTH];sprintf(c,"%d",thisDetector->receiverUDPPort); return c;};
string getReceiverUDPPort() {ostringstream ss; ss << thisDetector->receiverUDPPort; string s = ss.str(); return s;};
/** returns the receiver UDP2 for Eiger IP address \sa sharedSlsDetector */
char* getReceiverUDPPort2() {char *c= new char[MAX_STR_LENGTH];sprintf(c,"%d",thisDetector->receiverUDPPort2); return c;};
string getReceiverUDPPort2() {ostringstream ss; ss << thisDetector->receiverUDPPort2; string s = ss.str(); return s;};
/** validates the format of detector MAC address and sets it \sa sharedSlsDetector */
char* setDetectorMAC(string detectorMAC);
string setDetectorMAC(string detectorMAC);
/** validates the format of detector IP address and sets it \sa sharedSlsDetector */
char* setDetectorIP(string detectorIP);
string setDetectorIP(string detectorIP);
/** validates and sets the receiver IP address/hostname \sa sharedSlsDetector */
char* setReceiver(string receiver);
string setReceiver(string receiver);
/** validates the format of receiver udp ip and sets it \sa sharedSlsDetector */
char* setReceiverUDPIP(string udpip);
string setReceiverUDPIP(string udpip);
/** validates the format of receiver udp mac and sets it \sa sharedSlsDetector */
char* setReceiverUDPMAC(string udpmac);
string setReceiverUDPMAC(string udpmac);
/** sets the receiver udp port \sa sharedSlsDetector */
int setReceiverUDPPort(int udpport);
/** sets the receiver udp port2 for Eiger \sa sharedSlsDetector */
int setReceiverUDPPort2(int udpport);
/** sets the transmission delay for left or right port or for an entire frame*/
char* setDetectorNetworkParameter(networkParameter index, int delay);
string setDetectorNetworkParameter(networkParameter index, int delay);
/** Sets the read receiver frequency
if data required from receiver randomly readRxrFrequency=0,

View File

@ -2930,7 +2930,6 @@ string slsDetectorCommand::cmdNetworkParameter(int narg, char *args[], int actio
myDet->setNetworkParameter(t, args[1]);
return myDet->getNetworkParameter(t);
}
string slsDetectorCommand::helpNetworkParameter(int narg, char *args[], int action) {

View File

@ -171,7 +171,7 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing {
\returns parameter
*/
virtual char *getNetworkParameter(networkParameter i)=0;
virtual string getNetworkParameter(networkParameter i)=0;
/**
sets the network parameters (implemented for gotthard)
@ -180,7 +180,7 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing {
\returns parameter
*/
virtual char *setNetworkParameter(networkParameter i, string s)=0;
virtual string setNetworkParameter(networkParameter i, string s)=0;
/**
changes/gets the port number

View File

@ -126,7 +126,7 @@ public:
/* Return: int, Param: none */
Task(func0_t <int,slsDetector,int>* t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(t),m11(0),m12(0),m13(0){};
/* Return: char*, Param: networkParameter,string */
Task(func2_t <char*,slsDetector,networkParameter,string,string>* t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0),m11(t),m12(0),m13(0){};
Task(func2_t <string,slsDetector,networkParameter,string,string>* t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0),m11(t),m12(0),m13(0){};
/* Return: void, Param: none */
Task(func00_t <void,slsDetector>* t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0),m11(0),m12(t),m13(0){};
/* Return: int, Param: int,int,detectorSettings */
@ -174,7 +174,7 @@ private:
/* Return: int, Param: int */
func0_t <int,slsDetector,int>* m10;
/* Return: char*, Param: networkParameter,string */
func2_t <char*,slsDetector,networkParameter,string,string>* m11;
func2_t <string,slsDetector,networkParameter,string,string>* m11;
/* Return: void, Param: none */
func00_t <void,slsDetector>* m12;
/* Return: int, Param: int,int,detectorSettings */