Properly clean up when exit
This commit is contained in:
parent
579aa8a9d1
commit
6eb69db4ea
@ -71,9 +71,23 @@ STKTexManager::~STKTexManager()
|
|||||||
#if !(defined(SERVER_ONLY) || defined(USE_GLES2))
|
#if !(defined(SERVER_ONLY) || defined(USE_GLES2))
|
||||||
if (CVS->supportsThreadedTextureLoading())
|
if (CVS->supportsThreadedTextureLoading())
|
||||||
{
|
{
|
||||||
|
STKTexture* delete_ttl = new STKTexture((uint8_t*)NULL, "delete_ttl",
|
||||||
|
0, false, true);
|
||||||
|
for (int i = 0; i < m_thread_size; i++)
|
||||||
|
addThreadedLoadTexture(delete_ttl);
|
||||||
|
for (int i = 0; i < m_thread_size; i++)
|
||||||
|
{
|
||||||
|
if (!m_all_tex_loaders[i]->waitForReadyToDeleted(2.0f))
|
||||||
|
{
|
||||||
|
Log::info("STKTexManager", "ThreadedTexLoader %d not stopping,"
|
||||||
|
"exiting anyway.", i);
|
||||||
|
}
|
||||||
|
delete m_all_tex_loaders[i];
|
||||||
|
}
|
||||||
|
delete delete_ttl;
|
||||||
|
glDeleteBuffers(1, &m_pbo);
|
||||||
|
pthread_mutex_destroy(&m_threaded_load_textures_mutex);
|
||||||
pthread_cond_destroy(&m_cond_request);
|
pthread_cond_destroy(&m_cond_request);
|
||||||
for (ThreadedTexLoader* ttl : m_all_tex_loaders)
|
|
||||||
delete ttl;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} // ~STKTexManager
|
} // ~STKTexManager
|
||||||
|
@ -59,7 +59,7 @@ STKTexture::STKTexture(const std::string& path, bool srgb, bool premul_alpha,
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
STKTexture::STKTexture(uint8_t* data, const std::string& name, size_t size,
|
STKTexture::STKTexture(uint8_t* data, const std::string& name, size_t size,
|
||||||
bool single_channel)
|
bool single_channel, bool delete_ttl)
|
||||||
: video::ITexture(name.c_str()), m_texture_handle(0), m_srgb(false),
|
: video::ITexture(name.c_str()), m_texture_handle(0), m_srgb(false),
|
||||||
m_premul_alpha(false), m_mesh_texture(false),
|
m_premul_alpha(false), m_mesh_texture(false),
|
||||||
m_single_channel(single_channel), m_material(NULL),
|
m_single_channel(single_channel), m_material(NULL),
|
||||||
@ -69,6 +69,7 @@ STKTexture::STKTexture(uint8_t* data, const std::string& name, size_t size,
|
|||||||
m_size.Width = size;
|
m_size.Width = size;
|
||||||
m_size.Height = size;
|
m_size.Height = size;
|
||||||
m_orig_size = m_size;
|
m_orig_size = m_size;
|
||||||
|
if (!delete_ttl)
|
||||||
reload(false/*no_upload*/, data);
|
reload(false/*no_upload*/, data);
|
||||||
} // STKTexture
|
} // STKTexture
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ public:
|
|||||||
bool single_channel = false);
|
bool single_channel = false);
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
STKTexture(uint8_t* data, const std::string& name, size_t size,
|
STKTexture(uint8_t* data, const std::string& name, size_t size,
|
||||||
bool single_channel = false);
|
bool single_channel = false, bool delete_ttl = false);
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
STKTexture(video::IImage* img, const std::string& name);
|
STKTexture(video::IImage* img, const std::string& name);
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
@ -29,7 +29,7 @@ void* ThreadedTexLoader::startRoutine(void *obj)
|
|||||||
ThreadedTexLoader* ttl = (ThreadedTexLoader*)obj;
|
ThreadedTexLoader* ttl = (ThreadedTexLoader*)obj;
|
||||||
VS::setThreadName((std::string("ThrTexLoader") +
|
VS::setThreadName((std::string("ThrTexLoader") +
|
||||||
StringUtils::toString(ttl->m_pbo_offset / 1024 / 1024)).c_str());
|
StringUtils::toString(ttl->m_pbo_offset / 1024 / 1024)).c_str());
|
||||||
while (!ttl->m_destroy)
|
while (true)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&ttl->m_mutex);
|
pthread_mutex_lock(&ttl->m_mutex);
|
||||||
bool finished = ttl->finishedLoading();
|
bool finished = ttl->finishedLoading();
|
||||||
@ -65,6 +65,13 @@ void* ThreadedTexLoader::startRoutine(void *obj)
|
|||||||
ttl->m_waiting_timeout = 0;
|
ttl->m_waiting_timeout = 0;
|
||||||
}
|
}
|
||||||
STKTexture* target_tex = ttl->m_stktm->getThreadedLoadTexture();
|
STKTexture* target_tex = ttl->m_stktm->getThreadedLoadTexture();
|
||||||
|
if (strcmp(target_tex->getName().getPtr(), "delete_ttl") == 0)
|
||||||
|
{
|
||||||
|
ttl->m_stktm->removeThreadedLoadTexture();
|
||||||
|
pthread_mutex_unlock(ttl->m_texture_queue_mutex);
|
||||||
|
ttl->setCanBeDeleted();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
if (target_tex->getTextureSize() + ttl->m_tex_size_loaded >
|
if (target_tex->getTextureSize() + ttl->m_tex_size_loaded >
|
||||||
ttl->m_tex_capacity)
|
ttl->m_tex_capacity)
|
||||||
{
|
{
|
||||||
@ -83,11 +90,9 @@ void* ThreadedTexLoader::startRoutine(void *obj)
|
|||||||
ttl->m_tex_size_loaded += target_tex->getTextureSize();
|
ttl->m_tex_size_loaded += target_tex->getTextureSize();
|
||||||
ttl->m_completed_textures.push_back(target_tex);
|
ttl->m_completed_textures.push_back(target_tex);
|
||||||
}
|
}
|
||||||
pthread_exit(NULL);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
} // startRoutine
|
} // startRoutine
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
void ThreadedTexLoader::handleCompletedTextures()
|
void ThreadedTexLoader::handleCompletedTextures()
|
||||||
{
|
{
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#ifndef HEADER_THREADED_TEX_LOADER_HPP
|
#ifndef HEADER_THREADED_TEX_LOADER_HPP
|
||||||
#define HEADER_THREADED_TEX_LOADER_HPP
|
#define HEADER_THREADED_TEX_LOADER_HPP
|
||||||
|
|
||||||
|
#include "utils/can_be_deleted.hpp"
|
||||||
#include "utils/no_copy.hpp"
|
#include "utils/no_copy.hpp"
|
||||||
#include "utils/types.hpp"
|
#include "utils/types.hpp"
|
||||||
|
|
||||||
@ -27,7 +28,7 @@
|
|||||||
class STKTexture;
|
class STKTexture;
|
||||||
class STKTexManager;
|
class STKTexManager;
|
||||||
|
|
||||||
class ThreadedTexLoader : public NoCopy
|
class ThreadedTexLoader : public NoCopy, public CanBeDeleted
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
const unsigned m_tex_capacity;
|
const unsigned m_tex_capacity;
|
||||||
@ -48,7 +49,7 @@ private:
|
|||||||
|
|
||||||
pthread_t m_thread;
|
pthread_t m_thread;
|
||||||
|
|
||||||
bool m_finished_loading, m_destroy, m_locked;
|
bool m_finished_loading, m_locked;
|
||||||
|
|
||||||
std::vector<STKTexture*> m_completed_textures;
|
std::vector<STKTexture*> m_completed_textures;
|
||||||
|
|
||||||
@ -63,8 +64,7 @@ public:
|
|||||||
m_pbo_ptr(pbo_ptr), m_texture_queue_mutex(mutex),
|
m_pbo_ptr(pbo_ptr), m_texture_queue_mutex(mutex),
|
||||||
m_cond_request(cond), m_stktm(stktm),
|
m_cond_request(cond), m_stktm(stktm),
|
||||||
m_tex_size_loaded(0), m_waiting_timeout(0),
|
m_tex_size_loaded(0), m_waiting_timeout(0),
|
||||||
m_finished_loading(false), m_destroy(false),
|
m_finished_loading(false), m_locked(false)
|
||||||
m_locked(false)
|
|
||||||
{
|
{
|
||||||
pthread_mutex_init(&m_mutex, NULL);
|
pthread_mutex_init(&m_mutex, NULL);
|
||||||
pthread_create(&m_thread, NULL, &startRoutine, this);
|
pthread_create(&m_thread, NULL, &startRoutine, this);
|
||||||
@ -72,7 +72,6 @@ public:
|
|||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
~ThreadedTexLoader()
|
~ThreadedTexLoader()
|
||||||
{
|
{
|
||||||
m_destroy = true;
|
|
||||||
pthread_mutex_destroy(&m_mutex);
|
pthread_mutex_destroy(&m_mutex);
|
||||||
pthread_join(m_thread, NULL);
|
pthread_join(m_thread, NULL);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user