summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevron Rees <kevron_m_rees@linux.intel.com>2012-10-18 11:29:18 -0700
committerKevron Rees <kevron_m_rees@linux.intel.com>2012-10-18 11:29:18 -0700
commit01721d6efec5e33c289a2344736b65788a58becb (patch)
tree8a7045ed2ad5d963c3bc85b69a857277d94f726a
parent7a6851551da9e232d3fd9f3780a051d0fff394a6 (diff)
downloadautomotive-message-broker-01721d6efec5e33c289a2344736b65788a58becb.tar.gz
solved possible memory leak in websocketsink
-rw-r--r--plugins/websocketsink/websocketsinkmanager.cpp33
-rw-r--r--plugins/websocketsink/websocketsinkmanager.h2
2 files changed, 23 insertions, 12 deletions
diff --git a/plugins/websocketsink/websocketsinkmanager.cpp b/plugins/websocketsink/websocketsinkmanager.cpp
index 9373b153..5039c057 100644
--- a/plugins/websocketsink/websocketsinkmanager.cpp
+++ b/plugins/websocketsink/websocketsinkmanager.cpp
@@ -145,9 +145,15 @@ void WebSocketSinkManager::removeSink(libwebsocket* socket,VehicleProperty::Prop
{
if (m_sinkMap.find(property) != m_sinkMap.end())
{
- WebSocketSink* sink = m_sinkMap[property];
- delete sink;
+ list<WebSocketSink*> sinks = m_sinkMap[property];
+
+ for(auto i = sinks.begin(); i != sinks.end(); i++)
+ {
+ delete *i;
+ }
+
m_sinkMap.erase(property);
+
stringstream s;
s << "{\"type\":\"methodReply\",\"name\":\"unsubscribe\",\"data\":[\"" << property << "\"],\"transactionid\":\"" << uuid << "\"}";
@@ -218,7 +224,7 @@ void WebSocketSinkManager::addSink(libwebsocket* socket, VehicleProperty::Proper
libwebsocket_write(socket, (unsigned char*)new_response, strlen(new_response), LWS_WRITE_TEXT);
delete (char*)(new_response-LWS_SEND_BUFFER_PRE_PADDING);
WebSocketSink *sink = new WebSocketSink(m_engine,socket,uuid,property,tmpstr);
- m_sinkMap[property] = sink;
+ m_sinkMap[property].push_back(sink);
}
extern "C" AbstractSinkManager * create(AbstractRoutingEngine* routingengine, map<string, string> config)
{
@@ -232,17 +238,22 @@ void WebSocketSinkManager::disconnectAll(libwebsocket* socket)
for (auto i=m_sinkMap.begin(); i != m_sinkMap.end();i++)
{
- if ((*i).second->socket() == socket)
+ std::list<WebSocketSink*> *sinks = & (*i).second;
+ for (auto sinkItr = sinks->begin(); sinkItr != sinks->end(); sinkItr++)
{
- //This is the sink in question.
- WebSocketSink* sink = (*i).second;
- if(!ListPlusPlus<WebSocketSink*>(&toDeleteList).contains(sink))
+ if ((*sinkItr)->socket() == socket)
{
- toDeleteList.push_back(sink);
+ //This is the sink in question.
+ WebSocketSink* sink = (*sinkItr);
+ if(!ListPlusPlus<WebSocketSink*>(&toDeleteList).contains(sink))
+ {
+ toDeleteList.push_back(sink);
+ }
+
+ sinks->erase(sinkItr);
+ sinkItr = sinks->begin();
+ DebugOut() << __SMALLFILE__ <<":"<< __LINE__ << "Sink removed"<<endl;
}
- m_sinkMap.erase(i);
- i=m_sinkMap.begin();
- DebugOut() << __SMALLFILE__ <<":"<< __LINE__ << "Sink removed"<<endl;
}
}
diff --git a/plugins/websocketsink/websocketsinkmanager.h b/plugins/websocketsink/websocketsinkmanager.h
index e08d546a..f17c326e 100644
--- a/plugins/websocketsink/websocketsinkmanager.h
+++ b/plugins/websocketsink/websocketsinkmanager.h
@@ -39,7 +39,7 @@ public:
void addPoll(int fd);
void removePoll(int fd);
void init();
- map<std::string, WebSocketSink*> m_sinkMap;
+ map<std::string, list<WebSocketSink*> > m_sinkMap;
void setConfiguration(map<string, string> config);
void setValue(string property,string value);
private: