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
This commit is contained in:
2024-12-29 11:48:24 +03:00
parent 49713ddc57
commit 15548de79c
27 changed files with 121 additions and 89 deletions

View File

@@ -2,8 +2,8 @@ cmake_minimum_required(VERSION 3.0)
cmake_policy(SET CMP0017 NEW) # need include() with .cmake cmake_policy(SET CMP0017 NEW) # need include() with .cmake
project(PIP) project(PIP)
set(PIP_MAJOR 4) set(PIP_MAJOR 4)
set(PIP_MINOR 4) set(PIP_MINOR 5)
set(PIP_REVISION 1) set(PIP_REVISION 0)
set(PIP_SUFFIX ) set(PIP_SUFFIX )
set(PIP_COMPANY SHS) set(PIP_COMPANY SHS)
set(PIP_DOMAIN org.SHS) set(PIP_DOMAIN org.SHS)

View File

@@ -793,7 +793,7 @@ bool PITerminal::initialize() {
// SetHandleInformation(PRIVATE->pipe_in[1], HANDLE_FLAG_INHERIT, 0); // SetHandleInformation(PRIVATE->pipe_in[1], HANDLE_FLAG_INHERIT, 0);
// SetHandleInformation(PRIVATE->hConBuf, HANDLE_FLAG_INHERIT, 0); // SetHandleInformation(PRIVATE->hConBuf, HANDLE_FLAG_INHERIT, 0);
// GetStartupInfoA(&PRIVATE->si); // GetStartupInfoA(&PRIVATE->si);
memset(&PRIVATE->si, 0, sizeof(PRIVATE->si)); piZeroMemory(PRIVATE->si);
PRIVATE->si.cb = sizeof(STARTUPINFO); PRIVATE->si.cb = sizeof(STARTUPINFO);
// PRIVATE->si.dwFlags |= STARTF_USESTDHANDLES; // PRIVATE->si.dwFlags |= STARTF_USESTDHANDLES;
PRIVATE->si.dwFlags |= STARTF_USESHOWWINDOW; PRIVATE->si.dwFlags |= STARTF_USESHOWWINDOW;
@@ -805,7 +805,7 @@ bool PITerminal::initialize() {
PRIVATE->si.dwXCountChars = 80; PRIVATE->si.dwXCountChars = 80;
PRIVATE->si.dwYCountChars = 24; PRIVATE->si.dwYCountChars = 24;
memset(&PRIVATE->pi, 0, sizeof(PRIVATE->pi)); piZeroMemory(PRIVATE->pi);
PIString shmh = PIString::fromNumber(randomi() % 10000); PIString shmh = PIString::fromNumber(randomi() % 10000);
PIString pname = "\\\\.\\pipe\\piterm" + shmh; PIString pname = "\\\\.\\pipe\\piterm" + shmh;
@@ -857,7 +857,7 @@ bool PITerminal::initialize() {
# else # else
# ifdef HAS_FORKPTY # ifdef HAS_FORKPTY
char pty[256]; char pty[256];
memset(pty, 0, 256); piZeroMemory(pty, 256);
winsize ws; winsize ws;
ws.ws_col = dsize_x; ws.ws_col = dsize_x;
ws.ws_row = dsize_y; ws.ws_row = dsize_y;

View File

@@ -143,7 +143,7 @@ void log_callback(void * cls, const char * fmt, va_list ap) {
piCout << "log" << server; piCout << "log" << server;
if (!server) return; if (!server) return;
char buffer[1_KiB]; char buffer[1_KiB];
memset(buffer, 0, 1_KiB); piZeroMemory(buffer, 1_KiB);
std::vsnprintf(buffer, 1_KiB, fmt, ap); std::vsnprintf(buffer, 1_KiB, fmt, ap);
piCout << buffer; piCout << buffer;
} }
@@ -312,7 +312,7 @@ bool MicrohttpdServer::listen(PINetworkAddress addr) {
key_pass = opts.value(Option::HTTPSKeyPassword).toByteArray(); key_pass = opts.value(Option::HTTPSKeyPassword).toByteArray();
if (key_pass.isNotEmpty()) key_pass.append(0); if (key_pass.isNotEmpty()) key_pass.append(0);
sockaddr_in sa_addr; sockaddr_in sa_addr;
memset(&sa_addr, 0, sizeof(sa_addr)); piZeroMemory(sa_addr);
sa_addr.sin_port = htons(addr.port()); sa_addr.sin_port = htons(addr.port());
sa_addr.sin_addr.s_addr = addr.ip(); sa_addr.sin_addr.s_addr = addr.ip();
sa_addr.sin_family = AF_INET; sa_addr.sin_family = AF_INET;

View File

@@ -405,7 +405,7 @@ float PISystemMonitor::calcThreadUsage(PISystemTime & t_new, PISystemTime & t_ol
ullong PISystemMonitor::totalRAM() { ullong PISystemMonitor::totalRAM() {
#ifdef ESP_PLATFORM #ifdef ESP_PLATFORM
multi_heap_info_t heap_info; 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); heap_caps_get_info(&heap_info, MALLOC_CAP_8BIT);
return heap_info.total_allocated_bytes + heap_info.total_free_bytes; return heap_info.total_allocated_bytes + heap_info.total_free_bytes;
#endif #endif
@@ -416,7 +416,7 @@ ullong PISystemMonitor::totalRAM() {
ullong PISystemMonitor::freeRAM() { ullong PISystemMonitor::freeRAM() {
#ifdef ESP_PLATFORM #ifdef ESP_PLATFORM
multi_heap_info_t heap_info; 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); heap_caps_get_info(&heap_info, MALLOC_CAP_8BIT);
return heap_info.total_free_bytes; return heap_info.total_free_bytes;
#endif #endif
@@ -427,7 +427,7 @@ ullong PISystemMonitor::freeRAM() {
ullong PISystemMonitor::usedRAM() { ullong PISystemMonitor::usedRAM() {
#ifdef ESP_PLATFORM #ifdef ESP_PLATFORM
multi_heap_info_t heap_info; 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); heap_caps_get_info(&heap_info, MALLOC_CAP_8BIT);
return heap_info.total_allocated_bytes; return heap_info.total_allocated_bytes;
#endif #endif

View File

@@ -20,6 +20,7 @@
#include "piincludes_p.h" #include "piincludes_p.h"
#include "piliterals.h" #include "piliterals.h"
#include "piwaitevent_p.h"
#ifndef WINDOWS #ifndef WINDOWS
# include <termios.h> # include <termios.h>
#else #else
@@ -144,6 +145,7 @@ PRIVATE_DEFINITION_START(PIKbdListener)
int int
#endif #endif
ret; ret;
PIWaitEvent event;
PRIVATE_DEFINITION_END(PIKbdListener) PRIVATE_DEFINITION_END(PIKbdListener)
@@ -157,11 +159,11 @@ PIKbdListener::PIKbdListener(KBFunc slot, void * _d, bool startNow): PIThread()
#else #else
tcgetattr(0, &PRIVATE->sterm); tcgetattr(0, &PRIVATE->sterm);
#endif #endif
is_active = true; ret_func = slot;
ret_func = slot; kbddata_ = _d;
kbddata_ = _d; dbl_interval = 400;
dbl_interval = 400; PRIVATE->event.create();
PIKbdListener::exiting = exit_enabled = false; PIKbdListener::exiting = false;
if (startNow) start(); if (startNow) start();
} }
@@ -169,7 +171,7 @@ PIKbdListener::PIKbdListener(KBFunc slot, void * _d, bool startNow): PIThread()
PIKbdListener::~PIKbdListener() { PIKbdListener::~PIKbdListener() {
stop(); stop();
if (!waitForFinish(100_ms)) terminate(); if (!waitForFinish(100_ms)) terminate();
end(); PRIVATE->event.destroy();
} }
@@ -216,7 +218,8 @@ PIKbdListener::MouseButtons getButtons(DWORD v) {
void PIKbdListener::readKeyboard() { void PIKbdListener::readKeyboard() {
ke.key = 0; ke.key = 0;
ke.modifiers = 0; ke.modifiers = 0;
memset(rc, 0, 8); char rc[8];
piZeroMemory(rc, 8);
#ifdef WINDOWS #ifdef WINDOWS
INPUT_RECORD ir; INPUT_RECORD ir;
ReadConsoleInput(PRIVATE->hIn, &ir, 1, &(PRIVATE->ret)); ReadConsoleInput(PRIVATE->hIn, &ir, 1, &(PRIVATE->ret));
@@ -403,6 +406,7 @@ void PIKbdListener::readKeyboard() {
} }
#else #else
tcsetattr(0, TCSANOW, &PRIVATE->tterm); tcsetattr(0, TCSANOW, &PRIVATE->tterm);
if (!PRIVATE->event.wait(0)) return;
PRIVATE->ret = read(0, rc, 8); PRIVATE->ret = read(0, rc, 8);
/*piCout << "key" << PIString(rc).replaceAll("\e", "\\e"); /*piCout << "key" << PIString(rc).replaceAll("\e", "\\e");
for (int i = 0; i < PRIVATE->ret; ++i) for (int i = 0; i < PRIVATE->ret; ++i)
@@ -542,6 +546,13 @@ void PIKbdListener::readKeyboard() {
void PIKbdListener::stop() { void PIKbdListener::stop() {
PIThread::stop(); PIThread::stop();
PRIVATE->event.interrupt();
}
bool PIKbdListener::stopAndWait(PISystemTime timeout) {
stop();
return waitForFinish(timeout);
} }

View File

@@ -29,15 +29,11 @@
#include "pithread.h" #include "pithread.h"
#include "pitime.h" #include "pitime.h"
#define WAIT_FOR_EXIT \ #define WAIT_FOR_EXIT \
while (!PIKbdListener::exiting) \ while (!PIKbdListener::exiting) \
piMSleep(PIP_MIN_MSLEEP * 5); \ piMSleep(PIP_MIN_MSLEEP * 5); \
if (PIKbdListener::instance()) { \ if (PIKbdListener::instance()) { \
PIKbdListener::instance()->stop(); \ if (!PIKbdListener::instance()->stopAndWait(PISystemTime::fromSeconds(1))) PIKbdListener::instance()->terminate(); \
if (!PIKbdListener::instance()->waitForFinish(PISystemTime::fromMilliseconds(100))) { \
PIKbdListener::instance()->setDebug(false); \
PIKbdListener::instance()->terminate(); \
} \
} }
@@ -188,6 +184,8 @@ public:
void stop(); void stop();
bool stopAndWait(PISystemTime timeout = {});
//! Returns if keyboard listening is active (not running!) //! Returns if keyboard listening is active (not running!)
bool isActive() { return is_active; } bool isActive() { return is_active; }
@@ -258,9 +256,8 @@ private:
PRIVATE_DECLARATION(PIP_EXPORT) PRIVATE_DECLARATION(PIP_EXPORT)
KBFunc ret_func; KBFunc ret_func;
int exit_key; int exit_key;
bool exit_enabled, is_active; bool exit_enabled = false, is_active = true;
void * kbddata_; void * kbddata_;
char rc[8];
double dbl_interval; double dbl_interval;
PITimeMeasurer tm_dbl; PITimeMeasurer tm_dbl;
KeyEvent ke; KeyEvent ke;

View File

@@ -558,6 +558,23 @@ inline uint piHash(const ldouble & v) {
return piHashData((const uchar *)&v, sizeof(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<typename T>
inline void piZeroMemory(T & v) {
piZeroMemory(&v, sizeof(v));
}
//! \~\brief //! \~\brief
//! \~english Call \b delete on each "container" element. //! \~english Call \b delete on each "container" element.
//! \~russian Вызывает \b delete на каждый элемент "container". //! \~russian Вызывает \b delete на каждый элемент "container".

View File

@@ -167,7 +167,7 @@ PIInit::PIInit() {
for (l = 0; l < MAX_PATH; ++l) for (l = 0; l < MAX_PATH; ++l)
if (cpinfo.CodePageName[l] == '\0' || cpinfo.CodePageName[l] == ' ') break; if (cpinfo.CodePageName[l] == '\0' || cpinfo.CodePageName[l] == ' ') break;
__sysoemname__ = new char[256]; __sysoemname__ = new char[256];
memset(__sysoemname__, 0, 256); piZeroMemory(__sysoemname__, 256);
memcpy(__sysoemname__, "ibm-", 4); memcpy(__sysoemname__, "ibm-", 4);
memcpy(&(__sysoemname__[4]), cpinfo.CodePageName, l); memcpy(&(__sysoemname__[4]), cpinfo.CodePageName, l);
# else # else
@@ -190,7 +190,7 @@ PIInit::PIInit() {
host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &__pi_mac_clock); host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &__pi_mac_clock);
# endif # endif
char cbuff[1024]; char cbuff[1024];
memset(cbuff, 0, 1024); piZeroMemory(cbuff, 1024);
if (gethostname(cbuff, 1023) == 0) { if (gethostname(cbuff, 1023) == 0) {
sinfo->hostname = cbuff; sinfo->hostname = cbuff;
} }
@@ -210,7 +210,7 @@ PIInit::PIInit() {
wchar_t ** argv_ = CommandLineToArgvW(GetCommandLineW(), &argc_); wchar_t ** argv_ = CommandLineToArgvW(GetCommandLineW(), &argc_);
if (argc_ > 0 && argv_ != 0) sinfo->execCommand = argv_[0]; if (argc_ > 0 && argv_ != 0) sinfo->execCommand = argv_[0];
LocalFree(argv_); LocalFree(argv_);
memset(cbuff, 0, 1024); piZeroMemory(cbuff, 1024);
ulong unlen = 1023; ulong unlen = 1023;
if (GetUserNameA(cbuff, &unlen) != 0) sinfo->user = cbuff; if (GetUserNameA(cbuff, &unlen) != 0) sinfo->user = cbuff;
# else // WINDOWS # else // WINDOWS
@@ -219,7 +219,7 @@ PIInit::PIInit() {
if (ps) if (ps)
sinfo->user = ps->pw_name; sinfo->user = ps->pw_name;
else { else {
memset(cbuff, 0, 1024); piZeroMemory(cbuff, 1024);
char * l = getlogin(); char * l = getlogin();
if (l) sinfo->user = l; if (l) sinfo->user = l;
} }

View File

@@ -46,7 +46,7 @@ void PIWaitEvent::create() {
} }
#else #else
for (int i = 0; i < 3; ++i) for (int i = 0; i < 3; ++i)
memset(&(fds[i]), 0, sizeof(fds[i])); piZeroMemory(fds[i]);
if (::pipe(pipe_fd) < 0) { if (::pipe(pipe_fd) < 0) {
piCout << "Error with pipe:" << errorString(); piCout << "Error with pipe:" << errorString();
} else { } else {

View File

@@ -326,7 +326,7 @@ PIVector<PIFile::FileInfo> PIDir::entries() {
} }
} else { } else {
WIN32_FIND_DATAA fd; WIN32_FIND_DATAA fd;
memset(&fd, 0, sizeof(fd)); piZeroMemory(fd);
p += "\\*"; p += "\\*";
void * hf = FindFirstFileA((LPCSTR)(p.data()), &fd); void * hf = FindFirstFileA((LPCSTR)(p.data()), &fd);
if (!hf) return l; if (!hf) return l;
@@ -335,7 +335,7 @@ PIVector<PIFile::FileInfo> PIDir::entries() {
PIString fn(fd.cFileName); PIString fn(fd.cFileName);
if (fn == "..") hdd = true; if (fn == "..") hdd = true;
l << PIFile::fileInfo(dp + fn); l << PIFile::fileInfo(dp + fn);
memset(&fd, 0, sizeof(fd)); piZeroMemory(fd);
} while (FindNextFileA(hf, &fd) != 0); } while (FindNextFileA(hf, &fd) != 0);
FindClose(hf); FindClose(hf);
l.sort(sort_compare); l.sort(sort_compare);
@@ -440,7 +440,7 @@ PIDir PIDir::current() {
char rc[1024]; char rc[1024];
#endif #endif
#ifdef WINDOWS #ifdef WINDOWS
memset(rc, 0, 1024); piZeroMemory(rc, 1024);
if (GetCurrentDirectory(1024, (LPTSTR)rc) == 0) return PIString(); if (GetCurrentDirectory(1024, (LPTSTR)rc) == 0) return PIString();
PIString ret(rc); PIString ret(rc);
ret.replaceAll("\\", PIDir::separator); ret.replaceAll("\\", PIDir::separator);
@@ -463,13 +463,13 @@ PIDir PIDir::home() {
#endif #endif
#ifdef WINDOWS #ifdef WINDOWS
rc = new char[1024]; rc = new char[1024];
memset(rc, 0, 1024); piZeroMemory(rc, 1024);
if (ExpandEnvironmentStrings((LPCTSTR) "%HOMEPATH%", (LPTSTR)rc, 1024) == 0) { if (ExpandEnvironmentStrings((LPCTSTR) "%HOMEPATH%", (LPTSTR)rc, 1024) == 0) {
delete[] rc; delete[] rc;
return PIDir(); return PIDir();
} }
PIString hp(rc); PIString hp(rc);
memset(rc, 0, 1024); piZeroMemory(rc, 1024);
if (ExpandEnvironmentStrings((LPCTSTR) "%HOMEDRIVE%", (LPTSTR)rc, 1024) == 0) { if (ExpandEnvironmentStrings((LPCTSTR) "%HOMEDRIVE%", (LPTSTR)rc, 1024) == 0) {
delete[] rc; delete[] rc;
return PIDir(); return PIDir();
@@ -495,7 +495,7 @@ PIDir PIDir::temporary() {
char * rc = nullptr; char * rc = nullptr;
#ifdef WINDOWS #ifdef WINDOWS
rc = new char[1024]; rc = new char[1024];
memset(rc, 0, 1024); piZeroMemory(rc, 1024);
int ret = GetTempPath(1024, (LPTSTR)rc); int ret = GetTempPath(1024, (LPTSTR)rc);
if (ret == 0) { if (ret == 0) {
delete[] rc; delete[] rc;

View File

@@ -272,7 +272,7 @@ bool PIEthernet::openDevice() {
// if (type() == TCP_Client) // if (type() == TCP_Client)
// connecting_ = true; // connecting_ = true;
if (type() != UDP || mode() == PIIODevice::WriteOnly) return 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_family = AF_INET;
PRIVATE->addr_.sin_port = htons(addr_r.port()); PRIVATE->addr_.sin_port = htons(addr_r.port());
if (params[PIEthernet::Broadcast]) if (params[PIEthernet::Broadcast])
@@ -377,7 +377,7 @@ bool PIEthernet::joinMulticastGroup(const PIString & group) {
#else #else
struct ip_mreq mreq; struct ip_mreq mreq;
#endif #endif
memset(&mreq, 0, sizeof(mreq)); piZeroMemory(mreq);
#ifdef LINUX #ifdef LINUX
// mreq.imr_address.s_addr = INADDR_ANY; // mreq.imr_address.s_addr = INADDR_ANY;
/*PIEthernet::InterfaceList il = interfaces(); /*PIEthernet::InterfaceList il = interfaces();
@@ -423,7 +423,7 @@ bool PIEthernet::leaveMulticastGroup(const PIString & group) {
#else #else
struct ip_mreq mreq; struct ip_mreq mreq;
#endif #endif
memset(&mreq, 0, sizeof(mreq)); piZeroMemory(mreq);
if (params[PIEthernet::Broadcast]) if (params[PIEthernet::Broadcast])
#ifndef LWIP #ifndef LWIP
mreq.imr_address.s_addr = INADDR_ANY; mreq.imr_address.s_addr = INADDR_ANY;
@@ -454,7 +454,7 @@ bool PIEthernet::connect(bool threaded) {
if (connected_) return false; if (connected_) return false;
if (sock == -1) init(); if (sock == -1) init();
if (sock == -1) return false; if (sock == -1) return false;
memset(&PRIVATE->addr_, 0, sizeof(PRIVATE->addr_)); piZeroMemory(PRIVATE->addr_);
addr_r.set(path()); addr_r.set(path());
PRIVATE->addr_.sin_port = htons(addr_r.port()); PRIVATE->addr_.sin_port = htons(addr_r.port());
PRIVATE->addr_.sin_addr.s_addr = addr_r.ip(); PRIVATE->addr_.sin_addr.s_addr = addr_r.ip();
@@ -492,7 +492,7 @@ bool PIEthernet::listen(bool threaded) {
} }
listen_threaded = server_bounded = false; listen_threaded = server_bounded = false;
addr_r.set(path()); 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_port = htons(addr_r.port());
PRIVATE->addr_.sin_addr.s_addr = addr_r.ip(); PRIVATE->addr_.sin_addr.s_addr = addr_r.ip();
PRIVATE->addr_.sin_family = AF_INET; PRIVATE->addr_.sin_family = AF_INET;
@@ -618,7 +618,7 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) {
case TCP_Client: case TCP_Client:
if (connecting_) { if (connecting_) {
addr_r.set(path()); 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_port = htons(addr_r.port());
PRIVATE->addr_.sin_addr.s_addr = addr_r.ip(); PRIVATE->addr_.sin_addr.s_addr = addr_r.ip();
PRIVATE->addr_.sin_family = AF_INET; 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); if (rs > 0) received(read_to, rs);
return rs; return rs;
case UDP: { case UDP: {
memset(&PRIVATE->raddr_, 0, sizeof(PRIVATE->raddr_)); piZeroMemory(PRIVATE->raddr_);
// piCoutObj << "read from" << path() << "..."; // piCoutObj << "read from" << path() << "...";
#ifdef WINDOWS #ifdef WINDOWS
long wr = waitForEvent(PRIVATE->event, FD_READ | FD_CLOSE); 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"; // piCout << "[PIEth] write to" << ip_s << ":" << port_s << "ok";
case TCP_Client: { case TCP_Client: {
if (connecting_) { if (connecting_) {
memset(&PRIVATE->addr_, 0, sizeof(PRIVATE->addr_)); piZeroMemory(PRIVATE->addr_);
addr_r.set(path()); addr_r.set(path());
PRIVATE->addr_.sin_port = htons(addr_r.port()); PRIVATE->addr_.sin_port = htons(addr_r.port());
PRIVATE->addr_.sin_addr.s_addr = addr_r.ip(); 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); // DWORD wr = WSAWaitForMultipleEvents(1, &(PRIVATE->read_event), FALSE, WSA_INFINITE, TRUE);
// if (wr == WSA_WAIT_EVENT_0) { // if (wr == WSA_WAIT_EVENT_0) {
WSANETWORKEVENTS events; WSANETWORKEVENTS events;
memset(&events, 0, sizeof(events)); piZeroMemory(events);
WSAEnumNetworkEvents(sock, event.getEvent(), &events); WSAEnumNetworkEvents(sock, event.getEvent(), &events);
// piCoutObj << "wait result" << events.lNetworkEvents; // piCoutObj << "wait result" << events.lNetworkEvents;
return events.lNetworkEvents; return events.lNetworkEvents;
@@ -1245,7 +1245,7 @@ PINetworkAddress PIEthernet::interfaceAddress(const PIString & interface_) {
return PINetworkAddress(); return PINetworkAddress();
#else #else
struct ifreq ifr; struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr)); piZeroMemory(ifr);
strcpy(ifr.ifr_name, interface_.dataAscii()); strcpy(ifr.ifr_name, interface_.dataAscii());
int s = ::socket(AF_INET, SOCK_DGRAM, 0); int s = ::socket(AF_INET, SOCK_DGRAM, 0);
ioctl(s, SIOCGIFADDR, &ifr); ioctl(s, SIOCGIFADDR, &ifr);

View File

@@ -492,7 +492,7 @@ PIFile::FileInfo PIFile::fileInfo(const PIString & path) {
} }
if (!hFile) return ret; if (!hFile) return ret;
BY_HANDLE_FILE_INFORMATION fi; BY_HANDLE_FILE_INFORMATION fi;
memset(&fi, 0, sizeof(fi)); piZeroMemory(fi);
if (GetFileInformationByHandle(hFile, &fi) != 0) { if (GetFileInformationByHandle(hFile, &fi) != 0) {
LARGE_INTEGER filesize; LARGE_INTEGER filesize;
filesize.LowPart = filesize.HighPart = 0; filesize.LowPart = filesize.HighPart = 0;
@@ -515,7 +515,7 @@ PIFile::FileInfo PIFile::fileInfo(const PIString & path) {
CloseHandle(hFile); CloseHandle(hFile);
#else #else
_stat_struct_ fs; _stat_struct_ fs;
memset(&fs, 0, sizeof(fs)); piZeroMemory(fs);
_stat_call_(path.data(), &fs); _stat_call_(path.data(), &fs);
int mode = fs.st_mode; int mode = fs.st_mode;
ret.size = fs.st_size; 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_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_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); 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); _stat_link_(path.data(), &fs);
mode &= ~S_IFLNK; mode &= ~S_IFLNK;
mode |= S_IFLNK & fs.st_mode; mode |= S_IFLNK & fs.st_mode;

View File

@@ -877,7 +877,7 @@ ssize_t PISerial::readDevice(void * read_to, ssize_t max_size) {
close(); close();
return 0; return 0;
} }
memset(&(PRIVATE->overlap), 0, sizeof(PRIVATE->overlap)); piZeroMemory(PRIVATE->overlap);
PRIVATE->overlap.hEvent = PRIVATE->event.getEvent(); PRIVATE->overlap.hEvent = PRIVATE->event.getEvent();
PRIVATE->readed = 0; PRIVATE->readed = 0;
ReadFile(PRIVATE->hCom, read_to, max_size, NULL, &(PRIVATE->overlap)); 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); DWORD wrote(0);
// piCoutObj << "send ..." << max_size;// << ": " << PIString((char*)data, max_size); // piCoutObj << "send ..." << max_size;// << ": " << PIString((char*)data, max_size);
sending = true; sending = true;
memset(&(PRIVATE->overlap_write), 0, sizeof(PRIVATE->overlap_write)); piZeroMemory(PRIVATE->overlap_write);
PRIVATE->overlap_write.hEvent = PRIVATE->event_write.getEvent(); PRIVATE->overlap_write.hEvent = PRIVATE->event_write.getEvent();
WriteFile(PRIVATE->hCom, data, max_size, NULL, &(PRIVATE->overlap_write)); WriteFile(PRIVATE->hCom, data, max_size, NULL, &(PRIVATE->overlap_write));
if (PRIVATE->event_write.wait()) { if (PRIVATE->event_write.wait()) {
@@ -1160,7 +1160,7 @@ PIVector<PISerial::DeviceInfo> PISerial::availableDevicesInfo(bool test) {
const HDEVINFO dis = SetupDiGetClassDevs(&(guids[i]), NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); const HDEVINFO dis = SetupDiGetClassDevs(&(guids[i]), NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (dis == INVALID_HANDLE_VALUE) continue; if (dis == INVALID_HANDLE_VALUE) continue;
SP_DEVINFO_DATA did; SP_DEVINFO_DATA did;
memset(&did, 0, sizeof(did)); piZeroMemory(did);
did.cbSize = sizeof(did); did.cbSize = sizeof(did);
DWORD index = 0; DWORD index = 0;
while (SetupDiEnumDeviceInfo(dis, index++, &did)) { while (SetupDiEnumDeviceInfo(dis, index++, &did)) {

View File

@@ -177,7 +177,7 @@ void PIProcess::startProc(bool detached) {
# endif # endif
# ifdef WINDOWS # ifdef WINDOWS
GetStartupInfoA(&(PRIVATE->si)); GetStartupInfoA(&(PRIVATE->si));
memset(&(PRIVATE->pi), 0, sizeof(PRIVATE->pi)); piZeroMemory(PRIVATE->pi);
if (CreateProcessA(0, // No module name (use command line) if (CreateProcessA(0, // No module name (use command line)
a, // Command line a, // Command line
0, // Process handle not inheritable 0, // Process handle not inheritable

View File

@@ -54,7 +54,7 @@ PIStringList PISystemInfo::mountRoots() {
# ifdef LINUX # ifdef LINUX
PIString s_df, s_m; PIString s_df, s_m;
char in[1024]; char in[1024];
memset(in, 0, 1024); piZeroMemory(in, 1024);
FILE * fp = popen("mount -l", "r"); FILE * fp = popen("mount -l", "r");
PIStringList tl; PIStringList tl;
if (fp) { if (fp) {
@@ -129,7 +129,7 @@ PIVector<PISystemInfo::MountInfo> PISystemInfo::mountInfo(bool ignore_cache) {
#ifdef LINUX #ifdef LINUX
PIString s_df, s_m; PIString s_df, s_m;
char in[1024]; char in[1024];
memset(in, 0, 1024); piZeroMemory(in, 1024);
// piCout << "mountInfo 0"; // piCout << "mountInfo 0";
FILE * fp = popen("df -B1", "r"); FILE * fp = popen("df -B1", "r");
PIStringList l_df; PIStringList l_df;
@@ -141,7 +141,7 @@ PIVector<PISystemInfo::MountInfo> PISystemInfo::mountInfo(bool ignore_cache) {
fp = 0; fp = 0;
} }
// piCout << "mountInfo 1"; // piCout << "mountInfo 1";
memset(in, 0, 1024); piZeroMemory(in, 1024);
fp = popen("mount -l", "r"); fp = popen("mount -l", "r");
PIStringList tl; PIStringList tl;
if (fp) { if (fp) {

View File

@@ -73,7 +73,7 @@ ushort charFromCodepage(const char * c, int size, const char * codepage, int * t
return buffer; return buffer;
# else # else
mbstate_t state; mbstate_t state;
memset(&state, 0, sizeof(state)); piZeroMemory(state);
wchar_t wc; wchar_t wc;
ret = mbrtowc(&wc, c, size, &state); ret = mbrtowc(&wc, c, size, &state);
// printf("mbtowc = %d\n", ret); // printf("mbtowc = %d\n", ret);
@@ -369,7 +369,7 @@ PICout operator<<(PICout s, const PIChar & v) {
UConverter * cc = ucnv_open(__syslocname__, &e); UConverter * cc = ucnv_open(__syslocname__, &e);
if (cc) { if (cc) {
char uc[8]; char uc[8];
memset(uc, 0, 8); piZeroMemory(uc, 8);
e = (UErrorCode)0; e = (UErrorCode)0;
ucnv_fromUChars(cc, uc, 8, (const UChar *)(&v.ch), 1, &e); ucnv_fromUChars(cc, uc, 8, (const UChar *)(&v.ch), 1, &e);
ucnv_close(cc); ucnv_close(cc);

View File

@@ -178,7 +178,7 @@ T toDecimal(const PIString & s) {
#define pisprintf(f, v) \ #define pisprintf(f, v) \
char ch[256]; \ char ch[256]; \
memset(ch, 0, 256); \ piZeroMemory(ch, 256); \
snprintf(ch, 256, f, v); \ snprintf(ch, 256, f, v); \
return PIStringAscii(ch); return PIStringAscii(ch);

View File

@@ -58,7 +58,7 @@ PIConditionVariable::PIConditionVariable() {
# if !defined(MAC_OS) # if !defined(MAC_OS)
pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC); pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC);
# endif # endif
memset(&(PRIVATE->nativeHandle), 0, sizeof(PRIVATE->nativeHandle)); piZeroMemory(PRIVATE->nativeHandle);
pthread_cond_init(&PRIVATE->nativeHandle, &condattr); pthread_cond_init(&PRIVATE->nativeHandle, &condattr);
#endif #endif
} }

View File

@@ -209,10 +209,10 @@ void PIMutex::init() {
PRIVATE->mutex = xSemaphoreCreateMutex(); PRIVATE->mutex = xSemaphoreCreateMutex();
#else #else
pthread_mutexattr_t attr; pthread_mutexattr_t attr;
memset(&attr, 0, sizeof(attr)); piZeroMemory(attr);
pthread_mutexattr_init(&attr); pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
memset(&(PRIVATE->mutex), 0, sizeof(PRIVATE->mutex)); piZeroMemory(PRIVATE->mutex);
pthread_mutex_init(&(PRIVATE->mutex), &attr); pthread_mutex_init(&(PRIVATE->mutex), &attr);
pthread_mutexattr_destroy(&attr); pthread_mutexattr_destroy(&attr);
#endif #endif

View File

@@ -651,9 +651,9 @@ bool PIThread::startOnce(std::function<void()> func) {
} }
void PIThread::stopAndWait(PISystemTime timeout) { bool PIThread::stopAndWait(PISystemTime timeout) {
stop(); stop();
waitForFinish(timeout); return waitForFinish(timeout);
} }
@@ -791,7 +791,7 @@ void PIThread::setPriority(PIThread::Priority prior) {
# ifndef WINDOWS # ifndef WINDOWS
// PICout(PICoutManipulators::DefaultControls) << "setPriority" << PRIVATE->thread; // PICout(PICoutManipulators::DefaultControls) << "setPriority" << PRIVATE->thread;
int policy_ = 0; int policy_ = 0;
memset(&(PRIVATE->sparam), 0, sizeof(PRIVATE->sparam)); piZeroMemory(PRIVATE->sparam);
pthread_getschedparam(PRIVATE->thread, &policy_, &(PRIVATE->sparam)); pthread_getschedparam(PRIVATE->thread, &policy_, &(PRIVATE->sparam));
PRIVATE->sparam. PRIVATE->sparam.
# ifndef LINUX # ifndef LINUX

View File

@@ -143,15 +143,13 @@ public:
EVENT_HANDLER0(void, stop); EVENT_HANDLER0(void, stop);
EVENT_HANDLER0(void, terminate); EVENT_HANDLER0(void, terminate);
//! \~english Stop thread and wait for finish. bool stopAndWait(int timeout_ms) DEPRECATEDM("use stopAndWait(PISystemTime)") {
//! \~russian Останавливает поток и ожидает завершения. return stopAndWait(PISystemTime::fromMilliseconds(timeout_ms));
void stopAndWait(int timeout_ms) DEPRECATEDM("use waitForStart(PISystemTime)") {
stopAndWait(PISystemTime::fromMilliseconds(timeout_ms));
} }
//! \~english Stop thread and wait for finish. //! \~english Stop thread and wait for finish. Returns \b false if timeout expired.
//! \~russian Останавливает поток и ожидает завершения. //! \~russian Останавливает поток и ожидает завершения. Возвращает \b false если таймаут истек.
void stopAndWait(PISystemTime timeout = {}); bool stopAndWait(PISystemTime timeout = {});
//! \~english Set common data passed to external function //! \~english Set common data passed to external function
//! \~russian Устанавливает данные, передаваемые в функцию потока //! \~russian Устанавливает данные, передаваемые в функцию потока
@@ -194,8 +192,8 @@ public:
return waitForStart(PISystemTime::fromMilliseconds(timeout_msecs)); return waitForStart(PISystemTime::fromMilliseconds(timeout_msecs));
} }
//! \~english Wait for thread finish //! \~english Wait for thread finish. Returns \b false if timeout expired.
//! \~russian Ожидает завершения потока //! \~russian Ожидает завершения потока. Возвращает \b false если таймаут истек.
bool waitForFinish(PISystemTime timeout = {}); bool waitForFinish(PISystemTime timeout = {});
bool waitForFinish(int timeout_msecs) DEPRECATEDM("use waitForFinish(PISystemTime)") { bool waitForFinish(int timeout_msecs) DEPRECATEDM("use waitForFinish(PISystemTime)") {
return waitForFinish(PISystemTime::fromMilliseconds(timeout_msecs)); return waitForFinish(PISystemTime::fromMilliseconds(timeout_msecs));

View File

@@ -324,7 +324,7 @@ PIString PIDateTime::toString(const PIString & format) const {
time_t PIDateTime::toSecondSinceEpoch() const { time_t PIDateTime::toSecondSinceEpoch() const {
tm pt; tm pt;
memset(&pt, 0, sizeof(pt)); piZeroMemory(pt);
pt.tm_sec = seconds; pt.tm_sec = seconds;
pt.tm_min = minutes; pt.tm_min = minutes;
pt.tm_hour = hours; pt.tm_hour = hours;

View File

@@ -54,6 +54,14 @@ inline void piSleep(double secs) {
piUSleep(int(secs * 1000000.)); piUSleep(int(secs * 1000000.));
} // on !Windows consider constant "usleep" offset } // 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 //! \ingroup Types
//! \~english Shortest available on current system sleep //! \~english Shortest available on current system sleep
//! \~russian Наименее возможное для данной системы по длительности ожидание //! \~russian Наименее возможное для данной системы по длительности ожидание

View File

@@ -548,7 +548,7 @@ void PIOpenCL::Kernel::zero() {
bool PIOpenCL::Kernel::init() { bool PIOpenCL::Kernel::init() {
char kname[1024]; char kname[1024];
memset(kname, 0, 1024); piZeroMemory(kname, 1024);
cl_int ret = 0; cl_int ret = 0;
ret = clGetKernelInfo(PRIVATE->kernel, CL_KERNEL_FUNCTION_NAME, 1024, kname, 0); ret = clGetKernelInfo(PRIVATE->kernel, CL_KERNEL_FUNCTION_NAME, 1024, kname, 0);
if (ret != 0) { if (ret != 0) {
@@ -655,14 +655,14 @@ void PIOpenCL::KernelArg::init(void * _k, uint index) {
cl_kernel k = (cl_kernel)_k; cl_kernel k = (cl_kernel)_k;
cl_int ret = 0; cl_int ret = 0;
char nm[1024]; char nm[1024];
memset(nm, 0, 1024); piZeroMemory(nm, 1024);
ret = clGetKernelArgInfo(k, index, CL_KERNEL_ARG_TYPE_NAME, 1024, nm, 0); ret = clGetKernelArgInfo(k, index, CL_KERNEL_ARG_TYPE_NAME, 1024, nm, 0);
if (ret != 0) { if (ret != 0) {
piCout << "[PIOpenCL::Kernel]" piCout << "[PIOpenCL::Kernel]"
<< "clGetKernelArgInfo(CL_KERNEL_ARG_TYPE_NAME) error" << ret; << "clGetKernelArgInfo(CL_KERNEL_ARG_TYPE_NAME) error" << ret;
} }
type_name = nm; type_name = nm;
memset(nm, 0, 1024); piZeroMemory(nm, 1024);
ret = clGetKernelArgInfo(k, index, CL_KERNEL_ARG_NAME, 1024, nm, 0); ret = clGetKernelArgInfo(k, index, CL_KERNEL_ARG_NAME, 1024, nm, 0);
if (ret != 0) { if (ret != 0) {
piCout << "[PIOpenCL::Kernel]" piCout << "[PIOpenCL::Kernel]"

View File

@@ -206,7 +206,7 @@ PIString execute(const PIString & cmd) {
if (fp) { if (fp) {
const int sz = 256; const int sz = 256;
char in[sz]; char in[sz];
memset(in, 0, sz); piZeroMemory(in, sz);
while (true) { while (true) {
int r = fread(in, 1, sz, fp); int r = fread(in, 1, sz, fp);
if (r <= 0) break; if (r <= 0) break;

View File

@@ -125,7 +125,7 @@ void readConsole(int x, int y, int w, int h) {
bs.X = w; bs.X = w;
bs.Y = h; bs.Y = h;
bc.X = bc.Y = 0; 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)); ReadConsoleOutput(console, chars, bs, bc, &(sbi.srWindow));
for (int i = 0; i < h; ++i) for (int i = 0; i < h; ++i)
for (int j = 0; j < w; ++j) for (int j = 0; j < w; ++j)
@@ -249,9 +249,9 @@ int main(int argc, char * argv[]) {
// piCout << "start"; // piCout << "start";
STARTUPINFOA si; STARTUPINFOA si;
PROCESS_INFORMATION pi; PROCESS_INFORMATION pi;
memset(&si, 0, sizeof(si)); piZeroMemory(si);
memset(&pi, 0, sizeof(pi)); piZeroMemory(pi);
memset(&sbi, 0, sizeof(sbi)); piZeroMemory(sbi);
PIString shmh, pname; PIString shmh, pname;
if (argc > 1) shmh = argv[1]; if (argc > 1) shmh = argv[1];
if (argc > 2) pname = argv[2]; if (argc > 2) pname = argv[2];

View File

@@ -421,11 +421,12 @@ int main(int argc, char * argv[]) {
if (sapp) CONNECTU(sapp, messageReceived, menu, messageFromApp); if (sapp) CONNECTU(sapp, messageReceived, menu, messageFromApp);
if (cli.hasArgument("silent")) { if (cli.hasArgument("silent")) {
PICout::setOutputDevices(PICout::Console); PICout::setOutputDevices(PICout::Console);
PIKbdListener ls; PIKbdListener ls(0, 0, false);
ls.enableExitCapture(PIKbdListener::F10); ls.enableExitCapture(PIKbdListener::F10);
ls.start(); ls.start();
WAIT_FOR_EXIT while (!PIKbdListener::exiting)
ls.stopAndWait(); piMSleep(PIP_MIN_MSLEEP * 5);
if (!ls.stopAndWait(1_s)) ls.terminate();
} else { } else {
screen->start(); screen->start();
screen->waitForFinish(); screen->waitForFinish();