aboutsummaryrefslogtreecommitdiff
path: root/src/gui
ModeNameSize
-rw-r--r--CMakeLists.txt663logplain
-rw-r--r--guiChatConsole.cpp16602logplain
-rw-r--r--guiChatConsole.h3965logplain
-rw-r--r--guiConfirmRegistration.cpp7372logplain
-rw-r--r--guiConfirmRegistration.h1863logplain
-rw-r--r--guiEditBoxWithScrollbar.cpp40726logplain
-rw-r--r--guiEditBoxWithScrollbar.h6499logplain
-rw-r--r--guiEngine.cpp16984logplain
-rw-r--r--guiEngine.h8876logplain
-rw-r--r--guiFormSpecMenu.cpp105193logplain
-rw-r--r--guiFormSpecMenu.h14432logplain
-rw-r--r--guiKeyChangeMenu.cpp14245logplain
-rw-r--r--guiKeyChangeMenu.h2051logplain
-rw-r--r--guiMainMenu.h1514logplain
-rw-r--r--guiPasswordChange.cpp7705logplain
-rw-r--r--guiPasswordChange.h1657logplain
-rw-r--r--guiPathSelectMenu.cpp3062logplain
-rw-r--r--guiPathSelectMenu.h1724logplain
-rw-r--r--guiTable.cpp34855logplain
-rw-r--r--guiTable.h7316logplain
-rw-r--r--guiVolumeChange.cpp5551logplain
-rw-r--r--guiVolumeChange.h1516logplain
-rw-r--r--intlGUIEditBox.cpp36803logplain
-rw-r--r--intlGUIEditBox.h6702logplain
-rw-r--r--mainmenumanager.h3511logplain
-rw-r--r--modalMenu.cpp7937logplain
-rw-r--r--modalMenu.h2443logplain
-rw-r--r--profilergraph.cpp4570logplain
-rw-r--r--profilergraph.h1553logplain
-rw-r--r--touchscreengui.cpp36944logplain
-rw-r--r--touchscreengui.h7488logplain
kwb">const std::string &name) : m_name(name), m_request_stop(false), m_running(false) { #ifdef _AIX m_kernel_thread_id = -1; #endif } Thread::~Thread() { // kill the thread if running if (!m_running) { wait(); } else { m_running = false; #if defined(_WIN32) // See https://msdn.microsoft.com/en-us/library/hh920601.aspx#thread__native_handle_method TerminateThread((HANDLE) m_thread_obj->native_handle(), 0); CloseHandle((HANDLE) m_thread_obj->native_handle()); #else // We need to pthread_kill instead on Android since NDKv5's pthread // implementation is incomplete. # ifdef __ANDROID__ pthread_kill(getThreadHandle(), SIGKILL); # else pthread_cancel(getThreadHandle()); # endif wait(); #endif } // Make sure start finished mutex is unlocked before it's destroyed if (m_start_finished_mutex.try_lock()) m_start_finished_mutex.unlock(); } bool Thread::start() { MutexAutoLock lock(m_mutex); if (m_running) return false; m_request_stop = false; // The mutex may already be locked if the thread is being restarted m_start_finished_mutex.try_lock(); try { m_thread_obj = new std::thread(threadProc, this); } catch (const std::system_error &e) { return false; } // Allow spawned thread to continue m_start_finished_mutex.unlock(); while (!m_running) sleep_ms(1); m_joinable = true; return true; } bool Thread::stop() { m_request_stop = true; return true; } bool Thread::wait() { MutexAutoLock lock(m_mutex); if (!m_joinable) return false; m_thread_obj->join(); delete m_thread_obj; m_thread_obj = nullptr; assert(m_running == false); m_joinable = false; return true; } bool Thread::getReturnValue(void **ret) { if (m_running) return false; *ret = m_retval; return true; } void Thread::threadProc(Thread *thr) { #ifdef _AIX thr->m_kernel_thread_id = thread_self(); #endif thr->setName(thr->m_name); g_logger.registerThread(thr->m_name); thr->m_running = true; // Wait for the thread that started this one to finish initializing the // thread handle so that getThreadId/getThreadHandle will work. thr->m_start_finished_mutex.lock(); thr->m_retval = thr->run(); thr->m_running = false; // Unlock m_start_finished_mutex to prevent data race condition on Windows. // On Windows with VS2017 build TerminateThread is called and this mutex is not // released. We try to unlock it from caller thread and it's refused by system. thr->m_start_finished_mutex.unlock(); g_logger.deregisterThread(); } void Thread::setName(const std::string &name) { #if defined(__linux__) // It would be cleaner to do this with pthread_setname_np, // which was added to glibc in version 2.12, but some major // distributions are still runing 2.11 and previous versions. prctl(PR_SET_NAME, name.c_str()); #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) pthread_set_name_np(pthread_self(), name.c_str()); #elif defined(__NetBSD__) pthread_setname_np(pthread_self(), "%s", const_cast<char*>(name.c_str())); #elif defined(__APPLE__) pthread_setname_np(name.c_str()); #elif defined(__HAIKU__) rename_thread(find_thread(NULL), name.c_str()); #elif defined(_MSC_VER) // Windows itself doesn't support thread names, // but the MSVC debugger does... THREADNAME_INFO info; info.dwType = 0x1000; info.szName = name.c_str(); info.dwThreadID = -1; info.dwFlags = 0; __try { RaiseException(0x406D1388, 0, sizeof(info) / sizeof(DWORD), (ULONG_PTR *)&info); } __except (EXCEPTION_CONTINUE_EXECUTION) { } #elif defined(_WIN32) || defined(__GNU__) // These platforms are known to not support thread names. // Silently ignore the request. #else #warning "Unrecognized platform, thread names will not be available." #endif } unsigned int Thread::getNumberOfProcessors() { return std::thread::hardware_concurrency(); } bool Thread::bindToProcessor(unsigned int proc_number) { #if defined(__ANDROID__) return false; #elif _MSC_VER return SetThreadAffinityMask(getThreadHandle(), 1 << proc_number); #elif __MINGW32__ return SetThreadAffinityMask(pthread_gethandle(getThreadHandle()), 1 << proc_number); #elif __FreeBSD_version >= 702106 || defined(__linux__) || defined(__DragonFly__) cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(proc_number, &cpuset); return pthread_setaffinity_np(getThreadHandle(), sizeof(cpuset), &cpuset) == 0; #elif defined(__NetBSD__) cpuset_t *cpuset = cpuset_create(); if (cpuset == NULL) return false; int r = pthread_setaffinity_np(getThreadHandle(), cpuset_size(cpuset), cpuset);