mirror of
https://github.com/luanti-org/luanti.git
synced 2025-07-22 17:18:39 +00:00
Fix modstore/favourites hang by adding asynchronous lua job support
This commit is contained in:
parent
b08d7558de
commit
2e66aca357
27 changed files with 2271 additions and 559 deletions
|
@ -2,10 +2,12 @@ if( UNIX )
|
|||
set(JTHREAD_SRCS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/pthread/jmutex.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/pthread/jthread.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/pthread/jsemaphore.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
|
||||
PARENT_SCOPE)
|
||||
endif( UNIX )
|
||||
|
|
50
src/jthread/jsemaphore.h
Normal file
50
src/jthread/jsemaphore.h
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
Minetest
|
||||
Copyright (C) 2013 sapier, < sapier AT gmx DOT net >
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#ifndef JSEMAPHORE_H_
|
||||
#define JSEMAPHORE_H_
|
||||
|
||||
#if defined(WIN32)
|
||||
#include <windows.h>
|
||||
#define MAX_SEMAPHORE_COUNT 1024
|
||||
#else
|
||||
#include <pthread.h>
|
||||
#include <semaphore.h>
|
||||
#endif
|
||||
|
||||
class JSemaphore {
|
||||
public:
|
||||
JSemaphore();
|
||||
~JSemaphore();
|
||||
JSemaphore(int initval);
|
||||
|
||||
void Post();
|
||||
void Wait();
|
||||
|
||||
int GetValue();
|
||||
|
||||
private:
|
||||
#if defined(WIN32)
|
||||
HANDLE m_hSemaphore;
|
||||
#else
|
||||
sem_t m_semaphore;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif /* JSEMAPHORE_H_ */
|
|
@ -43,6 +43,7 @@ public:
|
|||
JThread();
|
||||
virtual ~JThread();
|
||||
int Start();
|
||||
void Stop();
|
||||
int Kill();
|
||||
virtual void *Thread() = 0;
|
||||
bool IsRunning();
|
||||
|
@ -63,12 +64,12 @@ private:
|
|||
HANDLE threadhandle;
|
||||
#else // pthread type threads
|
||||
static void *TheThread(void *param);
|
||||
|
||||
|
||||
pthread_t threadid;
|
||||
#endif // WIN32
|
||||
void *retval;
|
||||
bool running;
|
||||
|
||||
|
||||
JMutex runningmutex;
|
||||
JMutex continuemutex,continuemutex2;
|
||||
bool mutexinit;
|
||||
|
|
48
src/jthread/pthread/jsemaphore.cpp
Normal file
48
src/jthread/pthread/jsemaphore.cpp
Normal file
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
Minetest
|
||||
Copyright (C) 2013 sapier, < sapier AT gmx DOT net >
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
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 "jthread/jsemaphore.h"
|
||||
|
||||
JSemaphore::JSemaphore() {
|
||||
sem_init(&m_semaphore,0,0);
|
||||
}
|
||||
|
||||
JSemaphore::~JSemaphore() {
|
||||
sem_destroy(&m_semaphore);
|
||||
}
|
||||
|
||||
JSemaphore::JSemaphore(int initval) {
|
||||
sem_init(&m_semaphore,0,initval);
|
||||
}
|
||||
|
||||
void JSemaphore::Post() {
|
||||
sem_post(&m_semaphore);
|
||||
}
|
||||
|
||||
void JSemaphore::Wait() {
|
||||
sem_wait(&m_semaphore);
|
||||
}
|
||||
|
||||
int JSemaphore::GetValue() {
|
||||
|
||||
int retval = 0;
|
||||
sem_getvalue(&m_semaphore,&retval);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
|
@ -42,6 +42,12 @@ JThread::~JThread()
|
|||
Kill();
|
||||
}
|
||||
|
||||
void JThread::Stop() {
|
||||
runningmutex.Lock();
|
||||
running = false;
|
||||
runningmutex.Unlock();
|
||||
}
|
||||
|
||||
int JThread::Start()
|
||||
{
|
||||
int status;
|
||||
|
@ -65,7 +71,7 @@ int JThread::Start()
|
|||
}
|
||||
mutexinit = true;
|
||||
}
|
||||
|
||||
|
||||
runningmutex.Lock();
|
||||
if (running)
|
||||
{
|
||||
|
@ -73,27 +79,27 @@ int JThread::Start()
|
|||
return ERR_JTHREAD_ALREADYRUNNING;
|
||||
}
|
||||
runningmutex.Unlock();
|
||||
|
||||
|
||||
pthread_attr_t attr;
|
||||
pthread_attr_init(&attr);
|
||||
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
|
||||
|
||||
|
||||
continuemutex.Lock();
|
||||
status = pthread_create(&threadid,&attr,TheThread,this);
|
||||
status = pthread_create(&threadid,&attr,TheThread,this);
|
||||
pthread_attr_destroy(&attr);
|
||||
if (status != 0)
|
||||
{
|
||||
continuemutex.Unlock();
|
||||
return ERR_JTHREAD_CANTSTARTTHREAD;
|
||||
}
|
||||
|
||||
|
||||
/* Wait until 'running' is set */
|
||||
|
||||
runningmutex.Lock();
|
||||
|
||||
runningmutex.Lock();
|
||||
while (!running)
|
||||
{
|
||||
runningmutex.Unlock();
|
||||
|
||||
|
||||
struct timespec req,rem;
|
||||
|
||||
req.tv_sec = 0;
|
||||
|
@ -103,9 +109,9 @@ int JThread::Start()
|
|||
runningmutex.Lock();
|
||||
}
|
||||
runningmutex.Unlock();
|
||||
|
||||
|
||||
continuemutex.Unlock();
|
||||
|
||||
|
||||
continuemutex2.Lock();
|
||||
continuemutex2.Unlock();
|
||||
return 0;
|
||||
|
@ -113,7 +119,7 @@ int JThread::Start()
|
|||
|
||||
int JThread::Kill()
|
||||
{
|
||||
runningmutex.Lock();
|
||||
runningmutex.Lock();
|
||||
if (!running)
|
||||
{
|
||||
runningmutex.Unlock();
|
||||
|
@ -128,8 +134,8 @@ int JThread::Kill()
|
|||
bool JThread::IsRunning()
|
||||
{
|
||||
bool r;
|
||||
|
||||
runningmutex.Lock();
|
||||
|
||||
runningmutex.Lock();
|
||||
r = running;
|
||||
runningmutex.Unlock();
|
||||
return r;
|
||||
|
@ -138,7 +144,7 @@ bool JThread::IsRunning()
|
|||
void *JThread::GetReturnValue()
|
||||
{
|
||||
void *val;
|
||||
|
||||
|
||||
runningmutex.Lock();
|
||||
if (running)
|
||||
val = NULL;
|
||||
|
@ -157,17 +163,17 @@ void *JThread::TheThread(void *param)
|
|||
{
|
||||
JThread *jthread;
|
||||
void *ret;
|
||||
|
||||
|
||||
jthread = (JThread *)param;
|
||||
|
||||
|
||||
jthread->continuemutex2.Lock();
|
||||
jthread->runningmutex.Lock();
|
||||
jthread->running = true;
|
||||
jthread->runningmutex.Unlock();
|
||||
|
||||
|
||||
jthread->continuemutex.Lock();
|
||||
jthread->continuemutex.Unlock();
|
||||
|
||||
|
||||
ret = jthread->Thread();
|
||||
|
||||
jthread->runningmutex.Lock();
|
||||
|
|
64
src/jthread/win32/jsemaphore.cpp
Normal file
64
src/jthread/win32/jsemaphore.cpp
Normal file
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
Minetest
|
||||
Copyright (C) 2013 sapier, < sapier AT gmx DOT net >
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
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 "jthread/jsemaphore.h"
|
||||
|
||||
JSemaphore::JSemaphore() {
|
||||
m_hSemaphore = CreateSemaphore(
|
||||
0,
|
||||
0,
|
||||
MAX_SEMAPHORE_COUNT,
|
||||
0);
|
||||
}
|
||||
|
||||
JSemaphore::~JSemaphore() {
|
||||
CloseHandle(&m_hSemaphore);
|
||||
}
|
||||
|
||||
JSemaphore::JSemaphore(int initval) {
|
||||
m_hSemaphore = CreateSemaphore(
|
||||
0,
|
||||
initval,
|
||||
MAX_SEMAPHORE_COUNT,
|
||||
0);
|
||||
}
|
||||
|
||||
void JSemaphore::Post() {
|
||||
ReleaseSemaphore(
|
||||
m_hSemaphore,
|
||||
1,
|
||||
0);
|
||||
}
|
||||
|
||||
void JSemaphore::Wait() {
|
||||
WaitForSingleObject(
|
||||
m_hSemaphore,
|
||||
INFINITE);
|
||||
}
|
||||
|
||||
int JSemaphore::GetValue() {
|
||||
|
||||
long int retval = 0;
|
||||
ReleaseSemaphore(
|
||||
m_hSemaphore,
|
||||
0,
|
||||
&retval);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
|
@ -43,6 +43,12 @@ JThread::~JThread()
|
|||
Kill();
|
||||
}
|
||||
|
||||
void JThread::Stop() {
|
||||
runningmutex.Lock();
|
||||
running = false;
|
||||
runningmutex.Unlock();
|
||||
}
|
||||
|
||||
int JThread::Start()
|
||||
{
|
||||
if (!mutexinit)
|
||||
|
@ -63,7 +69,7 @@ int JThread::Start()
|
|||
return ERR_JTHREAD_CANTINITMUTEX;
|
||||
} mutexinit = true;
|
||||
}
|
||||
|
||||
|
||||
runningmutex.Lock();
|
||||
if (running)
|
||||
{
|
||||
|
@ -71,7 +77,7 @@ int JThread::Start()
|
|||
return ERR_JTHREAD_ALREADYRUNNING;
|
||||
}
|
||||
runningmutex.Unlock();
|
||||
|
||||
|
||||
continuemutex.Lock();
|
||||
#ifndef _WIN32_WCE
|
||||
threadhandle = (HANDLE)_beginthreadex(NULL,0,TheThread,this,0,&threadid);
|
||||
|
@ -83,10 +89,10 @@ int JThread::Start()
|
|||
continuemutex.Unlock();
|
||||
return ERR_JTHREAD_CANTSTARTTHREAD;
|
||||
}
|
||||
|
||||
|
||||
/* Wait until 'running' is set */
|
||||
|
||||
runningmutex.Lock();
|
||||
runningmutex.Lock();
|
||||
while (!running)
|
||||
{
|
||||
runningmutex.Unlock();
|
||||
|
@ -94,18 +100,18 @@ int JThread::Start()
|
|||
runningmutex.Lock();
|
||||
}
|
||||
runningmutex.Unlock();
|
||||
|
||||
|
||||
continuemutex.Unlock();
|
||||
|
||||
|
||||
continuemutex2.Lock();
|
||||
continuemutex2.Unlock();
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int JThread::Kill()
|
||||
{
|
||||
runningmutex.Lock();
|
||||
runningmutex.Lock();
|
||||
if (!running)
|
||||
{
|
||||
runningmutex.Unlock();
|
||||
|
@ -121,8 +127,8 @@ int JThread::Kill()
|
|||
bool JThread::IsRunning()
|
||||
{
|
||||
bool r;
|
||||
|
||||
runningmutex.Lock();
|
||||
|
||||
runningmutex.Lock();
|
||||
r = running;
|
||||
runningmutex.Unlock();
|
||||
return r;
|
||||
|
@ -131,7 +137,7 @@ bool JThread::IsRunning()
|
|||
void *JThread::GetReturnValue()
|
||||
{
|
||||
void *val;
|
||||
|
||||
|
||||
runningmutex.Lock();
|
||||
if (running)
|
||||
val = NULL;
|
||||
|
@ -156,23 +162,23 @@ DWORD WINAPI JThread::TheThread(void *param)
|
|||
void *ret;
|
||||
|
||||
jthread = (JThread *)param;
|
||||
|
||||
|
||||
jthread->continuemutex2.Lock();
|
||||
jthread->runningmutex.Lock();
|
||||
jthread->running = true;
|
||||
jthread->runningmutex.Unlock();
|
||||
|
||||
|
||||
jthread->continuemutex.Lock();
|
||||
jthread->continuemutex.Unlock();
|
||||
|
||||
|
||||
ret = jthread->Thread();
|
||||
|
||||
|
||||
jthread->runningmutex.Lock();
|
||||
jthread->running = false;
|
||||
jthread->retval = ret;
|
||||
CloseHandle(jthread->threadhandle);
|
||||
jthread->runningmutex.Unlock();
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void JThread::ThreadStarted()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue