From 9f487bbe876f2bc27c429fe2103acbe1ac194b3e Mon Sep 17 00:00:00 2001 From: Xisco Bosch Date: Tue, 25 Apr 2017 12:38:44 +0200 Subject: [PATCH 1/3] memory leak test --- Source/CarlaServer/source/carla/CarlaServer.cpp | 7 +++++++ .../source/carla/server/CarlaCommunication.cpp | 2 ++ .../CarlaServer/source/carla/server/Protocol.cpp | 13 +++---------- .../CarlaServer/source/carla/server/TCPServer.cpp | 8 ++++++-- Source/CarlaServer/source/test/async_server.cpp | 15 ++++++++++----- 5 files changed, 28 insertions(+), 17 deletions(-) diff --git a/Source/CarlaServer/source/carla/CarlaServer.cpp b/Source/CarlaServer/source/carla/CarlaServer.cpp index b35f4f1de..263f6255e 100644 --- a/Source/CarlaServer/source/carla/CarlaServer.cpp +++ b/Source/CarlaServer/source/carla/CarlaServer.cpp @@ -48,6 +48,7 @@ namespace carla { if (!worldConnected()) return false; readed = _pimpl->communication.tryReadEpisodeStart(startIndex, endIndex); + std::cout << "Episode Start: " << readed << std::endl; return true; } @@ -62,6 +63,7 @@ namespace carla { if (!worldConnected()) return false; newEpisode = _pimpl->communication.tryReadRequestNewEpisode(); + std::cout << "New Episode Request: " << newEpisode << std::endl; return true; } @@ -77,6 +79,8 @@ namespace carla { if (!worldConnected()) return false; _pimpl->communication.sendScene(values); + + std::cout << "Send scene values" << std::endl; return true; } @@ -84,6 +88,9 @@ namespace carla { if (!worldConnected()) return false; _pimpl->communication.sendReset(); + + std::cout << "Send end reset" << std::endl; + return true; } diff --git a/Source/CarlaServer/source/carla/server/CarlaCommunication.cpp b/Source/CarlaServer/source/carla/server/CarlaCommunication.cpp index 7bc863632..212e94857 100644 --- a/Source/CarlaServer/source/carla/server/CarlaCommunication.cpp +++ b/Source/CarlaServer/source/carla/server/CarlaCommunication.cpp @@ -233,6 +233,8 @@ namespace server { if (scene->SerializeToString(message.get())) { _worldThread.push(std::move(message)); } + + free(scene); } void CarlaCommunication::sendReset() { diff --git a/Source/CarlaServer/source/carla/server/Protocol.cpp b/Source/CarlaServer/source/carla/server/Protocol.cpp index 50518c1c4..51aa098b2 100644 --- a/Source/CarlaServer/source/carla/server/Protocol.cpp +++ b/Source/CarlaServer/source/carla/server/Protocol.cpp @@ -193,7 +193,7 @@ namespace server { } -static bool getJPEGImages(const std::vector &images, Reward &rwd){ +static bool getPNGImages(const std::vector &images, Reward &rwd){ std::string image_data; std::string depth_data; std::string image_size_data; @@ -236,11 +236,6 @@ static bool getJPEGImages(const std::vector &images, Reward &rwd){ } - std::cout << "send depth size: " << depth_size_data.size() << - " send image size: " << image_size_data.size()<< - " send image: " << image_data.size()<< - " send depth: " << depth_data.size() << std::endl; - rwd.set_depth_sizes(depth_size_data); rwd.set_image_sizes(image_size_data); rwd.set_images(image_data); @@ -273,10 +268,8 @@ static bool getJPEGImages(const std::vector &images, Reward &rwd){ #ifdef WITH_TURBOJPEG - //constexpr int JPEG_QUALITY = 75; - - if (!getJPEGImages(values.images, reward)) { - std::cerr << "Error compressing image to JPEG" << std::endl; + if (!getPNGImages(values.images, reward)) { + std::cerr << "Error compressing image to PNG" << std::endl; } #endif // WITH_TURBOJPEG diff --git a/Source/CarlaServer/source/carla/server/TCPServer.cpp b/Source/CarlaServer/source/carla/server/TCPServer.cpp index e3f232b71..d8d6ac60b 100644 --- a/Source/CarlaServer/source/carla/server/TCPServer.cpp +++ b/Source/CarlaServer/source/carla/server/TCPServer.cpp @@ -36,7 +36,12 @@ namespace carla { port(port), _service(), _socket(_service), - _connected(false){} + _connected(false){ + + //int32_t timeout = 500; + //setsockopt(_socket.native(), SOL_SOCKET, SO_SNDTIMEO, (const char*)&timeout, sizeof(timeout)); + + } TCPServer::~TCPServer() {} @@ -60,7 +65,6 @@ namespace carla { void TCPServer::writeString(const std::string &message, error_code &error) { const int messageSize = static_cast(message.length()); std::string outMessage(GetBytes(messageSize) + message); - boost::asio::write(_socket, boost::asio::buffer(outMessage), error); if (error) diff --git a/Source/CarlaServer/source/test/async_server.cpp b/Source/CarlaServer/source/test/async_server.cpp index baef9b46d..c3b4c7cac 100644 --- a/Source/CarlaServer/source/test/async_server.cpp +++ b/Source/CarlaServer/source/test/async_server.cpp @@ -162,7 +162,11 @@ int main(int argc, char *argv[]) { uint32_t startPoint, endPoint; bool error = false, readed = false; do { + + std::cout << "Try read episode Start: "; error = !server.tryReadEpisodeStart(startPoint, endPoint, readed); + std::cout << error << std::endl; + } while (!readed && !error); if (error) { @@ -181,12 +185,13 @@ int main(int argc, char *argv[]) { break; } else if (readed) { std::cout << "CONTROL --> gas: " << gas << " steer: " << steer << std::endl; - } + } + + if (!server.sendReward(makeReward().release())) { + std::cerr << "ERROR while sending Reward" << std::endl; + break; + } - if (!server.sendReward(makeReward().release())) { - std::cerr << "ERROR while sending Reward" << std::endl; - break; - } } } std::cout << " ----- RESTARTING -----" << std::endl; From 6423e7e66cb17f381e7a6c4134aeb186bbb4f0c8 Mon Sep 17 00:00:00 2001 From: Xisco Bosch Date: Tue, 25 Apr 2017 15:27:27 +0200 Subject: [PATCH 2/3] Memory leak in Scene fixed --- .../source/carla/server/CarlaCommunication.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Source/CarlaServer/source/carla/server/CarlaCommunication.cpp b/Source/CarlaServer/source/carla/server/CarlaCommunication.cpp index 212e94857..51ae2ccfb 100644 --- a/Source/CarlaServer/source/carla/server/CarlaCommunication.cpp +++ b/Source/CarlaServer/source/carla/server/CarlaCommunication.cpp @@ -221,20 +221,21 @@ namespace server { } void CarlaCommunication::sendScene(const Scene_Values &values) { + // Protobuf produces a segmentation fault in the destructor of the Scene // when called from Unreal Engine in Linux. As a workaround, we added this // cute memory leak. /// @todo #10 Fix the memory leak! - Scene *scene = new Scene; - _proto->LoadScene(*scene, values); + + Scene scene; + _proto->LoadScene(scene, values); auto message = std::make_unique(); - if (scene->SerializeToString(message.get())) { + if (scene.SerializeToString(message.get())) { _worldThread.push(std::move(message)); } - free(scene); } void CarlaCommunication::sendReset() { From 6e86bec138116b610f5709f2d34187f4a56d646a Mon Sep 17 00:00:00 2001 From: Xisco Bosch Date: Tue, 25 Apr 2017 17:35:21 +0200 Subject: [PATCH 3/3] new timestamp --- Source/CarlaServer/source/carla/CarlaServer.h | 3 ++- .../source/carla/server/Protocol.cpp | 3 ++- .../source/carla/server/carla_protocol.proto | 17 +++++++++-------- Source/CarlaServer/source/test/async_server.cpp | 6 ++++-- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/Source/CarlaServer/source/carla/CarlaServer.h b/Source/CarlaServer/source/carla/CarlaServer.h index 6b9fef1ee..5ff850737 100644 --- a/Source/CarlaServer/source/carla/CarlaServer.h +++ b/Source/CarlaServer/source/carla/CarlaServer.h @@ -44,7 +44,8 @@ namespace carla { Reward_Values(); ~Reward_Values(); /// Time-stamp of the current frame. - int32_t timestamp; + int32_t platform_timestamp; + int32_t game_timestamp; /// World location of the player. Vector2D player_location; /// Orientation of the player. diff --git a/Source/CarlaServer/source/carla/server/Protocol.cpp b/Source/CarlaServer/source/carla/server/Protocol.cpp index 51aa098b2..095bcb911 100644 --- a/Source/CarlaServer/source/carla/server/Protocol.cpp +++ b/Source/CarlaServer/source/carla/server/Protocol.cpp @@ -264,7 +264,8 @@ static bool getPNGImages(const std::vector &images, Reward &rwd){ reward.set_player_y(values.player_location.y); reward.set_player_x(values.player_location.x); reward.set_speed(values.forward_speed); - reward.set_timestamp(values.timestamp); + reward.set_platform_timestamp(values.platform_timestamp); + reward.set_game_timestamp(values.game_timestamp); #ifdef WITH_TURBOJPEG diff --git a/Source/CarlaServer/source/carla/server/carla_protocol.proto b/Source/CarlaServer/source/carla/server/carla_protocol.proto index 44b8d01f6..103816d69 100644 --- a/Source/CarlaServer/source/carla/server/carla_protocol.proto +++ b/Source/CarlaServer/source/carla/server/carla_protocol.proto @@ -78,13 +78,14 @@ message Reward { optional float acceleration_x = 9; optional float acceleration_y = 10; optional float acceleration_z = 11; - optional int32 timestamp = 12; - optional float ori_x = 13; - optional float ori_y = 14; - optional float ori_z = 15; - optional bytes image_sizes = 16; - optional bytes depth_sizes = 17; - optional bytes images = 18; - optional bytes depths = 19; + optional int32 platform_timestamp = 12; + optional int32 game_timestamp = 13; + optional float ori_x = 14; + optional float ori_y = 15; + optional float ori_z = 16; + optional bytes image_sizes = 17; + optional bytes depth_sizes = 18; + optional bytes images = 19; + optional bytes depths = 20; } diff --git a/Source/CarlaServer/source/test/async_server.cpp b/Source/CarlaServer/source/test/async_server.cpp index c3b4c7cac..c029d7958 100644 --- a/Source/CarlaServer/source/test/async_server.cpp +++ b/Source/CarlaServer/source/test/async_server.cpp @@ -58,6 +58,7 @@ std::unique_ptr makeReward() { reward->collision_car = 10.0f; reward->intersect_other_lane = 0.5f; reward->intersect_offroad = 0.5f; + reward->game_timestamp = 0u; for (int i = 0; i < 4; ++i) { carla::Image img; @@ -74,8 +75,9 @@ std::unique_ptr makeReward() { reward->image_depth_0 = makeImage(imageWidth, imageHeight); reward->image_depth_1 = makeImage(imageWidth, imageHeight); */ - static decltype(carla::Reward_Values::timestamp) timestamp = 0u; - reward->timestamp = timestamp++; + static decltype(carla::Reward_Values::platform_timestamp) timestamp = 0u; + + reward->platform_timestamp = timestamp++; return reward; }