Modernize Thread
- Based on C++11's `thread` and `thread_local` - No more need to allocate-deallocate or check for null - No pointer anymore, just a member variable - Platform-specific implementations no longer needed (except for the few cases of non-portable functions) - Simpler for `NO_THREADS` - Thread ids are now the same across platforms (main is 1; others follow)
This commit is contained in:
parent
6ddfc8e718
commit
99fe462452
87 changed files with 385 additions and 1056 deletions
|
|
@ -83,7 +83,7 @@ public:
|
|||
v = (jvalue *)alloca(sizeof(jvalue) * p_argcount);
|
||||
}
|
||||
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
|
||||
int res = env->PushLocalFrame(16);
|
||||
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ Error AudioDriverAndroid::init() {
|
|||
|
||||
// __android_log_print(ANDROID_LOG_VERBOSE, "SDL", "SDL audio: opening device");
|
||||
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
int mix_rate = GLOBAL_GET("audio/mix_rate");
|
||||
|
||||
int latency = GLOBAL_GET("audio/output_latency");
|
||||
|
|
@ -98,7 +98,7 @@ void AudioDriverAndroid::start() {
|
|||
}
|
||||
|
||||
void AudioDriverAndroid::setup(jobject p_io) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
io = p_io;
|
||||
|
||||
jclass c = env->GetObjectClass(io);
|
||||
|
|
@ -162,7 +162,7 @@ void AudioDriverAndroid::unlock() {
|
|||
}
|
||||
|
||||
void AudioDriverAndroid::finish() {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
env->CallVoidMethod(io, _quit);
|
||||
|
||||
if (audioBuffer) {
|
||||
|
|
@ -175,7 +175,7 @@ void AudioDriverAndroid::finish() {
|
|||
}
|
||||
|
||||
void AudioDriverAndroid::set_pause(bool p_pause) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
env->CallVoidMethod(io, _pause, p_pause);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ DirAccess *DirAccessJAndroid::create_fs() {
|
|||
|
||||
Error DirAccessJAndroid::list_dir_begin() {
|
||||
list_dir_end();
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
|
||||
jstring js = env->NewStringUTF(current_dir.utf8().get_data());
|
||||
int res = env->CallIntMethod(io, _dir_open, js);
|
||||
|
|
@ -62,7 +62,7 @@ Error DirAccessJAndroid::list_dir_begin() {
|
|||
String DirAccessJAndroid::get_next() {
|
||||
ERR_FAIL_COND_V(id == 0, "");
|
||||
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
jstring str = (jstring)env->CallObjectMethod(io, _dir_next, id);
|
||||
if (!str)
|
||||
return "";
|
||||
|
|
@ -73,7 +73,7 @@ String DirAccessJAndroid::get_next() {
|
|||
}
|
||||
|
||||
bool DirAccessJAndroid::current_is_dir() const {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
|
||||
return env->CallBooleanMethod(io, _dir_is_dir, id);
|
||||
}
|
||||
|
|
@ -86,7 +86,7 @@ void DirAccessJAndroid::list_dir_end() {
|
|||
if (id == 0)
|
||||
return;
|
||||
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
env->CallVoidMethod(io, _dir_close, id);
|
||||
id = 0;
|
||||
}
|
||||
|
|
@ -100,7 +100,7 @@ String DirAccessJAndroid::get_drive(int p_drive) {
|
|||
}
|
||||
|
||||
Error DirAccessJAndroid::change_dir(String p_dir) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
|
||||
if (p_dir == "" || p_dir == "." || (p_dir == ".." && current_dir == ""))
|
||||
return OK;
|
||||
|
|
@ -154,7 +154,7 @@ bool DirAccessJAndroid::file_exists(String p_file) {
|
|||
}
|
||||
|
||||
bool DirAccessJAndroid::dir_exists(String p_dir) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
|
||||
String sd;
|
||||
|
||||
|
|
@ -207,7 +207,7 @@ size_t DirAccessJAndroid::get_space_left() {
|
|||
}
|
||||
|
||||
void DirAccessJAndroid::setup(jobject p_io) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
io = p_io;
|
||||
|
||||
jclass c = env->GetObjectClass(io);
|
||||
|
|
|
|||
|
|
@ -269,7 +269,7 @@ class EditorExportPlatformAndroid : public EditorExportPlatform {
|
|||
Vector<Device> devices;
|
||||
volatile bool devices_changed;
|
||||
Mutex device_lock;
|
||||
Thread *check_for_changes_thread;
|
||||
Thread check_for_changes_thread;
|
||||
volatile bool quit_request;
|
||||
|
||||
static void _check_for_changes_poll_thread(void *ud) {
|
||||
|
|
@ -2848,13 +2848,12 @@ public:
|
|||
devices_changed = true;
|
||||
plugins_changed = true;
|
||||
quit_request = false;
|
||||
check_for_changes_thread = Thread::create(_check_for_changes_poll_thread, this);
|
||||
check_for_changes_thread.start(_check_for_changes_poll_thread, this);
|
||||
}
|
||||
|
||||
~EditorExportPlatformAndroid() {
|
||||
quit_request = true;
|
||||
Thread::wait_to_finish(check_for_changes_thread);
|
||||
memdelete(check_for_changes_thread);
|
||||
check_for_changes_thread.wait_to_finish();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ bool JavaClass::_call_method(JavaObject *p_instance, const StringName &p_method,
|
|||
if (!M)
|
||||
return false;
|
||||
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
|
||||
MethodInfo *method = nullptr;
|
||||
for (List<MethodInfo>::Element *E = M->get().front(); E; E = E->next()) {
|
||||
|
|
@ -964,7 +964,7 @@ Ref<JavaClass> JavaClassWrapper::wrap(const String &p_class) {
|
|||
if (class_cache.has(p_class))
|
||||
return class_cache[p_class];
|
||||
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
|
||||
jclass bclass = env->FindClass(p_class.utf8().get_data());
|
||||
ERR_FAIL_COND_V(!bclass, Ref<JavaClass>());
|
||||
|
|
@ -1148,7 +1148,7 @@ JavaClassWrapper *JavaClassWrapper::singleton = nullptr;
|
|||
JavaClassWrapper::JavaClassWrapper(jobject p_activity) {
|
||||
singleton = this;
|
||||
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
|
||||
jclass activityClass = env->FindClass("android/app/Activity");
|
||||
jmethodID getClassLoader = env->GetMethodID(activityClass, "getClassLoader", "()Ljava/lang/ClassLoader;");
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@
|
|||
// JNIEnv is only valid within the thread it belongs to, in a multi threading environment
|
||||
// we can't cache it.
|
||||
// For GodotIO we call all access methods from our thread and we thus get a valid JNIEnv
|
||||
// from ThreadAndroid.
|
||||
// from get_jni_env().
|
||||
|
||||
GodotIOJavaWrapper::GodotIOJavaWrapper(JNIEnv *p_env, jobject p_godot_io_instance) {
|
||||
godot_io_instance = p_env->NewGlobalRef(p_godot_io_instance);
|
||||
|
|
@ -72,7 +72,7 @@ jobject GodotIOJavaWrapper::get_instance() {
|
|||
|
||||
Error GodotIOJavaWrapper::open_uri(const String &p_uri) {
|
||||
if (_open_URI) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
jstring jStr = env->NewStringUTF(p_uri.utf8().get_data());
|
||||
return env->CallIntMethod(godot_io_instance, _open_URI, jStr) ? ERR_CANT_OPEN : OK;
|
||||
} else {
|
||||
|
|
@ -82,7 +82,7 @@ Error GodotIOJavaWrapper::open_uri(const String &p_uri) {
|
|||
|
||||
String GodotIOJavaWrapper::get_user_data_dir() {
|
||||
if (_get_data_dir) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
jstring s = (jstring)env->CallObjectMethod(godot_io_instance, _get_data_dir);
|
||||
return jstring_to_string(s, env);
|
||||
} else {
|
||||
|
|
@ -92,7 +92,7 @@ String GodotIOJavaWrapper::get_user_data_dir() {
|
|||
|
||||
String GodotIOJavaWrapper::get_locale() {
|
||||
if (_get_locale) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
jstring s = (jstring)env->CallObjectMethod(godot_io_instance, _get_locale);
|
||||
return jstring_to_string(s, env);
|
||||
} else {
|
||||
|
|
@ -102,7 +102,7 @@ String GodotIOJavaWrapper::get_locale() {
|
|||
|
||||
String GodotIOJavaWrapper::get_model() {
|
||||
if (_get_model) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
jstring s = (jstring)env->CallObjectMethod(godot_io_instance, _get_model);
|
||||
return jstring_to_string(s, env);
|
||||
} else {
|
||||
|
|
@ -112,7 +112,7 @@ String GodotIOJavaWrapper::get_model() {
|
|||
|
||||
int GodotIOJavaWrapper::get_screen_dpi() {
|
||||
if (_get_screen_DPI) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
return env->CallIntMethod(godot_io_instance, _get_screen_DPI);
|
||||
} else {
|
||||
return 160;
|
||||
|
|
@ -121,7 +121,7 @@ int GodotIOJavaWrapper::get_screen_dpi() {
|
|||
|
||||
void GodotIOJavaWrapper::screen_get_usable_rect(int (&p_rect_xywh)[4]) {
|
||||
if (_screen_get_usable_rect) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
jintArray returnArray = (jintArray)env->CallObjectMethod(godot_io_instance, _screen_get_usable_rect);
|
||||
ERR_FAIL_COND(env->GetArrayLength(returnArray) != 4);
|
||||
jint *arrayBody = env->GetIntArrayElements(returnArray, JNI_FALSE);
|
||||
|
|
@ -134,7 +134,7 @@ void GodotIOJavaWrapper::screen_get_usable_rect(int (&p_rect_xywh)[4]) {
|
|||
|
||||
String GodotIOJavaWrapper::get_unique_id() {
|
||||
if (_get_unique_id) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
jstring s = (jstring)env->CallObjectMethod(godot_io_instance, _get_unique_id);
|
||||
return jstring_to_string(s, env);
|
||||
} else {
|
||||
|
|
@ -148,7 +148,7 @@ bool GodotIOJavaWrapper::has_vk() {
|
|||
|
||||
void GodotIOJavaWrapper::show_vk(const String &p_existing, bool p_multiline, int p_max_input_length, int p_cursor_start, int p_cursor_end) {
|
||||
if (_show_keyboard) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
jstring jStr = env->NewStringUTF(p_existing.utf8().get_data());
|
||||
env->CallVoidMethod(godot_io_instance, _show_keyboard, jStr, p_multiline, p_max_input_length, p_cursor_start, p_cursor_end);
|
||||
}
|
||||
|
|
@ -156,21 +156,21 @@ void GodotIOJavaWrapper::show_vk(const String &p_existing, bool p_multiline, int
|
|||
|
||||
void GodotIOJavaWrapper::hide_vk() {
|
||||
if (_hide_keyboard) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
env->CallVoidMethod(godot_io_instance, _hide_keyboard);
|
||||
}
|
||||
}
|
||||
|
||||
void GodotIOJavaWrapper::set_screen_orientation(int p_orient) {
|
||||
if (_set_screen_orientation) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
env->CallVoidMethod(godot_io_instance, _set_screen_orientation, p_orient);
|
||||
}
|
||||
}
|
||||
|
||||
int GodotIOJavaWrapper::get_screen_orientation() {
|
||||
if (_get_screen_orientation) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
return env->CallIntMethod(godot_io_instance, _get_screen_orientation);
|
||||
} else {
|
||||
return 0;
|
||||
|
|
@ -179,7 +179,7 @@ int GodotIOJavaWrapper::get_screen_orientation() {
|
|||
|
||||
String GodotIOJavaWrapper::get_system_dir(int p_dir) {
|
||||
if (_get_system_dir) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
jstring s = (jstring)env->CallObjectMethod(godot_io_instance, _get_system_dir, p_dir);
|
||||
return jstring_to_string(s, env);
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *en
|
|||
godot_java = new GodotJavaWrapper(env, activity, godot_instance);
|
||||
godot_io_java = new GodotIOJavaWrapper(env, godot_java->get_member_object("io", "Lorg/godotengine/godot/GodotIO;", env));
|
||||
|
||||
ThreadAndroid::make_default(jvm);
|
||||
init_thread_jandroid(jvm, env);
|
||||
|
||||
jobject amgr = env->NewGlobalRef(p_asset_manager);
|
||||
|
||||
|
|
@ -119,7 +119,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ondestroy(JNIEnv *env
|
|||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_setup(JNIEnv *env, jclass clazz, jobjectArray p_cmdline) {
|
||||
ThreadAndroid::setup_thread();
|
||||
setup_android_thread();
|
||||
|
||||
const char **cmdline = nullptr;
|
||||
jstring *j_cmdline = nullptr;
|
||||
|
|
@ -206,7 +206,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv *env, jcl
|
|||
return;
|
||||
|
||||
if (step == 0) {
|
||||
// Since Godot is initialized on the UI thread, _main_thread_id was set to that thread's id,
|
||||
// Since Godot is initialized on the UI thread, main_thread_id was set to that thread's id,
|
||||
// but for Godot purposes, the main thread is the one running the game loop
|
||||
Main::setup2(Thread::get_caller_id());
|
||||
++step;
|
||||
|
|
@ -382,7 +382,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusout(JNIEnv *env,
|
|||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_audio(JNIEnv *env, jclass clazz) {
|
||||
ThreadAndroid::setup_thread();
|
||||
setup_android_thread();
|
||||
AudioDriverAndroid::thread_func(env);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
#include "thread_jandroid.h"
|
||||
|
||||
GodotJavaViewWrapper::GodotJavaViewWrapper(jobject godot_view) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
|
||||
_godot_view = env->NewGlobalRef(godot_view);
|
||||
|
||||
|
|
@ -47,20 +47,20 @@ GodotJavaViewWrapper::GodotJavaViewWrapper(jobject godot_view) {
|
|||
|
||||
void GodotJavaViewWrapper::request_pointer_capture() {
|
||||
if (_request_pointer_capture != 0) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
env->CallVoidMethod(_godot_view, _request_pointer_capture);
|
||||
}
|
||||
}
|
||||
|
||||
void GodotJavaViewWrapper::release_pointer_capture() {
|
||||
if (_request_pointer_capture != 0) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
env->CallVoidMethod(_godot_view, _release_pointer_capture);
|
||||
}
|
||||
}
|
||||
|
||||
GodotJavaViewWrapper::~GodotJavaViewWrapper() {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
env->DeleteGlobalRef(_godot_view);
|
||||
env->DeleteGlobalRef(_cls);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
// JNIEnv is only valid within the thread it belongs to, in a multi threading environment
|
||||
// we can't cache it.
|
||||
// For Godot we call most access methods from our thread and we thus get a valid JNIEnv
|
||||
// from ThreadAndroid. For one or two we expect to pass the environment
|
||||
// from get_jni_env(). For one or two we expect to pass the environment
|
||||
|
||||
// TODO we could probably create a base class for this...
|
||||
|
||||
|
|
@ -91,7 +91,7 @@ jobject GodotJavaWrapper::get_activity() {
|
|||
jobject GodotJavaWrapper::get_member_object(const char *p_name, const char *p_class, JNIEnv *p_env) {
|
||||
if (godot_class) {
|
||||
if (p_env == nullptr)
|
||||
p_env = ThreadAndroid::get_env();
|
||||
p_env = get_jni_env();
|
||||
|
||||
jfieldID fid = p_env->GetStaticFieldID(godot_class, p_name, p_class);
|
||||
return p_env->GetStaticObjectField(godot_class, fid);
|
||||
|
|
@ -102,7 +102,7 @@ jobject GodotJavaWrapper::get_member_object(const char *p_name, const char *p_cl
|
|||
|
||||
jobject GodotJavaWrapper::get_class_loader() {
|
||||
if (_get_class_loader) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
return env->CallObjectMethod(activity, _get_class_loader);
|
||||
} else {
|
||||
return nullptr;
|
||||
|
|
@ -113,7 +113,7 @@ GodotJavaViewWrapper *GodotJavaWrapper::get_godot_view() {
|
|||
if (_godot_view != nullptr) {
|
||||
return _godot_view;
|
||||
}
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
jmethodID godot_view_getter = env->GetMethodID(godot_class, "getRenderView", "()Lorg/godotengine/godot/GodotRenderView;");
|
||||
_godot_view = new GodotJavaViewWrapper(env->CallObjectMethod(godot_instance, godot_view_getter));
|
||||
return _godot_view;
|
||||
|
|
@ -122,7 +122,7 @@ GodotJavaViewWrapper *GodotJavaWrapper::get_godot_view() {
|
|||
void GodotJavaWrapper::on_video_init(JNIEnv *p_env) {
|
||||
if (_on_video_init)
|
||||
if (p_env == nullptr)
|
||||
p_env = ThreadAndroid::get_env();
|
||||
p_env = get_jni_env();
|
||||
|
||||
p_env->CallVoidMethod(godot_instance, _on_video_init);
|
||||
}
|
||||
|
|
@ -130,7 +130,7 @@ void GodotJavaWrapper::on_video_init(JNIEnv *p_env) {
|
|||
void GodotJavaWrapper::on_godot_main_loop_started(JNIEnv *p_env) {
|
||||
if (_on_godot_main_loop_started) {
|
||||
if (p_env == nullptr) {
|
||||
p_env = ThreadAndroid::get_env();
|
||||
p_env = get_jni_env();
|
||||
}
|
||||
}
|
||||
p_env->CallVoidMethod(godot_instance, _on_godot_main_loop_started);
|
||||
|
|
@ -139,7 +139,7 @@ void GodotJavaWrapper::on_godot_main_loop_started(JNIEnv *p_env) {
|
|||
void GodotJavaWrapper::restart(JNIEnv *p_env) {
|
||||
if (_restart)
|
||||
if (p_env == nullptr)
|
||||
p_env = ThreadAndroid::get_env();
|
||||
p_env = get_jni_env();
|
||||
|
||||
p_env->CallVoidMethod(godot_instance, _restart);
|
||||
}
|
||||
|
|
@ -147,21 +147,21 @@ void GodotJavaWrapper::restart(JNIEnv *p_env) {
|
|||
void GodotJavaWrapper::force_quit(JNIEnv *p_env) {
|
||||
if (_finish)
|
||||
if (p_env == nullptr)
|
||||
p_env = ThreadAndroid::get_env();
|
||||
p_env = get_jni_env();
|
||||
|
||||
p_env->CallVoidMethod(godot_instance, _finish);
|
||||
}
|
||||
|
||||
void GodotJavaWrapper::set_keep_screen_on(bool p_enabled) {
|
||||
if (_set_keep_screen_on) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
env->CallVoidMethod(godot_instance, _set_keep_screen_on, p_enabled);
|
||||
}
|
||||
}
|
||||
|
||||
void GodotJavaWrapper::alert(const String &p_message, const String &p_title) {
|
||||
if (_alert) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
jstring jStrMessage = env->NewStringUTF(p_message.utf8().get_data());
|
||||
jstring jStrTitle = env->NewStringUTF(p_title.utf8().get_data());
|
||||
env->CallVoidMethod(godot_instance, _alert, jStrMessage, jStrTitle);
|
||||
|
|
@ -169,7 +169,7 @@ void GodotJavaWrapper::alert(const String &p_message, const String &p_title) {
|
|||
}
|
||||
|
||||
int GodotJavaWrapper::get_gles_version_code() {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
if (_get_GLES_version_code) {
|
||||
return env->CallIntMethod(godot_instance, _get_GLES_version_code);
|
||||
}
|
||||
|
|
@ -183,7 +183,7 @@ bool GodotJavaWrapper::has_get_clipboard() {
|
|||
|
||||
String GodotJavaWrapper::get_clipboard() {
|
||||
if (_get_clipboard) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
jstring s = (jstring)env->CallObjectMethod(godot_instance, _get_clipboard);
|
||||
return jstring_to_string(s, env);
|
||||
} else {
|
||||
|
|
@ -193,7 +193,7 @@ String GodotJavaWrapper::get_clipboard() {
|
|||
|
||||
String GodotJavaWrapper::get_input_fallback_mapping() {
|
||||
if (_get_input_fallback_mapping) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
jstring fallback_mapping = (jstring)env->CallObjectMethod(godot_instance, _get_input_fallback_mapping);
|
||||
return jstring_to_string(fallback_mapping, env);
|
||||
} else {
|
||||
|
|
@ -207,7 +207,7 @@ bool GodotJavaWrapper::has_set_clipboard() {
|
|||
|
||||
void GodotJavaWrapper::set_clipboard(const String &p_text) {
|
||||
if (_set_clipboard) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
jstring jStr = env->NewStringUTF(p_text.utf8().get_data());
|
||||
env->CallVoidMethod(godot_instance, _set_clipboard, jStr);
|
||||
}
|
||||
|
|
@ -215,7 +215,7 @@ void GodotJavaWrapper::set_clipboard(const String &p_text) {
|
|||
|
||||
bool GodotJavaWrapper::request_permission(const String &p_name) {
|
||||
if (_request_permission) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
jstring jStrName = env->NewStringUTF(p_name.utf8().get_data());
|
||||
return env->CallBooleanMethod(godot_instance, _request_permission, jStrName);
|
||||
} else {
|
||||
|
|
@ -225,7 +225,7 @@ bool GodotJavaWrapper::request_permission(const String &p_name) {
|
|||
|
||||
bool GodotJavaWrapper::request_permissions() {
|
||||
if (_request_permissions) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
return env->CallBooleanMethod(godot_instance, _request_permissions);
|
||||
} else {
|
||||
return false;
|
||||
|
|
@ -235,7 +235,7 @@ bool GodotJavaWrapper::request_permissions() {
|
|||
Vector<String> GodotJavaWrapper::get_granted_permissions() const {
|
||||
Vector<String> permissions_list;
|
||||
if (_get_granted_permissions) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
jobject permissions_object = env->CallObjectMethod(godot_instance, _get_granted_permissions);
|
||||
jobjectArray *arr = reinterpret_cast<jobjectArray *>(&permissions_object);
|
||||
|
||||
|
|
@ -253,14 +253,14 @@ Vector<String> GodotJavaWrapper::get_granted_permissions() const {
|
|||
|
||||
void GodotJavaWrapper::init_input_devices() {
|
||||
if (_init_input_devices) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
env->CallVoidMethod(godot_instance, _init_input_devices);
|
||||
}
|
||||
}
|
||||
|
||||
jobject GodotJavaWrapper::get_surface() {
|
||||
if (_get_surface) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
return env->CallObjectMethod(godot_instance, _get_surface);
|
||||
} else {
|
||||
return nullptr;
|
||||
|
|
@ -269,7 +269,7 @@ jobject GodotJavaWrapper::get_surface() {
|
|||
|
||||
bool GodotJavaWrapper::is_activity_resumed() {
|
||||
if (_is_activity_resumed) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
return env->CallBooleanMethod(godot_instance, _is_activity_resumed);
|
||||
} else {
|
||||
return false;
|
||||
|
|
@ -278,7 +278,7 @@ bool GodotJavaWrapper::is_activity_resumed() {
|
|||
|
||||
void GodotJavaWrapper::vibrate(int p_duration_ms) {
|
||||
if (_vibrate) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
env->CallVoidMethod(godot_instance, _vibrate, p_duration_ms);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ jmethodID NetSocketAndroid::_multicast_lock_acquire = 0;
|
|||
jmethodID NetSocketAndroid::_multicast_lock_release = 0;
|
||||
|
||||
void NetSocketAndroid::setup(jobject p_net_utils) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
|
||||
net_utils = env->NewGlobalRef(p_net_utils);
|
||||
|
||||
|
|
@ -51,14 +51,14 @@ void NetSocketAndroid::setup(jobject p_net_utils) {
|
|||
|
||||
void NetSocketAndroid::multicast_lock_acquire() {
|
||||
if (_multicast_lock_acquire) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
env->CallVoidMethod(net_utils, _multicast_lock_acquire);
|
||||
}
|
||||
}
|
||||
|
||||
void NetSocketAndroid::multicast_lock_release() {
|
||||
if (_multicast_lock_release) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
JNIEnv *env = get_jni_env();
|
||||
env->CallVoidMethod(net_utils, _multicast_lock_release);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,14 +37,14 @@
|
|||
/**
|
||||
* Converts JNI jstring to Godot String.
|
||||
* @param source Source JNI string. If null an empty string is returned.
|
||||
* @param env JNI environment instance. If null obtained by ThreadAndroid::get_env().
|
||||
* @param env JNI environment instance. If null obtained by get_jni_env().
|
||||
* @return Godot string instance.
|
||||
*/
|
||||
static inline String jstring_to_string(jstring source, JNIEnv *env = nullptr) {
|
||||
String result;
|
||||
if (source) {
|
||||
if (!env) {
|
||||
env = ThreadAndroid::get_env();
|
||||
env = get_jni_env();
|
||||
}
|
||||
const char *const source_utf8 = env->GetStringUTFChars(source, nullptr);
|
||||
if (source_utf8) {
|
||||
|
|
|
|||
|
|
@ -30,116 +30,29 @@
|
|||
|
||||
#include "thread_jandroid.h"
|
||||
|
||||
#include "core/object/script_language.h"
|
||||
#include "core/os/memory.h"
|
||||
#include "core/templates/safe_refcount.h"
|
||||
#include "core/os/thread.h"
|
||||
|
||||
static void _thread_id_key_destr_callback(void *p_value) {
|
||||
memdelete(static_cast<Thread::ID *>(p_value));
|
||||
}
|
||||
static JavaVM *java_vm = nullptr;
|
||||
static thread_local JNIEnv *env = nullptr;
|
||||
|
||||
static pthread_key_t _create_thread_id_key() {
|
||||
pthread_key_t key;
|
||||
pthread_key_create(&key, &_thread_id_key_destr_callback);
|
||||
return key;
|
||||
}
|
||||
|
||||
pthread_key_t ThreadAndroid::thread_id_key = _create_thread_id_key();
|
||||
Thread::ID ThreadAndroid::next_thread_id = 0;
|
||||
|
||||
Thread::ID ThreadAndroid::get_id() const {
|
||||
return id;
|
||||
}
|
||||
|
||||
Thread *ThreadAndroid::create_thread_jandroid() {
|
||||
return memnew(ThreadAndroid);
|
||||
}
|
||||
|
||||
void *ThreadAndroid::thread_callback(void *userdata) {
|
||||
ThreadAndroid *t = reinterpret_cast<ThreadAndroid *>(userdata);
|
||||
setup_thread();
|
||||
ScriptServer::thread_enter(); //scripts may need to attach a stack
|
||||
t->id = atomic_increment(&next_thread_id);
|
||||
pthread_setspecific(thread_id_key, (void *)memnew(ID(t->id)));
|
||||
t->callback(t->user);
|
||||
ScriptServer::thread_exit();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Thread *ThreadAndroid::create_func_jandroid(ThreadCreateCallback p_callback, void *p_user, const Settings &) {
|
||||
ThreadAndroid *tr = memnew(ThreadAndroid);
|
||||
tr->callback = p_callback;
|
||||
tr->user = p_user;
|
||||
pthread_attr_init(&tr->pthread_attr);
|
||||
pthread_attr_setdetachstate(&tr->pthread_attr, PTHREAD_CREATE_JOINABLE);
|
||||
|
||||
pthread_create(&tr->pthread, &tr->pthread_attr, thread_callback, tr);
|
||||
|
||||
return tr;
|
||||
}
|
||||
|
||||
Thread::ID ThreadAndroid::get_thread_id_func_jandroid() {
|
||||
void *value = pthread_getspecific(thread_id_key);
|
||||
|
||||
if (value)
|
||||
return *static_cast<ID *>(value);
|
||||
|
||||
ID new_id = atomic_increment(&next_thread_id);
|
||||
pthread_setspecific(thread_id_key, (void *)memnew(ID(new_id)));
|
||||
return new_id;
|
||||
}
|
||||
|
||||
void ThreadAndroid::wait_to_finish_func_jandroid(Thread *p_thread) {
|
||||
ThreadAndroid *tp = static_cast<ThreadAndroid *>(p_thread);
|
||||
ERR_FAIL_COND(!tp);
|
||||
ERR_FAIL_COND(tp->pthread == 0);
|
||||
|
||||
pthread_join(tp->pthread, nullptr);
|
||||
tp->pthread = 0;
|
||||
}
|
||||
|
||||
void ThreadAndroid::_thread_destroyed(void *value) {
|
||||
/* The thread is being destroyed, detach it from the Java VM and set the mThreadKey value to NULL as required */
|
||||
JNIEnv *env = (JNIEnv *)value;
|
||||
if (env != nullptr) {
|
||||
java_vm->DetachCurrentThread();
|
||||
pthread_setspecific(jvm_key, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
pthread_key_t ThreadAndroid::jvm_key;
|
||||
JavaVM *ThreadAndroid::java_vm = nullptr;
|
||||
|
||||
void ThreadAndroid::setup_thread() {
|
||||
if (pthread_getspecific(jvm_key))
|
||||
return; //already setup
|
||||
JNIEnv *env;
|
||||
static void init_thread() {
|
||||
java_vm->AttachCurrentThread(&env, nullptr);
|
||||
pthread_setspecific(jvm_key, (void *)env);
|
||||
}
|
||||
|
||||
void ThreadAndroid::make_default(JavaVM *p_java_vm) {
|
||||
java_vm = p_java_vm;
|
||||
create_func = create_func_jandroid;
|
||||
get_thread_id_func = get_thread_id_func_jandroid;
|
||||
wait_to_finish_func = wait_to_finish_func_jandroid;
|
||||
pthread_key_create(&jvm_key, _thread_destroyed);
|
||||
setup_thread();
|
||||
static void term_thread() {
|
||||
java_vm->DetachCurrentThread();
|
||||
}
|
||||
|
||||
JNIEnv *ThreadAndroid::get_env() {
|
||||
if (!pthread_getspecific(jvm_key)) {
|
||||
setup_thread();
|
||||
}
|
||||
void init_thread_jandroid(JavaVM *p_jvm, JNIEnv *p_env) {
|
||||
java_vm = p_jvm;
|
||||
env = p_env;
|
||||
Thread::_set_platform_funcs(nullptr, nullptr, &init_thread, &term_thread);
|
||||
}
|
||||
|
||||
JNIEnv *env = nullptr;
|
||||
java_vm->AttachCurrentThread(&env, nullptr);
|
||||
void setup_android_thread() {
|
||||
init_thread();
|
||||
}
|
||||
|
||||
JNIEnv *get_jni_env() {
|
||||
return env;
|
||||
}
|
||||
|
||||
ThreadAndroid::ThreadAndroid() {
|
||||
pthread = 0;
|
||||
}
|
||||
|
||||
ThreadAndroid::~ThreadAndroid() {
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,46 +28,14 @@
|
|||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#ifndef THREAD_POSIX_H
|
||||
#define THREAD_POSIX_H
|
||||
#ifndef THREAD_JANDROID_H
|
||||
#define THREAD_JANDROID_H
|
||||
|
||||
#include "core/os/thread.h"
|
||||
#include <jni.h>
|
||||
#include <pthread.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
class ThreadAndroid : public Thread {
|
||||
static pthread_key_t thread_id_key;
|
||||
static ID next_thread_id;
|
||||
void init_thread_jandroid(JavaVM *p_jvm, JNIEnv *p_env);
|
||||
|
||||
pthread_t pthread;
|
||||
pthread_attr_t pthread_attr;
|
||||
ThreadCreateCallback callback;
|
||||
void *user;
|
||||
ID id;
|
||||
|
||||
static Thread *create_thread_jandroid();
|
||||
|
||||
static void *thread_callback(void *userdata);
|
||||
|
||||
static Thread *create_func_jandroid(ThreadCreateCallback p_callback, void *, const Settings &);
|
||||
static ID get_thread_id_func_jandroid();
|
||||
static void wait_to_finish_func_jandroid(Thread *p_thread);
|
||||
|
||||
static void _thread_destroyed(void *value);
|
||||
ThreadAndroid();
|
||||
|
||||
static pthread_key_t jvm_key;
|
||||
static JavaVM *java_vm;
|
||||
|
||||
public:
|
||||
virtual ID get_id() const;
|
||||
|
||||
static void make_default(JavaVM *p_java_vm);
|
||||
static void setup_thread();
|
||||
static JNIEnv *get_env();
|
||||
|
||||
~ThreadAndroid();
|
||||
};
|
||||
void setup_android_thread();
|
||||
JNIEnv *get_jni_env();
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ class EditorExportPlatformIOS : public EditorExportPlatform {
|
|||
|
||||
// Plugins
|
||||
volatile bool plugins_changed;
|
||||
Thread *check_for_changes_thread;
|
||||
Thread check_for_changes_thread;
|
||||
volatile bool quit_request;
|
||||
Mutex plugins_lock;
|
||||
Vector<PluginConfigIOS> plugins;
|
||||
|
|
@ -1940,13 +1940,12 @@ EditorExportPlatformIOS::EditorExportPlatformIOS() {
|
|||
plugins_changed = true;
|
||||
quit_request = false;
|
||||
|
||||
check_for_changes_thread = Thread::create(_check_for_changes_poll_thread, this);
|
||||
check_for_changes_thread.start(_check_for_changes_poll_thread, this);
|
||||
}
|
||||
|
||||
EditorExportPlatformIOS::~EditorExportPlatformIOS() {
|
||||
quit_request = true;
|
||||
Thread::wait_to_finish(check_for_changes_thread);
|
||||
memdelete(check_for_changes_thread);
|
||||
check_for_changes_thread.wait_to_finish();
|
||||
}
|
||||
|
||||
void register_iphone_exporter() {
|
||||
|
|
|
|||
|
|
@ -267,7 +267,7 @@ int AudioDriverJavaScript::WorkletNode::create(int p_buffer_size, int p_channels
|
|||
|
||||
void AudioDriverJavaScript::WorkletNode::start(float *p_out_buf, int p_out_buf_size, float *p_in_buf, int p_in_buf_size) {
|
||||
godot_audio_worklet_start(p_in_buf, p_in_buf_size, p_out_buf, p_out_buf_size, state);
|
||||
thread = Thread::create(_audio_thread_func, this);
|
||||
thread.start(_audio_thread_func, this);
|
||||
}
|
||||
|
||||
void AudioDriverJavaScript::WorkletNode::lock() {
|
||||
|
|
@ -280,8 +280,6 @@ void AudioDriverJavaScript::WorkletNode::unlock() {
|
|||
|
||||
void AudioDriverJavaScript::WorkletNode::finish() {
|
||||
quit = true; // Ask thread to quit.
|
||||
Thread::wait_to_finish(thread);
|
||||
memdelete(thread);
|
||||
thread = nullptr;
|
||||
thread.wait_to_finish();
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ public:
|
|||
STATE_MAX,
|
||||
};
|
||||
Mutex mutex;
|
||||
Thread *thread = nullptr;
|
||||
Thread thread;
|
||||
bool quit = false;
|
||||
int32_t state[STATE_MAX] = { 0 };
|
||||
|
||||
|
|
|
|||
|
|
@ -213,7 +213,7 @@ class EditorExportPlatformJavaScript : public EditorExportPlatform {
|
|||
Ref<EditorHTTPServer> server;
|
||||
bool server_quit = false;
|
||||
Mutex server_lock;
|
||||
Thread *server_thread = nullptr;
|
||||
Thread server_thread;
|
||||
|
||||
enum ExportMode {
|
||||
EXPORT_MODE_NORMAL = 0,
|
||||
|
|
@ -681,7 +681,7 @@ void EditorExportPlatformJavaScript::_server_thread_poll(void *data) {
|
|||
|
||||
EditorExportPlatformJavaScript::EditorExportPlatformJavaScript() {
|
||||
server.instance();
|
||||
server_thread = Thread::create(_server_thread_poll, this);
|
||||
server_thread.start(_server_thread_poll, this);
|
||||
|
||||
Ref<Image> img = memnew(Image(_javascript_logo));
|
||||
logo.instance();
|
||||
|
|
@ -702,8 +702,7 @@ EditorExportPlatformJavaScript::EditorExportPlatformJavaScript() {
|
|||
EditorExportPlatformJavaScript::~EditorExportPlatformJavaScript() {
|
||||
server->stop();
|
||||
server_quit = true;
|
||||
Thread::wait_to_finish(server_thread);
|
||||
memdelete(server_thread);
|
||||
server_thread.wait_to_finish();
|
||||
}
|
||||
|
||||
void register_javascript_exporter() {
|
||||
|
|
|
|||
|
|
@ -4266,7 +4266,7 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
|
|||
}
|
||||
}
|
||||
|
||||
events_thread = Thread::create(_poll_events_thread, this);
|
||||
events_thread.start(_poll_events_thread, this);
|
||||
|
||||
_update_real_mouse_position(windows[MAIN_WINDOW_ID]);
|
||||
|
||||
|
|
@ -4280,9 +4280,7 @@ DisplayServerX11::~DisplayServerX11() {
|
|||
_clipboard_transfer_ownership(XInternAtom(x11_display, "CLIPBOARD", 0), x11_main_window);
|
||||
|
||||
events_thread_done = true;
|
||||
Thread::wait_to_finish(events_thread);
|
||||
memdelete(events_thread);
|
||||
events_thread = nullptr;
|
||||
events_thread.wait_to_finish();
|
||||
|
||||
//destroy all windows
|
||||
for (Map<WindowID, WindowData>::Element *E = windows.front(); E; E = E->next()) {
|
||||
|
|
|
|||
|
|
@ -252,7 +252,7 @@ class DisplayServerX11 : public DisplayServer {
|
|||
void _dispatch_input_event(const Ref<InputEvent> &p_event);
|
||||
|
||||
mutable Mutex events_mutex;
|
||||
Thread *events_thread = nullptr;
|
||||
Thread events_thread;
|
||||
bool events_thread_done = false;
|
||||
LocalVector<XEvent> polled_events;
|
||||
static void _poll_events_thread(void *ud);
|
||||
|
|
|
|||
|
|
@ -73,13 +73,12 @@ void JoypadLinux::Joypad::reset() {
|
|||
JoypadLinux::JoypadLinux(Input *in) {
|
||||
exit_udev = false;
|
||||
input = in;
|
||||
joy_thread = Thread::create(joy_thread_func, this);
|
||||
joy_thread.start(joy_thread_func, this);
|
||||
}
|
||||
|
||||
JoypadLinux::~JoypadLinux() {
|
||||
exit_udev = true;
|
||||
Thread::wait_to_finish(joy_thread);
|
||||
memdelete(joy_thread);
|
||||
joy_thread.wait_to_finish();
|
||||
close_joypad();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ private:
|
|||
|
||||
bool exit_udev;
|
||||
Mutex joy_mutex;
|
||||
Thread *joy_thread;
|
||||
Thread joy_thread;
|
||||
Input *input;
|
||||
Joypad joypads[JOYPADS_MAX];
|
||||
Vector<String> attached_devices;
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@
|
|||
#include "servers/audio_server.h"
|
||||
#include "servers/rendering/rendering_server_default.h"
|
||||
#include "servers/rendering/rendering_server_wrap_mt.h"
|
||||
#include "thread_uwp.h"
|
||||
|
||||
#include <ppltasks.h>
|
||||
#include <wrl.h>
|
||||
|
|
@ -130,8 +129,6 @@ void OS_UWP::initialize_core() {
|
|||
|
||||
//RedirectIOToConsole();
|
||||
|
||||
ThreadUWP::make_default();
|
||||
|
||||
FileAccess::make_default<FileAccessWindows>(FileAccess::ACCESS_RESOURCES);
|
||||
FileAccess::make_default<FileAccessWindows>(FileAccess::ACCESS_USERDATA);
|
||||
FileAccess::make_default<FileAccessWindows>(FileAccess::ACCESS_FILESYSTEM);
|
||||
|
|
|
|||
|
|
@ -1,61 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* thread_uwp.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* 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 "thread_uwp.h"
|
||||
|
||||
#include "core/os/memory.h"
|
||||
|
||||
Thread *ThreadUWP::create_func_uwp(ThreadCreateCallback p_callback, void *p_user, const Settings &) {
|
||||
ThreadUWP *thread = memnew(ThreadUWP);
|
||||
|
||||
std::thread new_thread(p_callback, p_user);
|
||||
std::swap(thread->thread, new_thread);
|
||||
|
||||
return thread;
|
||||
};
|
||||
|
||||
Thread::ID ThreadUWP::get_thread_id_func_uwp() {
|
||||
return std::hash<std::thread::id>()(std::this_thread::get_id());
|
||||
};
|
||||
|
||||
void ThreadUWP::wait_to_finish_func_uwp(Thread *p_thread) {
|
||||
ThreadUWP *tp = static_cast<ThreadUWP *>(p_thread);
|
||||
tp->thread.join();
|
||||
};
|
||||
|
||||
Thread::ID ThreadUWP::get_id() const {
|
||||
return std::hash<std::thread::id>()(thread.get_id());
|
||||
};
|
||||
|
||||
void ThreadUWP::make_default() {
|
||||
create_func = create_func_uwp;
|
||||
get_thread_id_func = get_thread_id_func_uwp;
|
||||
wait_to_finish_func = wait_to_finish_func_uwp;
|
||||
};
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* thread_uwp.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* 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 THREAD_UWP_H
|
||||
#define THREAD_UWP_H
|
||||
|
||||
#ifdef UWP_ENABLED
|
||||
|
||||
#include "core/os/thread.h"
|
||||
|
||||
#include <thread>
|
||||
|
||||
class ThreadUWP : public Thread {
|
||||
std::thread thread;
|
||||
|
||||
static Thread *create_func_uwp(ThreadCreateCallback p_callback, void *, const Settings &);
|
||||
static ID get_thread_id_func_uwp();
|
||||
static void wait_to_finish_func_uwp(Thread *p_thread);
|
||||
|
||||
ThreadUWP() {}
|
||||
|
||||
public:
|
||||
virtual ID get_id() const;
|
||||
|
||||
static void make_default();
|
||||
|
||||
~ThreadUWP() {}
|
||||
};
|
||||
|
||||
#endif // UWP_ENABLED
|
||||
|
||||
#endif // THREAD_UWP_H
|
||||
|
|
@ -39,7 +39,6 @@
|
|||
#include "core/version_generated.gen.h"
|
||||
#include "drivers/windows/dir_access_windows.h"
|
||||
#include "drivers/windows/file_access_windows.h"
|
||||
#include "drivers/windows/thread_windows.h"
|
||||
#include "joypad_windows.h"
|
||||
#include "lang_table.h"
|
||||
#include "main/main.h"
|
||||
|
|
@ -176,8 +175,6 @@ void OS_Windows::initialize() {
|
|||
|
||||
//RedirectIOToConsole();
|
||||
|
||||
ThreadWindows::make_default();
|
||||
|
||||
FileAccess::make_default<FileAccessWindows>(FileAccess::ACCESS_RESOURCES);
|
||||
FileAccess::make_default<FileAccessWindows>(FileAccess::ACCESS_USERDATA);
|
||||
FileAccess::make_default<FileAccessWindows>(FileAccess::ACCESS_FILESYSTEM);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue