From 15548de79c3cd76ef1d5c458242f123c065bec4a Mon Sep 17 00:00:00 2001 From: peri4 Date: Sun, 29 Dec 2024 11:48:24 +0300 Subject: [PATCH] version 4.5.0 PIThread::stopAndWait now returns bool PIKbdListener on Linux now use piwaitevent_p and can immediately stop new base method piZeroMemory, also migrate all "memset 0" to piZeroMemory --- CMakeLists.txt | 4 ++-- libs/console/piterminal.cpp | 6 +++--- libs/http_server/microhttpd_server_p.cpp | 4 ++-- libs/main/application/pisystemmonitor.cpp | 6 +++--- libs/main/console/pikbdlistener.cpp | 25 ++++++++++++++++------- libs/main/console/pikbdlistener.h | 19 ++++++++--------- libs/main/core/pibase.h | 17 +++++++++++++++ libs/main/core/piinit.cpp | 8 ++++---- libs/main/core/piwaitevent_p.cpp | 2 +- libs/main/io_devices/pidir.cpp | 12 +++++------ libs/main/io_devices/piethernet.cpp | 20 +++++++++--------- libs/main/io_devices/pifile.cpp | 6 +++--- libs/main/io_devices/piserial.cpp | 6 +++--- libs/main/system/piprocess.cpp | 2 +- libs/main/system/pisysteminfo.cpp | 6 +++--- libs/main/text/pichar.cpp | 4 ++-- libs/main/text/pistring.cpp | 2 +- libs/main/thread/piconditionvar.cpp | 2 +- libs/main/thread/pimutex.cpp | 4 ++-- libs/main/thread/pithread.cpp | 6 +++--- libs/main/thread/pithread.h | 16 +++++++-------- libs/main/types/pidatetime.cpp | 2 +- libs/main/types/pitime.h | 8 ++++++++ libs/opencl/piopencl.cpp | 6 +++--- utils/deploy_tool/main.cpp | 2 +- utils/piterminal/main.cpp | 8 ++++---- utils/system_daemon/main.cpp | 7 ++++--- 27 files changed, 121 insertions(+), 89 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7154e1bd..040e8b8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,8 +2,8 @@ cmake_minimum_required(VERSION 3.0) cmake_policy(SET CMP0017 NEW) # need include() with .cmake project(PIP) set(PIP_MAJOR 4) -set(PIP_MINOR 4) -set(PIP_REVISION 1) +set(PIP_MINOR 5) +set(PIP_REVISION 0) set(PIP_SUFFIX ) set(PIP_COMPANY SHS) set(PIP_DOMAIN org.SHS) diff --git a/libs/console/piterminal.cpp b/libs/console/piterminal.cpp index a840c4ee..236d6565 100644 --- a/libs/console/piterminal.cpp +++ b/libs/console/piterminal.cpp @@ -793,7 +793,7 @@ bool PITerminal::initialize() { // SetHandleInformation(PRIVATE->pipe_in[1], HANDLE_FLAG_INHERIT, 0); // SetHandleInformation(PRIVATE->hConBuf, HANDLE_FLAG_INHERIT, 0); // GetStartupInfoA(&PRIVATE->si); - memset(&PRIVATE->si, 0, sizeof(PRIVATE->si)); + piZeroMemory(PRIVATE->si); PRIVATE->si.cb = sizeof(STARTUPINFO); // PRIVATE->si.dwFlags |= STARTF_USESTDHANDLES; PRIVATE->si.dwFlags |= STARTF_USESHOWWINDOW; @@ -805,7 +805,7 @@ bool PITerminal::initialize() { PRIVATE->si.dwXCountChars = 80; PRIVATE->si.dwYCountChars = 24; - memset(&PRIVATE->pi, 0, sizeof(PRIVATE->pi)); + piZeroMemory(PRIVATE->pi); PIString shmh = PIString::fromNumber(randomi() % 10000); PIString pname = "\\\\.\\pipe\\piterm" + shmh; @@ -857,7 +857,7 @@ bool PITerminal::initialize() { # else # ifdef HAS_FORKPTY char pty[256]; - memset(pty, 0, 256); + piZeroMemory(pty, 256); winsize ws; ws.ws_col = dsize_x; ws.ws_row = dsize_y; diff --git a/libs/http_server/microhttpd_server_p.cpp b/libs/http_server/microhttpd_server_p.cpp index 1e36fcde..5470141a 100644 --- a/libs/http_server/microhttpd_server_p.cpp +++ b/libs/http_server/microhttpd_server_p.cpp @@ -143,7 +143,7 @@ void log_callback(void * cls, const char * fmt, va_list ap) { piCout << "log" << server; if (!server) return; char buffer[1_KiB]; - memset(buffer, 0, 1_KiB); + piZeroMemory(buffer, 1_KiB); std::vsnprintf(buffer, 1_KiB, fmt, ap); piCout << buffer; } @@ -312,7 +312,7 @@ bool MicrohttpdServer::listen(PINetworkAddress addr) { key_pass = opts.value(Option::HTTPSKeyPassword).toByteArray(); if (key_pass.isNotEmpty()) key_pass.append(0); sockaddr_in sa_addr; - memset(&sa_addr, 0, sizeof(sa_addr)); + piZeroMemory(sa_addr); sa_addr.sin_port = htons(addr.port()); sa_addr.sin_addr.s_addr = addr.ip(); sa_addr.sin_family = AF_INET; diff --git a/libs/main/application/pisystemmonitor.cpp b/libs/main/application/pisystemmonitor.cpp index 69301a9d..34396402 100644 --- a/libs/main/application/pisystemmonitor.cpp +++ b/libs/main/application/pisystemmonitor.cpp @@ -405,7 +405,7 @@ float PISystemMonitor::calcThreadUsage(PISystemTime & t_new, PISystemTime & t_ol ullong PISystemMonitor::totalRAM() { #ifdef ESP_PLATFORM multi_heap_info_t heap_info; - memset(&heap_info, 0, sizeof(multi_heap_info_t)); + piZeroMemory(heap_info); heap_caps_get_info(&heap_info, MALLOC_CAP_8BIT); return heap_info.total_allocated_bytes + heap_info.total_free_bytes; #endif @@ -416,7 +416,7 @@ ullong PISystemMonitor::totalRAM() { ullong PISystemMonitor::freeRAM() { #ifdef ESP_PLATFORM multi_heap_info_t heap_info; - memset(&heap_info, 0, sizeof(multi_heap_info_t)); + piZeroMemory(heap_info); heap_caps_get_info(&heap_info, MALLOC_CAP_8BIT); return heap_info.total_free_bytes; #endif @@ -427,7 +427,7 @@ ullong PISystemMonitor::freeRAM() { ullong PISystemMonitor::usedRAM() { #ifdef ESP_PLATFORM multi_heap_info_t heap_info; - memset(&heap_info, 0, sizeof(multi_heap_info_t)); + piZeroMemory(heap_info); heap_caps_get_info(&heap_info, MALLOC_CAP_8BIT); return heap_info.total_allocated_bytes; #endif diff --git a/libs/main/console/pikbdlistener.cpp b/libs/main/console/pikbdlistener.cpp index e5034f57..9f3e4362 100644 --- a/libs/main/console/pikbdlistener.cpp +++ b/libs/main/console/pikbdlistener.cpp @@ -20,6 +20,7 @@ #include "piincludes_p.h" #include "piliterals.h" +#include "piwaitevent_p.h" #ifndef WINDOWS # include #else @@ -144,6 +145,7 @@ PRIVATE_DEFINITION_START(PIKbdListener) int #endif ret; + PIWaitEvent event; PRIVATE_DEFINITION_END(PIKbdListener) @@ -157,11 +159,11 @@ PIKbdListener::PIKbdListener(KBFunc slot, void * _d, bool startNow): PIThread() #else tcgetattr(0, &PRIVATE->sterm); #endif - is_active = true; - ret_func = slot; - kbddata_ = _d; - dbl_interval = 400; - PIKbdListener::exiting = exit_enabled = false; + ret_func = slot; + kbddata_ = _d; + dbl_interval = 400; + PRIVATE->event.create(); + PIKbdListener::exiting = false; if (startNow) start(); } @@ -169,7 +171,7 @@ PIKbdListener::PIKbdListener(KBFunc slot, void * _d, bool startNow): PIThread() PIKbdListener::~PIKbdListener() { stop(); if (!waitForFinish(100_ms)) terminate(); - end(); + PRIVATE->event.destroy(); } @@ -216,7 +218,8 @@ PIKbdListener::MouseButtons getButtons(DWORD v) { void PIKbdListener::readKeyboard() { ke.key = 0; ke.modifiers = 0; - memset(rc, 0, 8); + char rc[8]; + piZeroMemory(rc, 8); #ifdef WINDOWS INPUT_RECORD ir; ReadConsoleInput(PRIVATE->hIn, &ir, 1, &(PRIVATE->ret)); @@ -403,6 +406,7 @@ void PIKbdListener::readKeyboard() { } #else tcsetattr(0, TCSANOW, &PRIVATE->tterm); + if (!PRIVATE->event.wait(0)) return; PRIVATE->ret = read(0, rc, 8); /*piCout << "key" << PIString(rc).replaceAll("\e", "\\e"); for (int i = 0; i < PRIVATE->ret; ++i) @@ -542,6 +546,13 @@ void PIKbdListener::readKeyboard() { void PIKbdListener::stop() { PIThread::stop(); + PRIVATE->event.interrupt(); +} + + +bool PIKbdListener::stopAndWait(PISystemTime timeout) { + stop(); + return waitForFinish(timeout); } diff --git a/libs/main/console/pikbdlistener.h b/libs/main/console/pikbdlistener.h index 7bdc6933..6ca61042 100644 --- a/libs/main/console/pikbdlistener.h +++ b/libs/main/console/pikbdlistener.h @@ -29,15 +29,11 @@ #include "pithread.h" #include "pitime.h" -#define WAIT_FOR_EXIT \ - while (!PIKbdListener::exiting) \ - piMSleep(PIP_MIN_MSLEEP * 5); \ - if (PIKbdListener::instance()) { \ - PIKbdListener::instance()->stop(); \ - if (!PIKbdListener::instance()->waitForFinish(PISystemTime::fromMilliseconds(100))) { \ - PIKbdListener::instance()->setDebug(false); \ - PIKbdListener::instance()->terminate(); \ - } \ +#define WAIT_FOR_EXIT \ + while (!PIKbdListener::exiting) \ + piMSleep(PIP_MIN_MSLEEP * 5); \ + if (PIKbdListener::instance()) { \ + if (!PIKbdListener::instance()->stopAndWait(PISystemTime::fromSeconds(1))) PIKbdListener::instance()->terminate(); \ } @@ -188,6 +184,8 @@ public: void stop(); + bool stopAndWait(PISystemTime timeout = {}); + //! Returns if keyboard listening is active (not running!) bool isActive() { return is_active; } @@ -258,9 +256,8 @@ private: PRIVATE_DECLARATION(PIP_EXPORT) KBFunc ret_func; int exit_key; - bool exit_enabled, is_active; + bool exit_enabled = false, is_active = true; void * kbddata_; - char rc[8]; double dbl_interval; PITimeMeasurer tm_dbl; KeyEvent ke; diff --git a/libs/main/core/pibase.h b/libs/main/core/pibase.h index 8269137c..cf3ed3ee 100644 --- a/libs/main/core/pibase.h +++ b/libs/main/core/pibase.h @@ -558,6 +558,23 @@ inline uint piHash(const ldouble & v) { return piHashData((const uchar *)&v, sizeof(v)); } + +//! \~\brief +//! \~english Zero "size" bytes by address "ptr". +//! \~russian Зануляет "size" байт по адресу "ptr". +inline void piZeroMemory(void * ptr, size_t size) { + memset(ptr, 0, size); +} + +//! \~\brief +//! \~english Zero variable "v" memory. +//! \~russian Зануляет память переменной "v". +template +inline void piZeroMemory(T & v) { + piZeroMemory(&v, sizeof(v)); +} + + //! \~\brief //! \~english Call \b delete on each "container" element. //! \~russian Вызывает \b delete на каждый элемент "container". diff --git a/libs/main/core/piinit.cpp b/libs/main/core/piinit.cpp index 9109f454..266be335 100644 --- a/libs/main/core/piinit.cpp +++ b/libs/main/core/piinit.cpp @@ -167,7 +167,7 @@ PIInit::PIInit() { for (l = 0; l < MAX_PATH; ++l) if (cpinfo.CodePageName[l] == '\0' || cpinfo.CodePageName[l] == ' ') break; __sysoemname__ = new char[256]; - memset(__sysoemname__, 0, 256); + piZeroMemory(__sysoemname__, 256); memcpy(__sysoemname__, "ibm-", 4); memcpy(&(__sysoemname__[4]), cpinfo.CodePageName, l); # else @@ -190,7 +190,7 @@ PIInit::PIInit() { host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &__pi_mac_clock); # endif char cbuff[1024]; - memset(cbuff, 0, 1024); + piZeroMemory(cbuff, 1024); if (gethostname(cbuff, 1023) == 0) { sinfo->hostname = cbuff; } @@ -210,7 +210,7 @@ PIInit::PIInit() { wchar_t ** argv_ = CommandLineToArgvW(GetCommandLineW(), &argc_); if (argc_ > 0 && argv_ != 0) sinfo->execCommand = argv_[0]; LocalFree(argv_); - memset(cbuff, 0, 1024); + piZeroMemory(cbuff, 1024); ulong unlen = 1023; if (GetUserNameA(cbuff, &unlen) != 0) sinfo->user = cbuff; # else // WINDOWS @@ -219,7 +219,7 @@ PIInit::PIInit() { if (ps) sinfo->user = ps->pw_name; else { - memset(cbuff, 0, 1024); + piZeroMemory(cbuff, 1024); char * l = getlogin(); if (l) sinfo->user = l; } diff --git a/libs/main/core/piwaitevent_p.cpp b/libs/main/core/piwaitevent_p.cpp index 1130ca13..7526cf53 100644 --- a/libs/main/core/piwaitevent_p.cpp +++ b/libs/main/core/piwaitevent_p.cpp @@ -46,7 +46,7 @@ void PIWaitEvent::create() { } #else for (int i = 0; i < 3; ++i) - memset(&(fds[i]), 0, sizeof(fds[i])); + piZeroMemory(fds[i]); if (::pipe(pipe_fd) < 0) { piCout << "Error with pipe:" << errorString(); } else { diff --git a/libs/main/io_devices/pidir.cpp b/libs/main/io_devices/pidir.cpp index cda04d10..341b2446 100644 --- a/libs/main/io_devices/pidir.cpp +++ b/libs/main/io_devices/pidir.cpp @@ -326,7 +326,7 @@ PIVector PIDir::entries() { } } else { WIN32_FIND_DATAA fd; - memset(&fd, 0, sizeof(fd)); + piZeroMemory(fd); p += "\\*"; void * hf = FindFirstFileA((LPCSTR)(p.data()), &fd); if (!hf) return l; @@ -335,7 +335,7 @@ PIVector PIDir::entries() { PIString fn(fd.cFileName); if (fn == "..") hdd = true; l << PIFile::fileInfo(dp + fn); - memset(&fd, 0, sizeof(fd)); + piZeroMemory(fd); } while (FindNextFileA(hf, &fd) != 0); FindClose(hf); l.sort(sort_compare); @@ -440,7 +440,7 @@ PIDir PIDir::current() { char rc[1024]; #endif #ifdef WINDOWS - memset(rc, 0, 1024); + piZeroMemory(rc, 1024); if (GetCurrentDirectory(1024, (LPTSTR)rc) == 0) return PIString(); PIString ret(rc); ret.replaceAll("\\", PIDir::separator); @@ -463,13 +463,13 @@ PIDir PIDir::home() { #endif #ifdef WINDOWS rc = new char[1024]; - memset(rc, 0, 1024); + piZeroMemory(rc, 1024); if (ExpandEnvironmentStrings((LPCTSTR) "%HOMEPATH%", (LPTSTR)rc, 1024) == 0) { delete[] rc; return PIDir(); } PIString hp(rc); - memset(rc, 0, 1024); + piZeroMemory(rc, 1024); if (ExpandEnvironmentStrings((LPCTSTR) "%HOMEDRIVE%", (LPTSTR)rc, 1024) == 0) { delete[] rc; return PIDir(); @@ -495,7 +495,7 @@ PIDir PIDir::temporary() { char * rc = nullptr; #ifdef WINDOWS rc = new char[1024]; - memset(rc, 0, 1024); + piZeroMemory(rc, 1024); int ret = GetTempPath(1024, (LPTSTR)rc); if (ret == 0) { delete[] rc; diff --git a/libs/main/io_devices/piethernet.cpp b/libs/main/io_devices/piethernet.cpp index 2be99989..cd7740a0 100644 --- a/libs/main/io_devices/piethernet.cpp +++ b/libs/main/io_devices/piethernet.cpp @@ -272,7 +272,7 @@ bool PIEthernet::openDevice() { // if (type() == TCP_Client) // connecting_ = true; if (type() != UDP || mode() == PIIODevice::WriteOnly) return true; - memset(&PRIVATE->addr_, 0, sizeof(PRIVATE->addr_)); + piZeroMemory(PRIVATE->addr_); PRIVATE->addr_.sin_family = AF_INET; PRIVATE->addr_.sin_port = htons(addr_r.port()); if (params[PIEthernet::Broadcast]) @@ -377,7 +377,7 @@ bool PIEthernet::joinMulticastGroup(const PIString & group) { #else struct ip_mreq mreq; #endif - memset(&mreq, 0, sizeof(mreq)); + piZeroMemory(mreq); #ifdef LINUX // mreq.imr_address.s_addr = INADDR_ANY; /*PIEthernet::InterfaceList il = interfaces(); @@ -423,7 +423,7 @@ bool PIEthernet::leaveMulticastGroup(const PIString & group) { #else struct ip_mreq mreq; #endif - memset(&mreq, 0, sizeof(mreq)); + piZeroMemory(mreq); if (params[PIEthernet::Broadcast]) #ifndef LWIP mreq.imr_address.s_addr = INADDR_ANY; @@ -454,7 +454,7 @@ bool PIEthernet::connect(bool threaded) { if (connected_) return false; if (sock == -1) init(); if (sock == -1) return false; - memset(&PRIVATE->addr_, 0, sizeof(PRIVATE->addr_)); + piZeroMemory(PRIVATE->addr_); addr_r.set(path()); PRIVATE->addr_.sin_port = htons(addr_r.port()); PRIVATE->addr_.sin_addr.s_addr = addr_r.ip(); @@ -492,7 +492,7 @@ bool PIEthernet::listen(bool threaded) { } listen_threaded = server_bounded = false; addr_r.set(path()); - memset(&PRIVATE->addr_, 0, sizeof(PRIVATE->addr_)); + piZeroMemory(PRIVATE->addr_); PRIVATE->addr_.sin_port = htons(addr_r.port()); PRIVATE->addr_.sin_addr.s_addr = addr_r.ip(); PRIVATE->addr_.sin_family = AF_INET; @@ -618,7 +618,7 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) { case TCP_Client: if (connecting_) { addr_r.set(path()); - memset(&PRIVATE->addr_, 0, sizeof(PRIVATE->addr_)); + piZeroMemory(PRIVATE->addr_); PRIVATE->addr_.sin_port = htons(addr_r.port()); PRIVATE->addr_.sin_addr.s_addr = addr_r.ip(); PRIVATE->addr_.sin_family = AF_INET; @@ -704,7 +704,7 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) { if (rs > 0) received(read_to, rs); return rs; case UDP: { - memset(&PRIVATE->raddr_, 0, sizeof(PRIVATE->raddr_)); + piZeroMemory(PRIVATE->raddr_); // piCoutObj << "read from" << path() << "..."; #ifdef WINDOWS long wr = waitForEvent(PRIVATE->event, FD_READ | FD_CLOSE); @@ -765,7 +765,7 @@ ssize_t PIEthernet::writeDevice(const void * data, ssize_t max_size) { // piCout << "[PIEth] write to" << ip_s << ":" << port_s << "ok"; case TCP_Client: { if (connecting_) { - memset(&PRIVATE->addr_, 0, sizeof(PRIVATE->addr_)); + piZeroMemory(PRIVATE->addr_); addr_r.set(path()); PRIVATE->addr_.sin_port = htons(addr_r.port()); PRIVATE->addr_.sin_addr.s_addr = addr_r.ip(); @@ -962,7 +962,7 @@ long PIEthernet::waitForEvent(PIWaitEvent & event, long mask) { // DWORD wr = WSAWaitForMultipleEvents(1, &(PRIVATE->read_event), FALSE, WSA_INFINITE, TRUE); // if (wr == WSA_WAIT_EVENT_0) { WSANETWORKEVENTS events; - memset(&events, 0, sizeof(events)); + piZeroMemory(events); WSAEnumNetworkEvents(sock, event.getEvent(), &events); // piCoutObj << "wait result" << events.lNetworkEvents; return events.lNetworkEvents; @@ -1245,7 +1245,7 @@ PINetworkAddress PIEthernet::interfaceAddress(const PIString & interface_) { return PINetworkAddress(); #else struct ifreq ifr; - memset(&ifr, 0, sizeof(ifr)); + piZeroMemory(ifr); strcpy(ifr.ifr_name, interface_.dataAscii()); int s = ::socket(AF_INET, SOCK_DGRAM, 0); ioctl(s, SIOCGIFADDR, &ifr); diff --git a/libs/main/io_devices/pifile.cpp b/libs/main/io_devices/pifile.cpp index c6a09038..732b4e8d 100644 --- a/libs/main/io_devices/pifile.cpp +++ b/libs/main/io_devices/pifile.cpp @@ -492,7 +492,7 @@ PIFile::FileInfo PIFile::fileInfo(const PIString & path) { } if (!hFile) return ret; BY_HANDLE_FILE_INFORMATION fi; - memset(&fi, 0, sizeof(fi)); + piZeroMemory(fi); if (GetFileInformationByHandle(hFile, &fi) != 0) { LARGE_INTEGER filesize; filesize.LowPart = filesize.HighPart = 0; @@ -515,7 +515,7 @@ PIFile::FileInfo PIFile::fileInfo(const PIString & path) { CloseHandle(hFile); #else _stat_struct_ fs; - memset(&fs, 0, sizeof(fs)); + piZeroMemory(fs); _stat_call_(path.data(), &fs); int mode = fs.st_mode; ret.size = fs.st_size; @@ -544,7 +544,7 @@ PIFile::FileInfo PIFile::fileInfo(const PIString & path) { ret.perm_user = FileInfo::Permissions((mode & S_IRUSR) == S_IRUSR, (mode & S_IWUSR) == S_IWUSR, (mode & S_IXUSR) == S_IXUSR); ret.perm_group = FileInfo::Permissions((mode & S_IRGRP) == S_IRGRP, (mode & S_IWGRP) == S_IWGRP, (mode & S_IXGRP) == S_IXGRP); ret.perm_other = FileInfo::Permissions((mode & S_IROTH) == S_IROTH, (mode & S_IWOTH) == S_IWOTH, (mode & S_IXOTH) == S_IXOTH); - memset(&fs, 0, sizeof(fs)); + piZeroMemory(fs); _stat_link_(path.data(), &fs); mode &= ~S_IFLNK; mode |= S_IFLNK & fs.st_mode; diff --git a/libs/main/io_devices/piserial.cpp b/libs/main/io_devices/piserial.cpp index 43bb6392..fc6241ee 100644 --- a/libs/main/io_devices/piserial.cpp +++ b/libs/main/io_devices/piserial.cpp @@ -877,7 +877,7 @@ ssize_t PISerial::readDevice(void * read_to, ssize_t max_size) { close(); return 0; } - memset(&(PRIVATE->overlap), 0, sizeof(PRIVATE->overlap)); + piZeroMemory(PRIVATE->overlap); PRIVATE->overlap.hEvent = PRIVATE->event.getEvent(); PRIVATE->readed = 0; ReadFile(PRIVATE->hCom, read_to, max_size, NULL, &(PRIVATE->overlap)); @@ -924,7 +924,7 @@ ssize_t PISerial::writeDevice(const void * data, ssize_t max_size) { DWORD wrote(0); // piCoutObj << "send ..." << max_size;// << ": " << PIString((char*)data, max_size); sending = true; - memset(&(PRIVATE->overlap_write), 0, sizeof(PRIVATE->overlap_write)); + piZeroMemory(PRIVATE->overlap_write); PRIVATE->overlap_write.hEvent = PRIVATE->event_write.getEvent(); WriteFile(PRIVATE->hCom, data, max_size, NULL, &(PRIVATE->overlap_write)); if (PRIVATE->event_write.wait()) { @@ -1160,7 +1160,7 @@ PIVector PISerial::availableDevicesInfo(bool test) { const HDEVINFO dis = SetupDiGetClassDevs(&(guids[i]), NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if (dis == INVALID_HANDLE_VALUE) continue; SP_DEVINFO_DATA did; - memset(&did, 0, sizeof(did)); + piZeroMemory(did); did.cbSize = sizeof(did); DWORD index = 0; while (SetupDiEnumDeviceInfo(dis, index++, &did)) { diff --git a/libs/main/system/piprocess.cpp b/libs/main/system/piprocess.cpp index 3463ab69..e8a0c87a 100644 --- a/libs/main/system/piprocess.cpp +++ b/libs/main/system/piprocess.cpp @@ -177,7 +177,7 @@ void PIProcess::startProc(bool detached) { # endif # ifdef WINDOWS GetStartupInfoA(&(PRIVATE->si)); - memset(&(PRIVATE->pi), 0, sizeof(PRIVATE->pi)); + piZeroMemory(PRIVATE->pi); if (CreateProcessA(0, // No module name (use command line) a, // Command line 0, // Process handle not inheritable diff --git a/libs/main/system/pisysteminfo.cpp b/libs/main/system/pisysteminfo.cpp index 0e0e238d..ffd10192 100644 --- a/libs/main/system/pisysteminfo.cpp +++ b/libs/main/system/pisysteminfo.cpp @@ -54,7 +54,7 @@ PIStringList PISystemInfo::mountRoots() { # ifdef LINUX PIString s_df, s_m; char in[1024]; - memset(in, 0, 1024); + piZeroMemory(in, 1024); FILE * fp = popen("mount -l", "r"); PIStringList tl; if (fp) { @@ -129,7 +129,7 @@ PIVector PISystemInfo::mountInfo(bool ignore_cache) { #ifdef LINUX PIString s_df, s_m; char in[1024]; - memset(in, 0, 1024); + piZeroMemory(in, 1024); // piCout << "mountInfo 0"; FILE * fp = popen("df -B1", "r"); PIStringList l_df; @@ -141,7 +141,7 @@ PIVector PISystemInfo::mountInfo(bool ignore_cache) { fp = 0; } // piCout << "mountInfo 1"; - memset(in, 0, 1024); + piZeroMemory(in, 1024); fp = popen("mount -l", "r"); PIStringList tl; if (fp) { diff --git a/libs/main/text/pichar.cpp b/libs/main/text/pichar.cpp index ac75b930..537aaadf 100644 --- a/libs/main/text/pichar.cpp +++ b/libs/main/text/pichar.cpp @@ -73,7 +73,7 @@ ushort charFromCodepage(const char * c, int size, const char * codepage, int * t return buffer; # else mbstate_t state; - memset(&state, 0, sizeof(state)); + piZeroMemory(state); wchar_t wc; ret = mbrtowc(&wc, c, size, &state); // printf("mbtowc = %d\n", ret); @@ -369,7 +369,7 @@ PICout operator<<(PICout s, const PIChar & v) { UConverter * cc = ucnv_open(__syslocname__, &e); if (cc) { char uc[8]; - memset(uc, 0, 8); + piZeroMemory(uc, 8); e = (UErrorCode)0; ucnv_fromUChars(cc, uc, 8, (const UChar *)(&v.ch), 1, &e); ucnv_close(cc); diff --git a/libs/main/text/pistring.cpp b/libs/main/text/pistring.cpp index b5521b0f..03952a44 100644 --- a/libs/main/text/pistring.cpp +++ b/libs/main/text/pistring.cpp @@ -178,7 +178,7 @@ T toDecimal(const PIString & s) { #define pisprintf(f, v) \ char ch[256]; \ - memset(ch, 0, 256); \ + piZeroMemory(ch, 256); \ snprintf(ch, 256, f, v); \ return PIStringAscii(ch); diff --git a/libs/main/thread/piconditionvar.cpp b/libs/main/thread/piconditionvar.cpp index 4aa3995d..0c6412c4 100644 --- a/libs/main/thread/piconditionvar.cpp +++ b/libs/main/thread/piconditionvar.cpp @@ -58,7 +58,7 @@ PIConditionVariable::PIConditionVariable() { # if !defined(MAC_OS) pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC); # endif - memset(&(PRIVATE->nativeHandle), 0, sizeof(PRIVATE->nativeHandle)); + piZeroMemory(PRIVATE->nativeHandle); pthread_cond_init(&PRIVATE->nativeHandle, &condattr); #endif } diff --git a/libs/main/thread/pimutex.cpp b/libs/main/thread/pimutex.cpp index 0b91545c..a432e6a4 100644 --- a/libs/main/thread/pimutex.cpp +++ b/libs/main/thread/pimutex.cpp @@ -209,10 +209,10 @@ void PIMutex::init() { PRIVATE->mutex = xSemaphoreCreateMutex(); #else pthread_mutexattr_t attr; - memset(&attr, 0, sizeof(attr)); + piZeroMemory(attr); pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); - memset(&(PRIVATE->mutex), 0, sizeof(PRIVATE->mutex)); + piZeroMemory(PRIVATE->mutex); pthread_mutex_init(&(PRIVATE->mutex), &attr); pthread_mutexattr_destroy(&attr); #endif diff --git a/libs/main/thread/pithread.cpp b/libs/main/thread/pithread.cpp index 413155b6..f3cbca1d 100644 --- a/libs/main/thread/pithread.cpp +++ b/libs/main/thread/pithread.cpp @@ -651,9 +651,9 @@ bool PIThread::startOnce(std::function func) { } -void PIThread::stopAndWait(PISystemTime timeout) { +bool PIThread::stopAndWait(PISystemTime timeout) { stop(); - waitForFinish(timeout); + return waitForFinish(timeout); } @@ -791,7 +791,7 @@ void PIThread::setPriority(PIThread::Priority prior) { # ifndef WINDOWS // PICout(PICoutManipulators::DefaultControls) << "setPriority" << PRIVATE->thread; int policy_ = 0; - memset(&(PRIVATE->sparam), 0, sizeof(PRIVATE->sparam)); + piZeroMemory(PRIVATE->sparam); pthread_getschedparam(PRIVATE->thread, &policy_, &(PRIVATE->sparam)); PRIVATE->sparam. # ifndef LINUX diff --git a/libs/main/thread/pithread.h b/libs/main/thread/pithread.h index af27d37f..d9f7847b 100644 --- a/libs/main/thread/pithread.h +++ b/libs/main/thread/pithread.h @@ -143,15 +143,13 @@ public: EVENT_HANDLER0(void, stop); EVENT_HANDLER0(void, terminate); - //! \~english Stop thread and wait for finish. - //! \~russian Останавливает поток и ожидает завершения. - void stopAndWait(int timeout_ms) DEPRECATEDM("use waitForStart(PISystemTime)") { - stopAndWait(PISystemTime::fromMilliseconds(timeout_ms)); + bool stopAndWait(int timeout_ms) DEPRECATEDM("use stopAndWait(PISystemTime)") { + return stopAndWait(PISystemTime::fromMilliseconds(timeout_ms)); } - //! \~english Stop thread and wait for finish. - //! \~russian Останавливает поток и ожидает завершения. - void stopAndWait(PISystemTime timeout = {}); + //! \~english Stop thread and wait for finish. Returns \b false if timeout expired. + //! \~russian Останавливает поток и ожидает завершения. Возвращает \b false если таймаут истек. + bool stopAndWait(PISystemTime timeout = {}); //! \~english Set common data passed to external function //! \~russian Устанавливает данные, передаваемые в функцию потока @@ -194,8 +192,8 @@ public: return waitForStart(PISystemTime::fromMilliseconds(timeout_msecs)); } - //! \~english Wait for thread finish - //! \~russian Ожидает завершения потока + //! \~english Wait for thread finish. Returns \b false if timeout expired. + //! \~russian Ожидает завершения потока. Возвращает \b false если таймаут истек. bool waitForFinish(PISystemTime timeout = {}); bool waitForFinish(int timeout_msecs) DEPRECATEDM("use waitForFinish(PISystemTime)") { return waitForFinish(PISystemTime::fromMilliseconds(timeout_msecs)); diff --git a/libs/main/types/pidatetime.cpp b/libs/main/types/pidatetime.cpp index 879323b8..cc3ae7da 100644 --- a/libs/main/types/pidatetime.cpp +++ b/libs/main/types/pidatetime.cpp @@ -324,7 +324,7 @@ PIString PIDateTime::toString(const PIString & format) const { time_t PIDateTime::toSecondSinceEpoch() const { tm pt; - memset(&pt, 0, sizeof(pt)); + piZeroMemory(pt); pt.tm_sec = seconds; pt.tm_min = minutes; pt.tm_hour = hours; diff --git a/libs/main/types/pitime.h b/libs/main/types/pitime.h index 0181cd86..3d1c2d66 100644 --- a/libs/main/types/pitime.h +++ b/libs/main/types/pitime.h @@ -54,6 +54,14 @@ inline void piSleep(double secs) { piUSleep(int(secs * 1000000.)); } // on !Windows consider constant "usleep" offset +//! \ingroup Types +//! \brief +//! \~english Precise sleep for "t" time +//! \~russian Точно ожидает время "t" +inline void piSleep(PISystemTime t) { + t.sleep(); +} + //! \ingroup Types //! \~english Shortest available on current system sleep //! \~russian Наименее возможное для данной системы по длительности ожидание diff --git a/libs/opencl/piopencl.cpp b/libs/opencl/piopencl.cpp index 30b95f61..099ab8ce 100644 --- a/libs/opencl/piopencl.cpp +++ b/libs/opencl/piopencl.cpp @@ -548,7 +548,7 @@ void PIOpenCL::Kernel::zero() { bool PIOpenCL::Kernel::init() { char kname[1024]; - memset(kname, 0, 1024); + piZeroMemory(kname, 1024); cl_int ret = 0; ret = clGetKernelInfo(PRIVATE->kernel, CL_KERNEL_FUNCTION_NAME, 1024, kname, 0); if (ret != 0) { @@ -655,14 +655,14 @@ void PIOpenCL::KernelArg::init(void * _k, uint index) { cl_kernel k = (cl_kernel)_k; cl_int ret = 0; char nm[1024]; - memset(nm, 0, 1024); + piZeroMemory(nm, 1024); ret = clGetKernelArgInfo(k, index, CL_KERNEL_ARG_TYPE_NAME, 1024, nm, 0); if (ret != 0) { piCout << "[PIOpenCL::Kernel]" << "clGetKernelArgInfo(CL_KERNEL_ARG_TYPE_NAME) error" << ret; } type_name = nm; - memset(nm, 0, 1024); + piZeroMemory(nm, 1024); ret = clGetKernelArgInfo(k, index, CL_KERNEL_ARG_NAME, 1024, nm, 0); if (ret != 0) { piCout << "[PIOpenCL::Kernel]" diff --git a/utils/deploy_tool/main.cpp b/utils/deploy_tool/main.cpp index 303259af..72da03aa 100644 --- a/utils/deploy_tool/main.cpp +++ b/utils/deploy_tool/main.cpp @@ -206,7 +206,7 @@ PIString execute(const PIString & cmd) { if (fp) { const int sz = 256; char in[sz]; - memset(in, 0, sz); + piZeroMemory(in, sz); while (true) { int r = fread(in, 1, sz, fp); if (r <= 0) break; diff --git a/utils/piterminal/main.cpp b/utils/piterminal/main.cpp index cc33f83a..40c509ed 100644 --- a/utils/piterminal/main.cpp +++ b/utils/piterminal/main.cpp @@ -125,7 +125,7 @@ void readConsole(int x, int y, int w, int h) { bs.X = w; bs.Y = h; bc.X = bc.Y = 0; - memset(chars, 0, w * h * sizeof(CHAR_INFO)); + piZeroMemory(chars, w * h * sizeof(CHAR_INFO)); ReadConsoleOutput(console, chars, bs, bc, &(sbi.srWindow)); for (int i = 0; i < h; ++i) for (int j = 0; j < w; ++j) @@ -249,9 +249,9 @@ int main(int argc, char * argv[]) { // piCout << "start"; STARTUPINFOA si; PROCESS_INFORMATION pi; - memset(&si, 0, sizeof(si)); - memset(&pi, 0, sizeof(pi)); - memset(&sbi, 0, sizeof(sbi)); + piZeroMemory(si); + piZeroMemory(pi); + piZeroMemory(sbi); PIString shmh, pname; if (argc > 1) shmh = argv[1]; if (argc > 2) pname = argv[2]; diff --git a/utils/system_daemon/main.cpp b/utils/system_daemon/main.cpp index 751e05f3..7c244cd8 100755 --- a/utils/system_daemon/main.cpp +++ b/utils/system_daemon/main.cpp @@ -421,11 +421,12 @@ int main(int argc, char * argv[]) { if (sapp) CONNECTU(sapp, messageReceived, menu, messageFromApp); if (cli.hasArgument("silent")) { PICout::setOutputDevices(PICout::Console); - PIKbdListener ls; + PIKbdListener ls(0, 0, false); ls.enableExitCapture(PIKbdListener::F10); ls.start(); - WAIT_FOR_EXIT - ls.stopAndWait(); + while (!PIKbdListener::exiting) + piMSleep(PIP_MIN_MSLEEP * 5); + if (!ls.stopAndWait(1_s)) ls.terminate(); } else { screen->start(); screen->waitForFinish();