mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 01:05:48 +01:00 
			
		
		
		
	Cleanup jthread and fix win32 build
This commit is contained in:
		@@ -31,7 +31,6 @@ BanManager::BanManager(const std::string &banfilepath):
 | 
			
		||||
		m_banfilepath(banfilepath),
 | 
			
		||||
		m_modified(false)
 | 
			
		||||
{
 | 
			
		||||
	m_mutex.Init();
 | 
			
		||||
	try{
 | 
			
		||||
		load();
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -82,7 +82,6 @@ QueuedMeshUpdate::~QueuedMeshUpdate()
 | 
			
		||||
	
 | 
			
		||||
MeshUpdateQueue::MeshUpdateQueue()
 | 
			
		||||
{
 | 
			
		||||
	m_mutex.Init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
MeshUpdateQueue::~MeshUpdateQueue()
 | 
			
		||||
@@ -474,7 +473,7 @@ void Client::step(float dtime)
 | 
			
		||||
 | 
			
		||||
			core::list<v3s16> deleted_blocks;
 | 
			
		||||
 | 
			
		||||
			float delete_unused_sectors_timeout = 
 | 
			
		||||
			float delete_unused_sectors_timeout =
 | 
			
		||||
				g_settings->getFloat("client_delete_unused_sectors_timeout");
 | 
			
		||||
	
 | 
			
		||||
			// Delete sector blocks
 | 
			
		||||
@@ -1266,7 +1265,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
 | 
			
		||||
		u32 index = 8 + MapNode::serializedLength(ser_version);
 | 
			
		||||
		if ((datasize >= index+1) && data[index]){
 | 
			
		||||
			remove_metadata = false;
 | 
			
		||||
		}	
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		addNode(p, n, remove_metadata);
 | 
			
		||||
	}
 | 
			
		||||
@@ -2126,7 +2125,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
 | 
			
		||||
		m_client_event_queue.push_back(event);
 | 
			
		||||
	}
 | 
			
		||||
	else if(command == TOCLIENT_HUDCHANGE)
 | 
			
		||||
	{	
 | 
			
		||||
	{
 | 
			
		||||
		std::string sdata;
 | 
			
		||||
		v2f v2fdata;
 | 
			
		||||
		u32 intdata = 0;
 | 
			
		||||
@@ -2155,7 +2154,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
 | 
			
		||||
		m_client_event_queue.push_back(event);
 | 
			
		||||
	}
 | 
			
		||||
	else if(command == TOCLIENT_HUD_SET_FLAGS)
 | 
			
		||||
	{	
 | 
			
		||||
	{
 | 
			
		||||
		std::string datastring((char *)&data[2], datasize - 2);
 | 
			
		||||
		std::istringstream is(datastring, std::ios_base::binary);
 | 
			
		||||
 | 
			
		||||
@@ -2264,7 +2263,7 @@ void Client::sendNodemetaFields(v3s16 p, const std::string &formname,
 | 
			
		||||
	Send(0, data, true);
 | 
			
		||||
}
 | 
			
		||||
	
 | 
			
		||||
void Client::sendInventoryFields(const std::string &formname, 
 | 
			
		||||
void Client::sendInventoryFields(const std::string &formname,
 | 
			
		||||
		const std::map<std::string, std::string> &fields)
 | 
			
		||||
{
 | 
			
		||||
	std::ostringstream os(std::ios_base::binary);
 | 
			
		||||
@@ -2468,7 +2467,7 @@ void Client::sendPlayerPos()
 | 
			
		||||
	writeV3S32(&data[2], position);
 | 
			
		||||
	writeV3S32(&data[2+12], speed);
 | 
			
		||||
	writeS32(&data[2+12+12], pitch);
 | 
			
		||||
	writeS32(&data[2+12+12+4], yaw);	
 | 
			
		||||
	writeS32(&data[2+12+12+4], yaw);
 | 
			
		||||
	writeU32(&data[2+12+12+4+4], keyPressed);
 | 
			
		||||
	// Send as unreliable
 | 
			
		||||
	Send(0, data, false);
 | 
			
		||||
 
 | 
			
		||||
@@ -50,9 +50,6 @@ ClientMap::ClientMap(
 | 
			
		||||
	m_camera_direction(0,0,1),
 | 
			
		||||
	m_camera_fov(M_PI)
 | 
			
		||||
{
 | 
			
		||||
	m_camera_mutex.Init();
 | 
			
		||||
	assert(m_camera_mutex.IsInitialized());
 | 
			
		||||
	
 | 
			
		||||
	m_box = core::aabbox3d<f32>(-BS*1000000,-BS*1000000,-BS*1000000,
 | 
			
		||||
			BS*1000000,BS*1000000,BS*1000000);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -206,7 +206,6 @@ JMutex g_debug_stacks_mutex;
 | 
			
		||||
 | 
			
		||||
void debug_stacks_init()
 | 
			
		||||
{
 | 
			
		||||
	g_debug_stacks_mutex.Init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void debug_stacks_print_to(std::ostream &os)
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
#include "server.h"
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <queue>
 | 
			
		||||
#include "jthread/jevent.h"
 | 
			
		||||
#include "map.h"
 | 
			
		||||
#include "environment.h"
 | 
			
		||||
#include "util/container.h"
 | 
			
		||||
@@ -106,7 +107,6 @@ EmergeManager::EmergeManager(IGameDef *gamedef) {
 | 
			
		||||
	
 | 
			
		||||
	mapgen_debug_info = g_settings->getBool("enable_mapgen_debug_info");
 | 
			
		||||
 | 
			
		||||
	queuemutex.Init();
 | 
			
		||||
	
 | 
			
		||||
	int nthreads;
 | 
			
		||||
	if (g_settings->get("num_emerge_threads").empty()) {
 | 
			
		||||
@@ -385,7 +385,7 @@ void EmergeManager::registerMapgen(std::string mgname, MapgenFactory *mgfactory)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
////////////////////////////// Emerge Thread ////////////////////////////////// 
 | 
			
		||||
////////////////////////////// Emerge Thread //////////////////////////////////
 | 
			
		||||
 | 
			
		||||
bool EmergeThread::popBlockEmerge(v3s16 *pos, u8 *flags) {
 | 
			
		||||
	std::map<v3s16, BlockEmergeData *>::iterator iter;
 | 
			
		||||
@@ -399,7 +399,7 @@ bool EmergeThread::popBlockEmerge(v3s16 *pos, u8 *flags) {
 | 
			
		||||
	*pos = p;
 | 
			
		||||
	
 | 
			
		||||
	iter = emerge->blocks_enqueued.find(p);
 | 
			
		||||
	if (iter == emerge->blocks_enqueued.end()) 
 | 
			
		||||
	if (iter == emerge->blocks_enqueued.end())
 | 
			
		||||
		return false; //uh oh, queue and map out of sync!!
 | 
			
		||||
 | 
			
		||||
	BlockEmergeData *bedata = iter->second;
 | 
			
		||||
@@ -414,11 +414,11 @@ bool EmergeThread::popBlockEmerge(v3s16 *pos, u8 *flags) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool EmergeThread::getBlockOrStartGen(v3s16 p, MapBlock **b, 
 | 
			
		||||
bool EmergeThread::getBlockOrStartGen(v3s16 p, MapBlock **b,
 | 
			
		||||
									BlockMakeData *data, bool allow_gen) {
 | 
			
		||||
	v2s16 p2d(p.X, p.Z);
 | 
			
		||||
	//envlock: usually takes <=1ms, sometimes 90ms or ~400ms to acquire
 | 
			
		||||
	JMutexAutoLock envlock(m_server->m_env_mutex); 
 | 
			
		||||
	JMutexAutoLock envlock(m_server->m_env_mutex);
 | 
			
		||||
	
 | 
			
		||||
	// Load sector if it isn't loaded
 | 
			
		||||
	if (map->getSectorNoGenerateNoEx(p2d) == NULL)
 | 
			
		||||
@@ -496,7 +496,7 @@ void *EmergeThread::Thread() {
 | 
			
		||||
 | 
			
		||||
			{
 | 
			
		||||
				//envlock: usually 0ms, but can take either 30 or 400ms to acquire
 | 
			
		||||
				JMutexAutoLock envlock(m_server->m_env_mutex); 
 | 
			
		||||
				JMutexAutoLock envlock(m_server->m_env_mutex);
 | 
			
		||||
				ScopeProfiler sp(g_profiler, "EmergeThread: after "
 | 
			
		||||
						"Mapgen::makeChunk (envlock)", SPT_AVG);
 | 
			
		||||
 | 
			
		||||
@@ -513,7 +513,7 @@ void *EmergeThread::Thread() {
 | 
			
		||||
 | 
			
		||||
					// Ignore map edit events, they will not need to be sent
 | 
			
		||||
					// to anybody because the block hasn't been sent to anybody
 | 
			
		||||
					MapEditEventAreaIgnorer 
 | 
			
		||||
					MapEditEventAreaIgnorer
 | 
			
		||||
						ign(&m_server->m_ignore_map_edit_events_area,
 | 
			
		||||
						VoxelArea(minp, maxp));
 | 
			
		||||
					{  // takes about 90ms with -O1 on an e3-1230v2
 | 
			
		||||
 
 | 
			
		||||
@@ -3,11 +3,13 @@ if( UNIX )
 | 
			
		||||
		${CMAKE_CURRENT_SOURCE_DIR}/pthread/jmutex.cpp
 | 
			
		||||
		${CMAKE_CURRENT_SOURCE_DIR}/pthread/jthread.cpp
 | 
			
		||||
		${CMAKE_CURRENT_SOURCE_DIR}/pthread/jsemaphore.cpp
 | 
			
		||||
		${CMAKE_CURRENT_SOURCE_DIR}/pthread/jevent.cpp
 | 
			
		||||
		PARENT_SCOPE)
 | 
			
		||||
else( UNIX )
 | 
			
		||||
	set(JTHREAD_SRCS
 | 
			
		||||
		${CMAKE_CURRENT_SOURCE_DIR}/win32/jmutex.cpp
 | 
			
		||||
		${CMAKE_CURRENT_SOURCE_DIR}/win32/jthread.cpp
 | 
			
		||||
		${CMAKE_CURRENT_SOURCE_DIR}/win32/jsemaphore.cpp
 | 
			
		||||
		${CMAKE_CURRENT_SOURCE_DIR}/win32/jevent.cpp
 | 
			
		||||
		PARENT_SCOPE)
 | 
			
		||||
endif( UNIX )
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										52
									
								
								src/jthread/jevent.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/jthread/jevent.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
    This file is a part of the JThread package, which contains some object-
 | 
			
		||||
    oriented thread wrappers for different thread implementations.
 | 
			
		||||
 | 
			
		||||
    Copyright (c) 2000-2006  Jori Liesenborgs (jori.liesenborgs@gmail.com)
 | 
			
		||||
 | 
			
		||||
    Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
    copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
    to deal in the Software without restriction, including without limitation
 | 
			
		||||
    the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
    and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
    Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
    The above copyright notice and this permission notice shall be included in
 | 
			
		||||
    all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
    THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 | 
			
		||||
    DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef JEVENT_H_
 | 
			
		||||
#define JEVENT_H_
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
#else
 | 
			
		||||
#include <semaphore.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Event {
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
	HANDLE hEvent;
 | 
			
		||||
#else
 | 
			
		||||
	sem_t sem;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	Event();
 | 
			
		||||
	~Event();
 | 
			
		||||
	void wait();
 | 
			
		||||
	void signal();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* JEVENT_H_ */
 | 
			
		||||
@@ -53,10 +53,8 @@ class JMutex
 | 
			
		||||
public:
 | 
			
		||||
	JMutex();
 | 
			
		||||
	~JMutex();
 | 
			
		||||
	int Init();
 | 
			
		||||
	int Lock();
 | 
			
		||||
	int Unlock();
 | 
			
		||||
	bool IsInitialized() 						{ return initialized; }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
#if (defined(WIN32) || defined(_WIN32_WCE))
 | 
			
		||||
@@ -76,57 +74,6 @@ private:
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
#endif // WIN32
 | 
			
		||||
	bool initialized;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
 | 
			
		||||
class Event {
 | 
			
		||||
	HANDLE hEvent;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	Event() {
 | 
			
		||||
		hEvent = CreateEvent(NULL, 0, 0, NULL);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	~Event() {
 | 
			
		||||
		CloseHandle(hEvent);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	void wait() {
 | 
			
		||||
		WaitForSingleObject(hEvent, INFINITE); 
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	void signal() {
 | 
			
		||||
		SetEvent(hEvent);
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#include <semaphore.h>
 | 
			
		||||
 | 
			
		||||
class Event {
 | 
			
		||||
	sem_t sem;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	Event() {
 | 
			
		||||
		sem_init(&sem, 0, 0);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	~Event() {
 | 
			
		||||
		sem_destroy(&sem);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	void wait() {
 | 
			
		||||
		sem_wait(&sem);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	void signal() {
 | 
			
		||||
		sem_post(&sem);
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // JMUTEX_H
 | 
			
		||||
 
 | 
			
		||||
@@ -74,7 +74,6 @@ private:
 | 
			
		||||
 | 
			
		||||
	JMutex runningmutex;
 | 
			
		||||
	JMutex continuemutex,continuemutex2;
 | 
			
		||||
	bool mutexinit;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // JTHREAD_H
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										44
									
								
								src/jthread/pthread/jevent.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/jthread/pthread/jevent.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
    This file is a part of the JThread package, which contains some object-
 | 
			
		||||
    oriented thread wrappers for different thread implementations.
 | 
			
		||||
 | 
			
		||||
    Copyright (c) 2000-2006  Jori Liesenborgs (jori.liesenborgs@gmail.com)
 | 
			
		||||
 | 
			
		||||
    Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
    copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
    to deal in the Software without restriction, including without limitation
 | 
			
		||||
    the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
    and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
    Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
    The above copyright notice and this permission notice shall be included in
 | 
			
		||||
    all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
    THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 | 
			
		||||
    DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include "jthread/jevent.h"
 | 
			
		||||
 | 
			
		||||
Event::Event() {
 | 
			
		||||
	assert(sem_init(&sem, 0, 0) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Event::~Event() {
 | 
			
		||||
	assert(sem_destroy(&sem) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Event::wait() {
 | 
			
		||||
	assert(sem_wait(&sem) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Event::signal() {
 | 
			
		||||
	assert(sem_post(&sem) == 0);
 | 
			
		||||
}
 | 
			
		||||
@@ -24,40 +24,27 @@
 | 
			
		||||
    DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include "jthread/jmutex.h"
 | 
			
		||||
 | 
			
		||||
JMutex::JMutex()
 | 
			
		||||
{
 | 
			
		||||
	pthread_mutex_init(&mutex,NULL);
 | 
			
		||||
	initialized = true;
 | 
			
		||||
	assert(pthread_mutex_init(&mutex,NULL) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
JMutex::~JMutex()
 | 
			
		||||
{
 | 
			
		||||
	if (initialized)
 | 
			
		||||
		pthread_mutex_destroy(&mutex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int JMutex::Init()
 | 
			
		||||
{
 | 
			
		||||
	return 0;
 | 
			
		||||
	assert(pthread_mutex_destroy(&mutex) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int JMutex::Lock()
 | 
			
		||||
{
 | 
			
		||||
	if (!initialized)
 | 
			
		||||
		return ERR_JMUTEX_NOTINIT;
 | 
			
		||||
 | 
			
		||||
	pthread_mutex_lock(&mutex);
 | 
			
		||||
	assert(pthread_mutex_lock(&mutex) == 0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int JMutex::Unlock()
 | 
			
		||||
{
 | 
			
		||||
	if (!initialized)
 | 
			
		||||
		return ERR_JMUTEX_NOTINIT;
 | 
			
		||||
 | 
			
		||||
	pthread_mutex_unlock(&mutex);
 | 
			
		||||
	assert(pthread_mutex_unlock(&mutex) == 0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,26 +16,27 @@ You should have received a copy of the GNU Lesser General Public License along
 | 
			
		||||
with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
*/
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include "jthread/jsemaphore.h"
 | 
			
		||||
 | 
			
		||||
JSemaphore::JSemaphore() {
 | 
			
		||||
	sem_init(&m_semaphore,0,0);
 | 
			
		||||
	assert(sem_init(&m_semaphore,0,0) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
JSemaphore::~JSemaphore() {
 | 
			
		||||
	sem_destroy(&m_semaphore);
 | 
			
		||||
	assert(sem_destroy(&m_semaphore) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
JSemaphore::JSemaphore(int initval) {
 | 
			
		||||
	sem_init(&m_semaphore,0,initval);
 | 
			
		||||
	assert(sem_init(&m_semaphore,0,initval) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JSemaphore::Post() {
 | 
			
		||||
	sem_post(&m_semaphore);
 | 
			
		||||
	assert(sem_post(&m_semaphore) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JSemaphore::Wait() {
 | 
			
		||||
	sem_wait(&m_semaphore);
 | 
			
		||||
	assert(sem_wait(&m_semaphore) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int JSemaphore::GetValue() {
 | 
			
		||||
 
 | 
			
		||||
@@ -33,7 +33,6 @@
 | 
			
		||||
JThread::JThread()
 | 
			
		||||
{
 | 
			
		||||
	retval = NULL;
 | 
			
		||||
	mutexinit = false;
 | 
			
		||||
	requeststop = false;
 | 
			
		||||
	running = false;
 | 
			
		||||
}
 | 
			
		||||
@@ -53,26 +52,6 @@ int JThread::Start()
 | 
			
		||||
{
 | 
			
		||||
	int status;
 | 
			
		||||
 | 
			
		||||
	if (!mutexinit)
 | 
			
		||||
	{
 | 
			
		||||
		if (!runningmutex.IsInitialized())
 | 
			
		||||
		{
 | 
			
		||||
			if (runningmutex.Init() < 0)
 | 
			
		||||
				return ERR_JTHREAD_CANTINITMUTEX;
 | 
			
		||||
		}
 | 
			
		||||
		if (!continuemutex.IsInitialized())
 | 
			
		||||
		{
 | 
			
		||||
			if (continuemutex.Init() < 0)
 | 
			
		||||
				return ERR_JTHREAD_CANTINITMUTEX;
 | 
			
		||||
		}
 | 
			
		||||
		if (!continuemutex2.IsInitialized())
 | 
			
		||||
		{
 | 
			
		||||
			if (continuemutex2.Init() < 0)
 | 
			
		||||
				return ERR_JTHREAD_CANTINITMUTEX;
 | 
			
		||||
		}
 | 
			
		||||
		mutexinit = true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	runningmutex.Lock();
 | 
			
		||||
	if (running)
 | 
			
		||||
	{
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										43
									
								
								src/jthread/win32/jevent.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/jthread/win32/jevent.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
    This file is a part of the JThread package, which contains some object-
 | 
			
		||||
    oriented thread wrappers for different thread implementations.
 | 
			
		||||
 | 
			
		||||
    Copyright (c) 2000-2006  Jori Liesenborgs (jori.liesenborgs@gmail.com)
 | 
			
		||||
 | 
			
		||||
    Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
    copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
    to deal in the Software without restriction, including without limitation
 | 
			
		||||
    the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
    and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
    Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
    The above copyright notice and this permission notice shall be included in
 | 
			
		||||
    all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
			
		||||
    THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 | 
			
		||||
    DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
#include "jthread/jevent.h"
 | 
			
		||||
 | 
			
		||||
Event::Event() {
 | 
			
		||||
	hEvent = CreateEvent(NULL, 0, 0, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Event::~Event() {
 | 
			
		||||
	CloseHandle(hEvent);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Event::wait() {
 | 
			
		||||
	WaitForSingleObject(hEvent, INFINITE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Event::signal() {
 | 
			
		||||
	SetEvent(hEvent);
 | 
			
		||||
}
 | 
			
		||||
@@ -24,7 +24,7 @@
 | 
			
		||||
    DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include "jthread/jmutex.h"
 | 
			
		||||
 | 
			
		||||
JMutex::JMutex()
 | 
			
		||||
@@ -33,31 +33,21 @@ JMutex::JMutex()
 | 
			
		||||
	InitializeCriticalSection(&mutex);
 | 
			
		||||
#else
 | 
			
		||||
	mutex = CreateMutex(NULL,FALSE,NULL);
 | 
			
		||||
	if (mutex == NULL)
 | 
			
		||||
		return ERR_JMUTEX_CANTCREATEMUTEX;
 | 
			
		||||
	assert(mutex != NULL);
 | 
			
		||||
#endif // JMUTEX_CRITICALSECTION
 | 
			
		||||
	initialized = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
JMutex::~JMutex()
 | 
			
		||||
{
 | 
			
		||||
	if (initialized)
 | 
			
		||||
#ifdef JMUTEX_CRITICALSECTION
 | 
			
		||||
		DeleteCriticalSection(&mutex);
 | 
			
		||||
	DeleteCriticalSection(&mutex);
 | 
			
		||||
#else
 | 
			
		||||
		CloseHandle(mutex);
 | 
			
		||||
	CloseHandle(mutex);
 | 
			
		||||
#endif // JMUTEX_CRITICALSECTION
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int JMutex::Init()
 | 
			
		||||
{
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int JMutex::Lock()
 | 
			
		||||
{
 | 
			
		||||
	if (!initialized)
 | 
			
		||||
		return ERR_JMUTEX_NOTINIT;
 | 
			
		||||
#ifdef JMUTEX_CRITICALSECTION
 | 
			
		||||
	EnterCriticalSection(&mutex);
 | 
			
		||||
#else
 | 
			
		||||
@@ -68,8 +58,6 @@ int JMutex::Lock()
 | 
			
		||||
 | 
			
		||||
int JMutex::Unlock()
 | 
			
		||||
{
 | 
			
		||||
	if (!initialized)
 | 
			
		||||
		return ERR_JMUTEX_NOTINIT;
 | 
			
		||||
#ifdef JMUTEX_CRITICALSECTION
 | 
			
		||||
	LeaveCriticalSection(&mutex);
 | 
			
		||||
#else
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,6 @@
 | 
			
		||||
JThread::JThread()
 | 
			
		||||
{
 | 
			
		||||
	retval = NULL;
 | 
			
		||||
	mutexinit = false;
 | 
			
		||||
	requeststop = false;
 | 
			
		||||
	running = false;
 | 
			
		||||
}
 | 
			
		||||
@@ -52,25 +51,6 @@ void JThread::Stop() {
 | 
			
		||||
 | 
			
		||||
int JThread::Start()
 | 
			
		||||
{
 | 
			
		||||
	if (!mutexinit)
 | 
			
		||||
	{
 | 
			
		||||
		if (!runningmutex.IsInitialized())
 | 
			
		||||
		{
 | 
			
		||||
			if (runningmutex.Init() < 0)
 | 
			
		||||
				return ERR_JTHREAD_CANTINITMUTEX;
 | 
			
		||||
		}
 | 
			
		||||
		if (!continuemutex.IsInitialized())
 | 
			
		||||
		{
 | 
			
		||||
			if (continuemutex.Init() < 0)
 | 
			
		||||
				return ERR_JTHREAD_CANTINITMUTEX;
 | 
			
		||||
		}
 | 
			
		||||
		if (!continuemutex2.IsInitialized())
 | 
			
		||||
		{
 | 
			
		||||
			if (continuemutex2.Init() < 0)
 | 
			
		||||
				return ERR_JTHREAD_CANTINITMUTEX;
 | 
			
		||||
		}		mutexinit = true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	runningmutex.Lock();
 | 
			
		||||
	if (running)
 | 
			
		||||
	{
 | 
			
		||||
 
 | 
			
		||||
@@ -86,7 +86,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if USE_CURL
 | 
			
		||||
#include "curl.h"
 | 
			
		||||
#include "curl/curl.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@@ -708,7 +708,6 @@ void SpeedTests()
 | 
			
		||||
		TimeTaker timer("Testing mutex speed");
 | 
			
		||||
 | 
			
		||||
		JMutex m;
 | 
			
		||||
		m.Init();
 | 
			
		||||
		u32 n = 0;
 | 
			
		||||
		u32 i = 0;
 | 
			
		||||
		do{
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								src/map.cpp
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								src/map.cpp
									
									
									
									
									
								
							@@ -75,8 +75,6 @@ Map::Map(std::ostream &dout, IGameDef *gamedef):
 | 
			
		||||
	m_gamedef(gamedef),
 | 
			
		||||
	m_sector_cache(NULL)
 | 
			
		||||
{
 | 
			
		||||
	/*m_sector_mutex.Init();
 | 
			
		||||
	assert(m_sector_mutex.IsInitialized());*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Map::~Map()
 | 
			
		||||
@@ -1681,7 +1679,7 @@ void Map::transformLiquidsFinite(std::map<v3s16, MapBlock*> & modified_blocks)
 | 
			
		||||
		v3s16 p0 = m_transforming_liquid.pop_front();
 | 
			
		||||
		u16 total_level = 0;
 | 
			
		||||
		// surrounding flowing liquid nodes
 | 
			
		||||
		NodeNeighbor neighbors[7]; 
 | 
			
		||||
		NodeNeighbor neighbors[7];
 | 
			
		||||
		// current level of every block
 | 
			
		||||
		s8 liquid_levels[7] = {-1, -1, -1, -1, -1, -1, -1};
 | 
			
		||||
		 // target levels
 | 
			
		||||
@@ -1782,8 +1780,8 @@ void Map::transformLiquidsFinite(std::map<v3s16, MapBlock*> & modified_blocks)
 | 
			
		||||
			liquid_levels[D_BOTTOM] == LIQUID_LEVEL_SOURCE &&
 | 
			
		||||
			total_level >= LIQUID_LEVEL_SOURCE * can_liquid_same_level-
 | 
			
		||||
			(can_liquid_same_level - relax) &&
 | 
			
		||||
			can_liquid_same_level >= relax + 1) { 
 | 
			
		||||
			total_level = LIQUID_LEVEL_SOURCE * can_liquid_same_level; 
 | 
			
		||||
			can_liquid_same_level >= relax + 1) {
 | 
			
		||||
			total_level = LIQUID_LEVEL_SOURCE * can_liquid_same_level;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// prevent lakes in air above unloaded blocks
 | 
			
		||||
@@ -1792,9 +1790,9 @@ void Map::transformLiquidsFinite(std::map<v3s16, MapBlock*> & modified_blocks)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// calculate self level 5 blocks
 | 
			
		||||
		u8 want_level = 
 | 
			
		||||
		u8 want_level =
 | 
			
		||||
			  total_level >= LIQUID_LEVEL_SOURCE * can_liquid_same_level
 | 
			
		||||
			? LIQUID_LEVEL_SOURCE 
 | 
			
		||||
			? LIQUID_LEVEL_SOURCE
 | 
			
		||||
			: total_level / can_liquid_same_level;
 | 
			
		||||
		total_level -= want_level * can_liquid_same_level;
 | 
			
		||||
 | 
			
		||||
@@ -1852,7 +1850,7 @@ void Map::transformLiquidsFinite(std::map<v3s16, MapBlock*> & modified_blocks)
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		if (total_level > 0) //|| flowed != volume)
 | 
			
		||||
			infostream <<" AFTER level=" << (int)total_level 
 | 
			
		||||
			infostream <<" AFTER level=" << (int)total_level
 | 
			
		||||
			//<< " flowed="<<flowed<< " volume=" << volume
 | 
			
		||||
			<< " wantsame="<<(int)want_level<< " top="
 | 
			
		||||
			<< (int)liquid_levels_want[D_TOP]<< " topwas="
 | 
			
		||||
@@ -1862,7 +1860,7 @@ void Map::transformLiquidsFinite(std::map<v3s16, MapBlock*> & modified_blocks)
 | 
			
		||||
 | 
			
		||||
		//u8 changed = 0;
 | 
			
		||||
		for (u16 i = 0; i < 7; i++) {
 | 
			
		||||
			if (liquid_levels_want[i] < 0 || !neighbors[i].l) 
 | 
			
		||||
			if (liquid_levels_want[i] < 0 || !neighbors[i].l)
 | 
			
		||||
				continue;
 | 
			
		||||
			MapNode & n0 = neighbors[i].n;
 | 
			
		||||
			p0 = neighbors[i].p;
 | 
			
		||||
@@ -1909,7 +1907,7 @@ void Map::transformLiquidsFinite(std::map<v3s16, MapBlock*> & modified_blocks)
 | 
			
		||||
			 */
 | 
			
		||||
			/*
 | 
			
		||||
			if (
 | 
			
		||||
				 new_node_content == n0.getContent() 
 | 
			
		||||
				 new_node_content == n0.getContent()
 | 
			
		||||
				&& (nodemgr->get(n0.getContent()).liquid_type != LIQUID_FLOWING ||
 | 
			
		||||
				 (n0.getLevel(nodemgr) == (u8)new_node_level
 | 
			
		||||
				 //&& ((n0.param2 & LIQUID_FLOW_DOWN_MASK) ==
 | 
			
		||||
 
 | 
			
		||||
@@ -68,7 +68,6 @@ MapBlock::MapBlock(Map *parent, v3s16 pos, IGameDef *gamedef, bool dummy):
 | 
			
		||||
		reallocate();
 | 
			
		||||
	
 | 
			
		||||
#ifndef SERVER
 | 
			
		||||
	//mesh_mutex.Init();
 | 
			
		||||
	mesh = NULL;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,6 @@ class Profiler
 | 
			
		||||
public:
 | 
			
		||||
	Profiler()
 | 
			
		||||
	{
 | 
			
		||||
		m_mutex.Init();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void add(const std::string &name, float value)
 | 
			
		||||
 
 | 
			
		||||
@@ -55,7 +55,6 @@ static void makeMutex()
 | 
			
		||||
{
 | 
			
		||||
	if(!g_mutex){
 | 
			
		||||
		g_mutex = new JMutex();
 | 
			
		||||
		g_mutex->Init();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -62,8 +62,6 @@ public:
 | 
			
		||||
 | 
			
		||||
ScriptApiBase::ScriptApiBase()
 | 
			
		||||
{
 | 
			
		||||
	m_luastackmutex.Init();
 | 
			
		||||
 | 
			
		||||
	#ifdef SCRIPTAPI_LOCK_DEBUG
 | 
			
		||||
	m_locked = false;
 | 
			
		||||
	#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -36,8 +36,6 @@ AsyncEngine::AsyncEngine() :
 | 
			
		||||
	m_initDone(false),
 | 
			
		||||
	m_JobIdCounter(0)
 | 
			
		||||
{
 | 
			
		||||
	assert(m_JobQueueMutex.Init() == 0);
 | 
			
		||||
	assert(m_ResultQueueMutex.Init() == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/******************************************************************************/
 | 
			
		||||
 
 | 
			
		||||
@@ -674,9 +674,6 @@ Server::Server(
 | 
			
		||||
	m_emergethread_trigger_timer = 0.0;
 | 
			
		||||
	m_savemap_timer = 0.0;
 | 
			
		||||
 | 
			
		||||
	m_env_mutex.Init();
 | 
			
		||||
	m_con_mutex.Init();
 | 
			
		||||
	m_step_dtime_mutex.Init();
 | 
			
		||||
	m_step_dtime = 0.0;
 | 
			
		||||
 | 
			
		||||
	if(path_world == "")
 | 
			
		||||
@@ -722,7 +719,7 @@ Server::Server(
 | 
			
		||||
	m_mods = modconf.getMods();
 | 
			
		||||
	std::vector<ModSpec> unsatisfied_mods = modconf.getUnsatisfiedMods();
 | 
			
		||||
	// complain about mods with unsatisfied dependencies
 | 
			
		||||
	if(!modconf.isConsistent())	
 | 
			
		||||
	if(!modconf.isConsistent())
 | 
			
		||||
	{
 | 
			
		||||
		for(std::vector<ModSpec>::iterator it = unsatisfied_mods.begin();
 | 
			
		||||
			it != unsatisfied_mods.end(); ++it)
 | 
			
		||||
@@ -741,10 +738,10 @@ Server::Server(
 | 
			
		||||
	worldmt_settings.readConfigFile(worldmt.c_str());
 | 
			
		||||
	std::vector<std::string> names = worldmt_settings.getNames();
 | 
			
		||||
	std::set<std::string> load_mod_names;
 | 
			
		||||
	for(std::vector<std::string>::iterator it = names.begin(); 
 | 
			
		||||
	for(std::vector<std::string>::iterator it = names.begin();
 | 
			
		||||
		it != names.end(); ++it)
 | 
			
		||||
	{	
 | 
			
		||||
		std::string name = *it;  
 | 
			
		||||
	{
 | 
			
		||||
		std::string name = *it;
 | 
			
		||||
		if(name.compare(0,9,"load_mod_")==0 && worldmt_settings.getBool(name))
 | 
			
		||||
			load_mod_names.insert(name.substr(9));
 | 
			
		||||
	}
 | 
			
		||||
@@ -756,7 +753,7 @@ Server::Server(
 | 
			
		||||
			it != unsatisfied_mods.end(); ++it)
 | 
			
		||||
		load_mod_names.erase((*it).name);
 | 
			
		||||
	if(!load_mod_names.empty())
 | 
			
		||||
	{		
 | 
			
		||||
	{
 | 
			
		||||
		errorstream << "The following mods could not be found:";
 | 
			
		||||
		for(std::set<std::string>::iterator it = load_mod_names.begin();
 | 
			
		||||
			it != load_mod_names.end(); ++it)
 | 
			
		||||
 
 | 
			
		||||
@@ -60,7 +60,6 @@ class Settings
 | 
			
		||||
public:
 | 
			
		||||
	Settings()
 | 
			
		||||
	{
 | 
			
		||||
		m_mutex.Init();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void writeLines(std::ostream &os)
 | 
			
		||||
@@ -77,7 +76,7 @@ public:
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
  
 | 
			
		||||
	// return all keys used 
 | 
			
		||||
	// return all keys used
 | 
			
		||||
	std::vector<std::string> getNames(){
 | 
			
		||||
		std::vector<std::string> names;
 | 
			
		||||
		for(std::map<std::string, std::string>::iterator
 | 
			
		||||
@@ -86,7 +85,7 @@ public:
 | 
			
		||||
		{
 | 
			
		||||
			names.push_back(i->first);
 | 
			
		||||
		}
 | 
			
		||||
		return names;  
 | 
			
		||||
		return names;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// remove a setting
 | 
			
		||||
 
 | 
			
		||||
@@ -373,8 +373,6 @@ ShaderSource::ShaderSource(IrrlichtDevice *device):
 | 
			
		||||
 | 
			
		||||
	m_shader_callback = new ShaderCallback(this, "default");
 | 
			
		||||
 | 
			
		||||
	m_shaderinfo_cache_mutex.Init();
 | 
			
		||||
 | 
			
		||||
	m_main_thread = get_current_thread_id();
 | 
			
		||||
 | 
			
		||||
	// Add a dummy ShaderInfo as the first index, named ""
 | 
			
		||||
 
 | 
			
		||||
@@ -433,8 +433,6 @@ TextureSource::TextureSource(IrrlichtDevice *device):
 | 
			
		||||
{
 | 
			
		||||
	assert(m_device);
 | 
			
		||||
 | 
			
		||||
	m_textureinfo_cache_mutex.Init();
 | 
			
		||||
 | 
			
		||||
	m_main_thread = get_current_thread_id();
 | 
			
		||||
 | 
			
		||||
	// Add a NULL TextureInfo as the first index, named ""
 | 
			
		||||
 
 | 
			
		||||
@@ -83,8 +83,6 @@ class MutexedMap
 | 
			
		||||
public:
 | 
			
		||||
	MutexedMap()
 | 
			
		||||
	{
 | 
			
		||||
		m_mutex.Init();
 | 
			
		||||
		assert(m_mutex.IsInitialized());
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	void set(const Key &name, const Value &value)
 | 
			
		||||
@@ -150,8 +148,6 @@ class MutexedIdGenerator
 | 
			
		||||
public:
 | 
			
		||||
	MutexedIdGenerator()
 | 
			
		||||
	{
 | 
			
		||||
		m_mutex.Init();
 | 
			
		||||
		assert(m_mutex.IsInitialized());
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	// Returns true if found
 | 
			
		||||
@@ -253,7 +249,6 @@ class MutexedQueue
 | 
			
		||||
public:
 | 
			
		||||
	MutexedQueue()
 | 
			
		||||
	{
 | 
			
		||||
		m_mutex.Init();
 | 
			
		||||
	}
 | 
			
		||||
	bool empty()
 | 
			
		||||
	{
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,6 @@ public:
 | 
			
		||||
	MutexedVariable(T value):
 | 
			
		||||
		m_value(value)
 | 
			
		||||
	{
 | 
			
		||||
		m_mutex.Init();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	T get()
 | 
			
		||||
@@ -75,7 +74,6 @@ public:
 | 
			
		||||
		JThread(),
 | 
			
		||||
		run(true)
 | 
			
		||||
	{
 | 
			
		||||
		run_mutex.Init();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	virtual ~SimpleThread()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user