sync thread access to text input buffer

This commit is contained in:
Struma 2021-03-08 06:20:43 -05:00 committed by Roza
parent 10f3d2655d
commit 69a89cf87f
3 changed files with 635 additions and 609 deletions

View file

@ -20,11 +20,13 @@
*/ */
#include "binding-util.h" #include "binding-util.h"
#include "exception.h" #include "util/exception.h"
#include "input.h" #include "input/input.h"
#include "sharedstate.h" #include "sharedstate.h"
#include "src/util/util.h" #include "src/util/util.h"
#include "eventthread.h"
#include <SDL_joystick.h> #include <SDL_joystick.h>
#include <string> #include <string>
@ -323,10 +325,10 @@ RB_METHOD(inputSetMode) {
RB_METHOD(inputGets) { RB_METHOD(inputGets) {
RB_UNUSED_PARAM; RB_UNUSED_PARAM;
shState->eThread().lockText(true);
VALUE ret = rb_utf8_str_new_cstr(shState->input().getText()); VALUE ret = rb_utf8_str_new_cstr(shState->input().getText());
shState->input().clearText(); shState->input().clearText();
shState->eThread().lockText(false);
return ret; return ret;
} }

View file

@ -120,7 +120,14 @@ EventThread::EventThread()
fullscreen(false), fullscreen(false),
showCursor(true), showCursor(true),
joystickConnected(false) joystickConnected(false)
{} {
textInputLock = SDL_CreateMutex();
}
EventThread::~EventThread()
{
SDL_DestroyMutex(textInputLock);
}
void EventThread::process(RGSSThreadData &rtData) void EventThread::process(RGSSThreadData &rtData)
{ {
@ -266,8 +273,11 @@ void EventThread::process(RGSSThreadData &rtData)
break; break;
case SDL_TEXTINPUT : case SDL_TEXTINPUT :
if (textInputBuffer.size() < 512) lockText(true);
if (textInputBuffer.size() < 512) {
textInputBuffer += event.text.text; textInputBuffer += event.text.text;
}
lockText(false);
break; break;
case SDL_QUIT : case SDL_QUIT :
@ -459,12 +469,16 @@ void EventThread::process(RGSSThreadData &rtData)
if (event.user.code) if (event.user.code)
{ {
SDL_StartTextInput(); SDL_StartTextInput();
lockText(true);
textInputBuffer.clear(); textInputBuffer.clear();
lockText(false);
} }
else else
{ {
SDL_StopTextInput(); SDL_StopTextInput();
lockText(true);
textInputBuffer.clear(); textInputBuffer.clear();
lockText(false);
} }
break; break;
@ -766,6 +780,11 @@ void EventThread::notifyGameScreenChange(const SDL_Rect &screen)
SDL_PushEvent(&event); SDL_PushEvent(&event);
} }
void EventThread::lockText(bool lock)
{
lock ? SDL_LockMutex(textInputLock) : SDL_UnlockMutex(textInputLock);
}
void SyncPoint::haltThreads() void SyncPoint::haltThreads()
{ {
if (mainSync.locked) if (mainSync.locked)

View file

@ -77,10 +77,13 @@ public:
static TouchState touchState; static TouchState touchState;
std::string textInputBuffer; std::string textInputBuffer;
void lockText(bool lock);
static bool allocUserEvents(); static bool allocUserEvents();
EventThread(); EventThread();
~EventThread();
void process(RGSSThreadData &rtData); void process(RGSSThreadData &rtData);
void cleanup(); void cleanup();
@ -129,6 +132,8 @@ private:
AtomicFlag msgBoxDone; AtomicFlag msgBoxDone;
SDL_mutex *textInputLock;
struct struct
{ {
AtomicFlag sendUpdates; AtomicFlag sendUpdates;