Skip to content

Commit

Permalink
Merge branch 'feature/memoryleaks'
Browse files Browse the repository at this point in the history
  • Loading branch information
Grumbel committed Aug 12, 2014
2 parents e84ab6b + cc857db commit bd47623
Show file tree
Hide file tree
Showing 16 changed files with 210 additions and 144 deletions.
2 changes: 1 addition & 1 deletion src/supertux/level.cpp
Expand Up @@ -77,7 +77,7 @@ Level::load(const std::string& filepath)

const lisp::Lisp* tilesets_lisp = level->get_lisp("tilesets");
if(tilesets_lisp != NULL) {
tileset = tile_manager->parse_tileset_definition(*tilesets_lisp);
tileset = tile_manager->parse_tileset_definition(*tilesets_lisp).release();
free_tileset = true;
}
std::string tileset_name;
Expand Down
3 changes: 3 additions & 0 deletions src/supertux/main.cpp
Expand Up @@ -429,6 +429,9 @@ Main::run(int argc, char** argv)
SDL_Quit();
PHYSFS_deinit();

delete dictionary_manager;
dictionary_manager = nullptr;

return result;
}

Expand Down
7 changes: 4 additions & 3 deletions src/supertux/object_factory.hpp
Expand Up @@ -18,8 +18,9 @@
#ifndef HEADER_SUPERTUX_SUPERTUX_OBJECT_FACTORY_HPP
#define HEADER_SUPERTUX_SUPERTUX_OBJECT_FACTORY_HPP

#include <map>
#include <assert.h>
#include <map>
#include <memory>

#include "supertux/direction.hpp"
#include "util/reader_fwd.hpp"
Expand Down Expand Up @@ -58,7 +59,7 @@ class ObjectFactory
static ObjectFactory& instance();

private:
typedef std::map<std::string, AbstractObjectFactory*> Factories;
typedef std::map<std::string, std::unique_ptr<AbstractObjectFactory> > Factories;
Factories factories;

public:
Expand All @@ -73,7 +74,7 @@ class ObjectFactory
void add_factory(const char* name)
{
assert(factories.find(name) == factories.end());
factories[name] = new ConcreteObjectFactory<C>();
factories[name] = std::unique_ptr<AbstractObjectFactory>(new ConcreteObjectFactory<C>());
}
void init_factories();
};
Expand Down
12 changes: 3 additions & 9 deletions src/supertux/resources.cpp
Expand Up @@ -90,15 +90,9 @@ Resources::unload_shared()
big_font.reset();

/* Free tilesets */
if(tile_manager != NULL)
{
for(TileManager::TileSets::iterator it = tile_manager->tilesets.begin();
it != tile_manager->tilesets.end(); ++it)
{
delete it->second;
it->second = NULL;
}
}
delete tile_manager;
tile_manager = 0;

if(sprite_manager != NULL)
{
delete sprite_manager;
Expand Down
26 changes: 16 additions & 10 deletions src/supertux/tile_manager.cpp
Expand Up @@ -31,21 +31,27 @@ TileManager::~TileManager()
{
}

TileSet* TileManager::get_tileset(const std::string &filename)
TileSet*
TileManager::get_tileset(const std::string &filename)
{
TileSets::const_iterator i = tilesets.find(filename);
if(i != tilesets.end())
return i->second;

std::unique_ptr<TileSet> tileset (new TileSet(filename));
tilesets.insert(std::make_pair(filename, tileset.get()));

return tileset.release();
{
return i->second.get();
}
else
{
std::unique_ptr<TileSet> tileset(new TileSet(filename));
TileSet* result = tileset.get();
tilesets.insert(std::make_pair(filename, std::move(tileset)));
return result;
}
}

TileSet* TileManager::parse_tileset_definition(const Reader& reader)
std::unique_ptr<TileSet>
TileManager::parse_tileset_definition(const Reader& reader)
{
std::unique_ptr<TileSet> result(new TileSet());
std::unique_ptr<TileSet> result(new TileSet);

lisp::ListIterator iter(&reader);
while(iter.next()) {
Expand Down Expand Up @@ -74,7 +80,7 @@ TileSet* TileManager::parse_tileset_definition(const Reader& reader)
result->merge(tileset, start, end, offset);
}

return result.release();
return std::move(result);
}

/* EOF */
6 changes: 3 additions & 3 deletions src/supertux/tile_manager.hpp
Expand Up @@ -18,6 +18,7 @@
#define HEADER_SUPERTUX_SUPERTUX_TILE_MANAGER_HPP

#include <map>
#include <memory>
#include <string>

#include "util/reader_fwd.hpp"
Expand All @@ -26,9 +27,8 @@ class TileSet;

class TileManager
{
friend class Resources;
private:
typedef std::map<std::string, TileSet*> TileSets;
typedef std::map<std::string, std::unique_ptr<TileSet> > TileSets;
TileSets tilesets;

public:
Expand All @@ -37,7 +37,7 @@ class TileManager

TileSet* get_tileset(const std::string &filename);

TileSet* parse_tileset_definition(const Reader& reader);
std::unique_ptr<TileSet> parse_tileset_definition(const Reader& reader);
};

#endif
Expand Down
43 changes: 32 additions & 11 deletions src/video/drawing_context.cpp
Expand Up @@ -53,9 +53,26 @@ DrawingContext::DrawingContext(Renderer& renderer, Lightmap& lightmap) :

DrawingContext::~DrawingContext()
{
clear_drawing_requests(lightmap_requests);
clear_drawing_requests(drawing_requests);

obstack_free(&obst, NULL);
}

void
DrawingContext::clear_drawing_requests(DrawingRequests& requests)
{
for(auto& request : requests)
{
if (request->request_data)
{
request->request_data->~DrawingRequestData();
}
request->~DrawingRequest();
}
requests.clear();
}

void
DrawingContext::draw_surface(SurfacePtr surface, const Vector& position,
float angle, const Color& color, const Blend& blend,
Expand All @@ -81,7 +98,9 @@ DrawingContext::draw_surface(SurfacePtr surface, const Vector& position,
request->color = color;
request->blend = blend;

request->request_data = surface.get();
SurfaceRequest* surfacerequest = new(obst) SurfaceRequest();
surfacerequest->surface = surface.get();
request->request_data = surfacerequest;

requests->push_back(request);
}
Expand Down Expand Up @@ -236,7 +255,7 @@ DrawingContext::draw_filled_rect(const Rectf& rect, const Color& color, float ra
fillrectrequest->radius = radius;
request->request_data = fillrectrequest;

requests->push_back(request);
requests->push_back(request);
}

void
Expand All @@ -253,20 +272,20 @@ DrawingContext::draw_inverse_ellipse(const Vector& pos, const Vector& size, cons
request->alpha = transform.alpha;

InverseEllipseRequest* ellipse = new(obst)InverseEllipseRequest;

ellipse->color = color;
ellipse->color.alpha = color.alpha * transform.alpha;
ellipse->size = size;
request->request_data = ellipse;

requests->push_back(request);
requests->push_back(request);
}

Rectf
DrawingContext::get_cliprect() const
{
return Rectf(get_translation().x, get_translation().y,
get_translation().x + SCREEN_WIDTH,
get_translation().x + SCREEN_WIDTH,
get_translation().y + SCREEN_HEIGHT);
}

Expand Down Expand Up @@ -307,8 +326,9 @@ DrawingContext::do_drawing()
target_stack.clear();

//Use Lightmap if ambient color is not white.
bool use_lightmap = ( ambient_color.red != 1.0f || ambient_color.green != 1.0f ||
ambient_color.blue != 1.0f );
bool use_lightmap = ( ambient_color.red != 1.0f ||
ambient_color.green != 1.0f ||
ambient_color.blue != 1.0f );

// PART1: create lightmap
if(use_lightmap) {
Expand All @@ -322,10 +342,11 @@ DrawingContext::do_drawing()
request->layer = LAYER_HUD - 1;
drawing_requests.push_back(request);
}
lightmap_requests.clear();

handle_drawing_requests(drawing_requests);
drawing_requests.clear();

clear_drawing_requests(lightmap_requests);
clear_drawing_requests(drawing_requests);

obstack_free(&obst, NULL);
obstack_init(&obst);

Expand Down Expand Up @@ -495,7 +516,7 @@ DrawingContext::set_ambient_color( Color new_color )
ambient_color = new_color;
}

void
void
DrawingContext::take_screenshot()
{
screenshot_requested = true;
Expand Down
58 changes: 48 additions & 10 deletions src/video/drawing_context.hpp
Expand Up @@ -26,24 +26,60 @@
#include "math/rectf.hpp"
#include "math/vector.hpp"
#include "video/color.hpp"
#include "video/drawing_request.hpp"
#include "video/font.hpp"
#include "video/font_ptr.hpp"
#include "video/texture.hpp"

class DrawingRequest;
class Lightmap;
class Renderer;
class Surface;
class Texture;
class Renderer;
class Lightmap;

inline int next_po2(int val)
// some constants for predefined layer values
enum {
// Image/gradient backgrounds (should cover entire screen)
LAYER_BACKGROUND0 = -300,
// Particle backgrounds
LAYER_BACKGROUND1 = -200,
// Tilemap backgrounds
LAYER_BACKGROUNDTILES = -100,
// Solid tilemaps
LAYER_TILES = 0,
// Ordinary objects
LAYER_OBJECTS = 50,
// Objects that pass through walls
LAYER_FLOATINGOBJECTS = 150,
//
LAYER_FOREGROUNDTILES = 200,
//
LAYER_FOREGROUND0 = 300,
//
LAYER_FOREGROUND1 = 400,
// Hitpoints, time, coins, etc.
LAYER_HUD = 500,
// Menus, mouse, console etc.
LAYER_GUI = 600
};

class Blend
{
int result = 1;
while(result < val)
result *= 2;
public:
GLenum sfactor;
GLenum dfactor;

Blend()
: sfactor(GL_SRC_ALPHA), dfactor(GL_ONE_MINUS_SRC_ALPHA)
{}

Blend(GLenum s, GLenum d)
: sfactor(s), dfactor(d)
{}
};

return result;
}
enum Target {
NORMAL, LIGHTMAP
};

/**
* This class provides functions for drawing things on screen. It also
Expand Down Expand Up @@ -141,7 +177,7 @@ class DrawingContext

Transform() :
translation(),
drawing_effect(NO_EFFECT),
drawing_effect(NO_EFFECT),
alpha(1.0f)
{ }

Expand All @@ -151,6 +187,8 @@ class DrawingContext
}
};

void clear_drawing_requests(DrawingRequests& requests);

private:
Renderer& renderer;
Lightmap& lightmap;
Expand Down

0 comments on commit bd47623

Please sign in to comment.