diff options
author | Kevron Rees <kevron_m_rees@linux.intel.com> | 2012-10-18 11:29:18 -0700 |
---|---|---|
committer | Kevron Rees <kevron_m_rees@linux.intel.com> | 2012-10-18 11:29:18 -0700 |
commit | 01721d6efec5e33c289a2344736b65788a58becb (patch) | |
tree | 8a7045ed2ad5d963c3bc85b69a857277d94f726a | |
parent | 7a6851551da9e232d3fd9f3780a051d0fff394a6 (diff) | |
download | automotive-message-broker-01721d6efec5e33c289a2344736b65788a58becb.tar.gz |
solved possible memory leak in websocketsink
-rw-r--r-- | plugins/websocketsink/websocketsinkmanager.cpp | 33 | ||||
-rw-r--r-- | plugins/websocketsink/websocketsinkmanager.h | 2 |
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: |