From 5ccc6e3525bb3e70eb544b8ba47d17062232c653 Mon Sep 17 00:00:00 2001 From: Horst Schirmeier Date: Thu, 20 Feb 2014 00:09:17 +0100 Subject: [PATCH] comm: ExperimentData needs a virtual destructor Classes deriving from ExperimentData usually contain the experiment-specific Protobuf message, which needs to be properly destroyed. This is particularly a problem in the generic DatabaseCampaign, as it never downcasts ExperimentData objects retrieved from JobServer::getDone(). As the embedded DatabaseCampaignMessage (usually named "fsppilot") is allocated on the heap (this happens in the campaign's cb_send_pilot() function, asking for a mutable_fsppilot()), the lack of a virtual destructor in ExperimentData led to a memory leak, rendering the campaign server inoperable after handling ~1E7 messages (with a 4GiB / 32-bit process memory limit). Change-Id: I4cb8a26d5a702e03189c4aae340051ce62a9c9ce --- src/core/comm/ExperimentData.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/comm/ExperimentData.hpp b/src/core/comm/ExperimentData.hpp index 7cc3c6d8..fb2a6da4 100644 --- a/src/core/comm/ExperimentData.hpp +++ b/src/core/comm/ExperimentData.hpp @@ -17,6 +17,7 @@ protected: public: ExperimentData() : msg(0), m_workloadID(0) {}; ExperimentData(google::protobuf::Message* m) : msg(m) , m_workloadID(0) { } + virtual ~ExperimentData() {} google::protobuf::Message& getMessage() { return *msg; } void setMessage(google::protobuf::Message *msg) { this->msg = msg; }