MM cleanup

This commit is contained in:
Matej Sekoranja
2011-01-20 19:01:25 +01:00
parent c6d51067d1
commit d8f81d79db
10 changed files with 119 additions and 116 deletions

View File

@@ -140,12 +140,14 @@ namespace epics {
delete _sendQueueMutex;
delete _verifiedMutex;
delete _monitorMutex;
delete _responseHandler;
}
void BlockingTCPTransport::start() {
_sendThreadRunning = true;
String threadName = "TCP-receive "+inetAddressToString(
_socketAddress);
* _socketAddress);
errlogSevPrintf(errlogInfo, "Starting thread: %s",
threadName.c_str());
@@ -155,7 +157,7 @@ namespace epics {
epicsThreadStackMedium),
BlockingTCPTransport::rcvThreadRunner, this);
threadName = "TCP-send "+inetAddressToString(_socketAddress);
threadName = "TCP-send "+inetAddressToString(*_socketAddress);
errlogSevPrintf(errlogInfo, "Starting thread: %s",
threadName.c_str());
@@ -506,7 +508,7 @@ namespace epics {
errlogSevPrintf(
errlogMinor,
"Invalid header received from client %s, disconnecting...",
inetAddressToString(_socketAddress).c_str());
inetAddressToString(*_socketAddress).c_str());
close(true);
return;
}
@@ -552,7 +554,7 @@ namespace epics {
errlogMajor,
"Unknown packet type %d, received from client %s, disconnecting...",
type,
inetAddressToString(_socketAddress).c_str());
inetAddressToString(*_socketAddress).c_str());
close(true);
return;
}
@@ -690,7 +692,7 @@ namespace epics {
//errlogSevPrintf(errlogInfo,
// "Sending %d of total %d bytes in the packet to %s.",
// bytesToSend, limit,
// inetAddressToString(_socketAddress).c_str());
// inetAddressToString(*_socketAddress).c_str());
while(buffer->getRemaining()>0) {
ssize_t bytesSent = ::send(_channel,
@@ -716,7 +718,7 @@ namespace epics {
//errlogSevPrintf(errlogInfo,
// "Send buffer full for %s, waiting...",
// inetAddressToString(_socketAddress));
// inetAddressToString(*_socketAddress));
return false;
}
@@ -838,7 +840,7 @@ namespace epics {
freeSendBuffers();
errlogSevPrintf(errlogInfo, "Connection to %s closed.",
inetAddressToString(_socketAddress).c_str());
inetAddressToString(*_socketAddress).c_str());
if(_channel!=INVALID_SOCKET) {
epicsSocketDestroy(_channel);

View File

@@ -25,7 +25,7 @@ namespace epics {
short transportRevision, int16 priority) {
errlogSevPrintf(errlogInfo, "Creating datagram socket to: %s",
inetAddressToString(&bindAddress).c_str());
inetAddressToString(bindAddress).c_str());
SOCKET socket = epicsSocketCreate(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(socket==INVALID_SOCKET) {

View File

@@ -57,10 +57,11 @@ namespace epics {
delete _receiveBuffer;
delete _sendBuffer;
delete _responseHandler;
}
void BlockingUDPTransport::start() {
String threadName = "UDP-receive "+inetAddressToString(&_bindAddress);
String threadName = "UDP-receive "+inetAddressToString(_bindAddress);
errlogSevPrintf(errlogInfo, "Starting thread: %s",threadName.c_str());
@@ -82,7 +83,7 @@ namespace epics {
errlogSevPrintf(errlogInfo,
"UDP socket %s closed.",
inetAddressToString(&_bindAddress).c_str());
inetAddressToString(_bindAddress).c_str());
epicsSocketDestroy(_channel);
}
@@ -160,7 +161,7 @@ namespace epics {
if(_ignoredAddresses!=0)
{
for(size_t i = 0; i <_ignoredAddresses->size(); i++)
if(_ignoredAddresses->at(i)->ia.sin_addr.s_addr
if(_ignoredAddresses->at(i).ia.sin_addr.s_addr
==fromAddress.ia.sin_addr.s_addr) {
ignore = true;
break;
@@ -264,7 +265,7 @@ namespace epics {
for(size_t i = 0; i<_sendAddresses->size(); i++) {
buffer->flip();
int retval = sendto(_channel, buffer->getArray(),
buffer->getLimit(), 0, &(_sendAddresses->at(i)->sa),
buffer->getLimit(), 0, &(_sendAddresses->at(i).sa),
sizeof(sockaddr));
{
if(retval<0) errlogSevPrintf(errlogMajor,

View File

@@ -289,6 +289,8 @@ namespace epics {
*/
class ResponseHandler {
public:
virtual ~ResponseHandler() {}
/**
* Handle response.
* @param[in] responseFrom remote address of the responder, <code>0</code> if unknown.
@@ -504,6 +506,7 @@ namespace epics {
*/
class ResponseRequest {
public:
virtual ~ResponseRequest() {}
/**
* Get I/O ID.
@@ -540,6 +543,8 @@ namespace epics {
*/
class DataResponse : public ResponseRequest {
public:
virtual ~DataResponse() {}
/**
* Notification response.
* @param transport
@@ -559,6 +564,8 @@ namespace epics {
*/
class SubscriptionRequest /*: public ResponseRequest*/ {
public:
virtual ~SubscriptionRequest() {}
/**
* Update (e.g. after some time of unresponsiveness) - report current value.
*/

View File

@@ -66,10 +66,10 @@ namespace epics {
namespace pvAccess {
void addDefaultBroadcastAddress(InetAddrVector* v, in_port_t p) {
osiSockAddr* pNewNode = new osiSockAddr;
pNewNode->ia.sin_family = AF_INET;
pNewNode->ia.sin_addr.s_addr = htonl(INADDR_BROADCAST);
pNewNode->ia.sin_port = htons(p);
osiSockAddr pNewNode;
pNewNode.ia.sin_family = AF_INET;
pNewNode.ia.sin_addr.s_addr = htonl(INADDR_BROADCAST);
pNewNode.ia.sin_port = htons(p);
v->push_back(pNewNode);
}
@@ -84,7 +84,7 @@ namespace epics {
struct ifreq* pIfreqList;
struct ifreq* pifreq;
struct ifreq ifrBuff;
osiSockAddr* pNewNode;
osiSockAddr pNewNode;
InetAddrVector* retVector = new InetAddrVector();
@@ -157,16 +157,6 @@ namespace epics {
*/
if(ifrBuff.ifr_flags&IFF_LOOPBACK) continue;
pNewNode = new osiSockAddr;
if(pNewNode==NULL) {
errlogSevPrintf(errlogMajor,
"getBroadcastAddresses(): no memory available for configuration");
delete[] pIfreqList;
if(retVector->size()==0) addDefaultBroadcastAddress(
retVector, defaultPort);
return retVector;
}
/*
* If this is an interface that supports
* broadcast fetch the broadcast address.
@@ -186,10 +176,9 @@ namespace epics {
errlogMinor,
"getBroadcastAddresses(): net intf \"%s\": bcast addr fetch fail",
pifreq->ifr_name);
delete pNewNode;
continue;
}
pNewNode->sa = ifrBuff.ifr_broadaddr;
pNewNode.sa = ifrBuff.ifr_broadaddr;
}
#ifdef IFF_POINTOPOINT
else if(ifrBuff.ifr_flags&IFF_POINTOPOINT) {
@@ -201,10 +190,9 @@ namespace epics {
errlogMinor,
"getBroadcastAddresses(): net intf \"%s\": pt to pt addr fetch fail",
pifreq->ifr_name);
delete pNewNode;
continue;
}
pNewNode->sa = ifrBuff.ifr_dstaddr;
pNewNode.sa = ifrBuff.ifr_dstaddr;
}
#endif
else {
@@ -212,10 +200,9 @@ namespace epics {
errlogMinor,
"getBroadcastAddresses(): net intf \"%s\": not point to point or bcast?",
pifreq->ifr_name);
delete pNewNode;
continue;
}
pNewNode->ia.sin_port = htons(defaultPort);
pNewNode.ia.sin_port = htons(defaultPort);
retVector->push_back(pNewNode);
}
@@ -296,15 +283,15 @@ namespace epics {
size_t subEnd;
while((subEnd = list.find(' ', subStart))!=String::npos) {
String address = list.substr(subStart, (subEnd-subStart));
osiSockAddr* addr = new osiSockAddr;
aToIPAddr(address.c_str(), defaultPort, &addr->ia);
osiSockAddr addr;
aToIPAddr(address.c_str(), defaultPort, &addr.ia);
iav->push_back(addr);
subStart = list.find_first_not_of(" \t\r\n\v", subEnd);
}
if(subStart!=String::npos&&list.length()>0) {
osiSockAddr* addr = new osiSockAddr;
aToIPAddr(list.substr(subStart).c_str(), defaultPort, &addr->ia);
osiSockAddr addr;
aToIPAddr(list.substr(subStart).c_str(), defaultPort, &addr.ia);
iav->push_back(addr);
}
@@ -315,18 +302,18 @@ namespace epics {
return iav;
}
const String inetAddressToString(const osiSockAddr *addr,
const String inetAddressToString(const osiSockAddr &addr,
bool displayPort, bool displayHex) {
stringstream saddr;
int ipa = ntohl(addr->ia.sin_addr.s_addr);
int ipa = ntohl(addr.ia.sin_addr.s_addr);
saddr<<((int)(ipa>>24)&0xFF)<<'.';
saddr<<((int)(ipa>>16)&0xFF)<<'.';
saddr<<((int)(ipa>>8)&0xFF)<<'.';
saddr<<((int)ipa&0xFF);
if(displayPort) saddr<<":"<<ntohs(addr->ia.sin_port);
if(displayHex) saddr<<" ("<<hex<<ntohl(addr->ia.sin_addr.s_addr)
if(displayPort) saddr<<":"<<ntohs(addr.ia.sin_port);
if(displayHex) saddr<<" ("<<hex<<ntohl(addr.ia.sin_addr.s_addr)
<<")";
return saddr.str();

View File

@@ -28,7 +28,7 @@
namespace epics {
namespace pvAccess {
typedef std::vector<osiSockAddr*> InetAddrVector;
typedef std::vector<osiSockAddr> InetAddrVector;
/**
* returns a vector containing all the IPv4 broadcast addresses
@@ -72,7 +72,7 @@ namespace epics {
InetAddrVector* getSocketAddressList(epics::pvData::String list, int defaultPort,
const InetAddrVector* appendList = NULL);
const epics::pvData::String inetAddressToString(const osiSockAddr *addr,
const epics::pvData::String inetAddressToString(const osiSockAddr &addr,
bool displayPort = true, bool displayHex = false);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

View File

@@ -57,6 +57,8 @@ public:
DummyResponseHandler(Context* ctx)
{ }
virtual ~DummyResponseHandler() {}
virtual void handleResponse(osiSockAddr* responseFrom,
Transport* transport, int8 version, int8 command, int payloadSize,
ByteBuffer* payloadBuffer) {

View File

@@ -49,6 +49,8 @@ public:
DummyResponseHandler(Context* context)
: packets(0) {
}
virtual ~DummyResponseHandler() {}
int getPackets() {
return packets;

View File

@@ -655,6 +655,7 @@ class ChannelPutImpl : public BaseRequestImpl, public ChannelPut
PVDATA_REFCOUNT_MONITOR_DEFINE(channelGetField);
// NOTE: this instance is not returned as Request, so it must self-destruct
class ChannelGetFieldRequestImpl : public DataResponse, public TransportSender
{
private:
@@ -775,6 +776,8 @@ class ChannelGetFieldRequestImpl : public DataResponse, public TransportSender
// always cancel request
// cancel();
// }
cancel();
}
@@ -1251,7 +1254,19 @@ class ClientResponseHandler : public ResponseHandler, private epics::pvData::NoD
public:
~ClientResponseHandler() {
virtual ~ClientResponseHandler() {
delete m_handlerTable[ 0];
delete m_handlerTable[ 1];
delete m_handlerTable[ 2];
delete m_handlerTable[ 3];
delete m_handlerTable[ 4];
delete m_handlerTable[ 5];
delete m_handlerTable[ 6];
delete m_handlerTable[ 7];
delete m_handlerTable[ 8];
delete m_handlerTable[ 9];
delete m_handlerTable[18];
delete[] m_handlerTable;
}
@@ -1315,27 +1330,6 @@ class ClientResponseHandler : public ResponseHandler, private epics::pvData::NoD
}
};
class TCI : public TransportSendControl {
public:
virtual void flushSerializeBuffer() {
}
virtual void ensureBuffer(int size) {
}
virtual void startMessage(int8 command, int ensureCapacity){}
virtual void endMessage() {}
virtual void flush(bool lastMessageCompleted) {}
virtual void setRecipient(const osiSockAddr& sendTo) {}
};
@@ -1534,7 +1528,7 @@ class TestChannelImpl : public ChannelImpl {
}
else
{
return inetAddressToString(m_transport->getRemoteAddress());
return inetAddressToString(*m_transport->getRemoteAddress());
}
}
@@ -1840,7 +1834,7 @@ class TestChannelImpl : public ChannelImpl {
if (sockAddrAreIdentical(transport->getRemoteAddress(), serverAddress))
{
m_requester->message("More than one channel with name '" + m_name +
"' detected, additional response from: " + inetAddressToString(serverAddress), warningMessage);
"' detected, additional response from: " + inetAddressToString(*serverAddress), warningMessage);
return;
}
}
@@ -2184,6 +2178,14 @@ class TestChannelImpl : public ChannelImpl {
}
virtual Configuration* getConfiguration() {
/*
TODO
final ConfigurationProvider configurationProvider = ConfigurationFactory.getProvider();
Configuration config = configurationProvider.getConfiguration("pvAccess-client");
if (config == null)
config = configurationProvider.getConfiguration("system");
return config;
*/
return m_configuration;
}
@@ -2289,15 +2291,12 @@ class TestChannelImpl : public ChannelImpl {
~TestClientContextImpl() {};
void loadConfiguration() {
// TODO
/*
m_addressList = config->getPropertyAsString("EPICS4_CA_ADDR_LIST", m_addressList);
m_autoAddressList = config->getPropertyAsBoolean("EPICS4_CA_AUTO_ADDR_LIST", m_autoAddressList);
m_connectionTimeout = config->getPropertyAsFloat("EPICS4_CA_CONN_TMO", m_connectionTimeout);
m_beaconPeriod = config->getPropertyAsFloat("EPICS4_CA_BEACON_PERIOD", m_beaconPeriod);
m_broadcastPort = config->getPropertyAsInteger("EPICS4_CA_BROADCAST_PORT", m_broadcastPort);
m_receiveBufferSize = config->getPropertyAsInteger("EPICS4_CA_MAX_ARRAY_BYTES", m_receiveBufferSize);
*/
m_addressList = m_configuration->getPropertyAsString("EPICS4_CA_ADDR_LIST", m_addressList);
m_autoAddressList = m_configuration->getPropertyAsBoolean("EPICS4_CA_AUTO_ADDR_LIST", m_autoAddressList);
m_connectionTimeout = m_configuration->getPropertyAsFloat("EPICS4_CA_CONN_TMO", m_connectionTimeout);
m_beaconPeriod = m_configuration->getPropertyAsFloat("EPICS4_CA_BEACON_PERIOD", m_beaconPeriod);
m_broadcastPort = m_configuration->getPropertyAsInteger("EPICS4_CA_BROADCAST_PORT", m_broadcastPort);
m_receiveBufferSize = m_configuration->getPropertyAsInteger("EPICS4_CA_MAX_ARRAY_BYTES", m_receiveBufferSize);
}
void internalInitialize() {
@@ -2322,6 +2321,7 @@ class TestChannelImpl : public ChannelImpl {
// quary broadcast addresses of all IFs
SOCKET socket = epicsSocketCreate(AF_INET, SOCK_DGRAM, 0);
if (socket == INVALID_SOCKET) return false;
auto_ptr<InetAddrVector> broadcastAddresses(getBroadcastAddresses(socket, m_broadcastPort));
epicsSocketDestroy (socket);
@@ -2346,7 +2346,7 @@ class TestChannelImpl : public ChannelImpl {
listenLocalAddress.ia.sin_port = htons(m_broadcastPort);
listenLocalAddress.ia.sin_addr.s_addr = htonl(INADDR_ANY);
BlockingUDPConnector* broadcastConnector = new BlockingUDPConnector(true, true);
auto_ptr<BlockingUDPConnector> broadcastConnector(new BlockingUDPConnector(true, true));
m_broadcastTransport = (BlockingUDPTransport*)broadcastConnector->connect(
0, new ClientResponseHandler(this),
listenLocalAddress, CA_MINOR_PROTOCOL_REVISION,
@@ -2361,7 +2361,7 @@ class TestChannelImpl : public ChannelImpl {
undefinedAddress.ia.sin_port = htons(0);
undefinedAddress.ia.sin_addr.s_addr = htonl(INADDR_ANY);
BlockingUDPConnector* searchConnector = new BlockingUDPConnector(false, true);
auto_ptr<BlockingUDPConnector> searchConnector(new BlockingUDPConnector(false, true));
m_searchTransport = (BlockingUDPTransport*)searchConnector->connect(
0, new ClientResponseHandler(this),
undefinedAddress, CA_MINOR_PROTOCOL_REVISION,
@@ -3072,11 +3072,11 @@ int main(int argc,char *argv[])
epicsThreadSleep ( 1.0 );
channel->printInfo();
/*
GetFieldRequesterImpl getFieldRequesterImpl;
channel->getField(&getFieldRequesterImpl, "");
epicsThreadSleep ( 1.0 );
/*
ChannelProcessRequesterImpl channelProcessRequester;
ChannelProcess* channelProcess = channel->createChannelProcess(&channelProcessRequester, 0);
epicsThreadSleep ( 1.0 );

View File

@@ -32,25 +32,25 @@ int main(int argc, char *argv[]) {
assert(vec->size()==3);
osiSockAddr* addr;
osiSockAddr addr;
addr = vec->at(0);
assert(addr->ia.sin_family==AF_INET);
assert(addr->ia.sin_port==htons(555));
assert(addr->ia.sin_addr.s_addr==htonl(0x7F000001));
assert(addr.ia.sin_family==AF_INET);
assert(addr.ia.sin_port==htons(555));
assert(addr.ia.sin_addr.s_addr==htonl(0x7F000001));
assert(inetAddressToString(addr)=="127.0.0.1:555");
cout<<'\t'<<inetAddressToString(addr, true)<<endl;
addr = vec->at(1);
assert(addr->ia.sin_family==AF_INET);
assert(addr->ia.sin_port==htons(1234));
assert(addr->ia.sin_addr.s_addr==htonl(0x0A0A0C0B));
assert(addr.ia.sin_family==AF_INET);
assert(addr.ia.sin_port==htons(1234));
assert(addr.ia.sin_addr.s_addr==htonl(0x0A0A0C0B));
assert(inetAddressToString(addr)=="10.10.12.11:1234");
cout<<'\t'<<inetAddressToString(addr, true)<<endl;
addr = vec->at(2);
assert(addr->ia.sin_family==AF_INET);
assert(addr->ia.sin_port==htons(555));
assert(addr->ia.sin_addr.s_addr==htonl(0xC0A80304));
assert(addr.ia.sin_family==AF_INET);
assert(addr.ia.sin_port==htons(555));
assert(addr.ia.sin_addr.s_addr==htonl(0xC0A80304));
assert(inetAddressToString(addr)=="192.168.3.4:555");
cout<<'\t'<<inetAddressToString(addr, true)<<endl;
@@ -62,55 +62,58 @@ int main(int argc, char *argv[]) {
assert(vec1->size()==4);
addr = vec1->at(0);
assert(addr->ia.sin_family==AF_INET);
assert(addr->ia.sin_port==htons(6789));
assert(addr->ia.sin_addr.s_addr==htonl(0xAC1037A0));
assert(addr.ia.sin_family==AF_INET);
assert(addr.ia.sin_port==htons(6789));
assert(addr.ia.sin_addr.s_addr==htonl(0xAC1037A0));
assert(inetAddressToString(addr)=="172.16.55.160:6789");
cout<<'\t'<<inetAddressToString(addr, true)<<endl;
addr = vec1->at(1);
assert(addr->ia.sin_family==AF_INET);
assert(addr->ia.sin_port==htons(555));
assert(addr->ia.sin_addr.s_addr==htonl(0x7F000001));
assert(addr.ia.sin_family==AF_INET);
assert(addr.ia.sin_port==htons(555));
assert(addr.ia.sin_addr.s_addr==htonl(0x7F000001));
assert(inetAddressToString(addr)=="127.0.0.1:555");
cout<<'\t'<<inetAddressToString(addr, true)<<endl;
addr = vec1->at(2);
assert(addr->ia.sin_family==AF_INET);
assert(addr->ia.sin_port==htons(1234));
assert(addr->ia.sin_addr.s_addr==htonl(0x0A0A0C0B));
assert(addr.ia.sin_family==AF_INET);
assert(addr.ia.sin_port==htons(1234));
assert(addr.ia.sin_addr.s_addr==htonl(0x0A0A0C0B));
assert(inetAddressToString(addr)=="10.10.12.11:1234");
cout<<'\t'<<inetAddressToString(addr, true)<<endl;
addr = vec1->at(3);
assert(addr->ia.sin_family==AF_INET);
assert(addr->ia.sin_port==htons(555));
assert(addr->ia.sin_addr.s_addr==htonl(0xC0A80304));
assert(addr.ia.sin_family==AF_INET);
assert(addr.ia.sin_port==htons(555));
assert(addr.ia.sin_addr.s_addr==htonl(0xC0A80304));
assert(inetAddressToString(addr)=="192.168.3.4:555");
cout<<'\t'<<inetAddressToString(addr, true)<<endl;
cout<<"\nPASSED!\n";
cout<<"Testing \"ipv4AddressToInt\""<<endl;
assert(ipv4AddressToInt(*(vec->at(0)))==(int32)0x7F000001);
assert(ipv4AddressToInt(*(vec->at(1)))==(int32)0x0A0A0C0B);
assert(ipv4AddressToInt(*(vec->at(2)))==(int32)0xC0A80304);
assert(ipv4AddressToInt((vec->at(0)))==(int32)0x7F000001);
assert(ipv4AddressToInt((vec->at(1)))==(int32)0x0A0A0C0B);
assert(ipv4AddressToInt((vec->at(2)))==(int32)0xC0A80304);
cout<<"\nPASSED!\n";
delete vec;
delete vec1;
osiSockAddr* paddr;
cout<<"Testing \"intToIPv4Address\""<<endl;
addr = intToIPv4Address(0x7F000001);
assert(addr->ia.sin_family==AF_INET);
assert(inetAddressToString(addr)=="127.0.0.1:0");
cout<<'\t'<<inetAddressToString(addr, true)<<endl;
delete addr;
paddr = intToIPv4Address(0x7F000001);
assert(paddr->ia.sin_family==AF_INET);
assert(inetAddressToString(*paddr)=="127.0.0.1:0");
cout<<'\t'<<inetAddressToString(*paddr, true)<<endl;
delete paddr;
addr = intToIPv4Address(0x0A0A0C0B);
assert(addr->ia.sin_family==AF_INET);
assert(inetAddressToString(addr)=="10.10.12.11:0");
cout<<'\t'<<inetAddressToString(addr, true)<<endl;
paddr = intToIPv4Address(0x0A0A0C0B);
assert(paddr->ia.sin_family==AF_INET);
assert(inetAddressToString(*paddr)=="10.10.12.11:0");
cout<<'\t'<<inetAddressToString(*paddr, true)<<endl;
addr = *paddr;
delete paddr;
cout<<"\nPASSED!\n";
@@ -122,7 +125,7 @@ int main(int argc, char *argv[]) {
(char)0, (char)0, (char)0, (char)0, (char)0xFF, (char)0xFF,
(char)0x0A, (char)0x0A, (char)0x0C, (char)0x0B };
encodeAsIPv6Address(buff, addr);
encodeAsIPv6Address(buff, &addr);
assert(strncmp(buff->getArray(), src, 16)==0);
cout<<"\nPASSED!\n";
@@ -135,7 +138,6 @@ int main(int argc, char *argv[]) {
}
delete broadcasts;
delete addr;
return 0;
}