From 6f5c864e9f696483013e1559c3c392bf147bebd3 Mon Sep 17 00:00:00 2001 From: andrey Date: Fri, 17 Jul 2020 11:14:11 +0300 Subject: [PATCH] PIMutex as std::mutex --- lib/main/core/piincludes.h | 5 +- lib/main/introspection/piintrospection_base.h | 2 +- lib/main/io_devices/pipeer.h | 10 +- lib/main/thread/pimutex.cpp | 172 +++++----- lib/main/thread/pimutex.h | 58 ++-- main.cpp | 300 +----------------- utils/system_daemon/main.cpp | 15 +- 7 files changed, 130 insertions(+), 432 deletions(-) diff --git a/lib/main/core/piincludes.h b/lib/main/core/piincludes.h index 14a45a27..3f40293f 100644 --- a/lib/main/core/piincludes.h +++ b/lib/main/core/piincludes.h @@ -26,9 +26,12 @@ #ifdef PIP_STD_IOSTREAM # include #endif +#include +#include +typedef std::mutex PIMutex; class PIObject; -class PIMutex; +//class PIMutex; class PIString; class PIByteArray; class PIInit; diff --git a/lib/main/introspection/piintrospection_base.h b/lib/main/introspection/piintrospection_base.h index 6b86771d..e838f722 100644 --- a/lib/main/introspection/piintrospection_base.h +++ b/lib/main/introspection/piintrospection_base.h @@ -23,7 +23,7 @@ #include "pibase.h" class PIString; -class PIMutex; +//class PIMutex; class PIThread; class PITimer; class PIPeer; diff --git a/lib/main/io_devices/pipeer.h b/lib/main/io_devices/pipeer.h index c142b81b..155d6055 100644 --- a/lib/main/io_devices/pipeer.h +++ b/lib/main/io_devices/pipeer.h @@ -120,11 +120,11 @@ public: EVENT1(peerConnectedEvent, const PIString &, name) EVENT1(peerDisconnectedEvent, const PIString &, name) - bool lockedEth() const {return eth_mutex.isLocked();} - bool lockedPeers() const {return peers_mutex.isLocked();} - bool lockedMBcasts() const {return mc_mutex.isLocked();} - bool lockedSends() const {return send_mutex.isLocked();} - bool lockedMCSends() const {return send_mc_mutex.isLocked();} +// bool lockedEth() const {return eth_mutex.isLocked();} +// bool lockedPeers() const {return peers_mutex.isLocked();} +// bool lockedMBcasts() const {return mc_mutex.isLocked();} +// bool lockedSends() const {return send_mutex.isLocked();} +// bool lockedMCSends() const {return send_mc_mutex.isLocked();} protected: virtual void dataReceived(const PIString & from, const PIByteArray & data) {;} diff --git a/lib/main/thread/pimutex.cpp b/lib/main/thread/pimutex.cpp index efdf9918..1180d338 100644 --- a/lib/main/thread/pimutex.cpp +++ b/lib/main/thread/pimutex.cpp @@ -34,110 +34,100 @@ * * */ -#include "pimutex.h" -#include "piincludes_p.h" -#ifdef BLACKBERRY -# include -#endif +//#include "pimutex.h" +//#include "piincludes_p.h" +//#ifdef BLACKBERRY +//# include +//#endif -PRIVATE_DEFINITION_START(PIMutex) -#ifdef WINDOWS - HANDLE -#else - pthread_mutex_t -#endif - mutex; -PRIVATE_DEFINITION_END(PIMutex) +//PRIVATE_DEFINITION_START(PIMutex) +//#ifdef WINDOWS +// HANDLE +//#else +// pthread_mutex_t +//#endif +// mutex; +//PRIVATE_DEFINITION_END(PIMutex) -PIMutex::PIMutex(): inited_(false) { - //printf("new Mutex %p\n", this); -#ifdef WINDOWS - PRIVATE->mutex = 0; -#endif - init(); -} +//PIMutex::PIMutex(): inited_(false) { +// //printf("new Mutex %p\n", this); +//#ifdef WINDOWS +// PRIVATE->mutex = 0; +//#endif +// init(); +//} -PIMutex::~PIMutex() { - //printf("del Mutex %p\n", this); - destroy(); -} +//PIMutex::~PIMutex() { +// //printf("del Mutex %p\n", this); +// destroy(); +//} -void PIMutex::lock() { -#ifdef WINDOWS -// std::cout << (ullong)PRIVATE->mutex << "locking..." << std::endl; -// DWORD wr = - WaitForSingleObject(PRIVATE->mutex, INFINITE); -// std::cout << (ullong)PRIVATE->mutex << " lock wr=" << wr << std::endl; -#else - pthread_mutex_lock(&(PRIVATE->mutex)); -#endif - locked = true; -} +//void PIMutex::lock() { +//#ifdef WINDOWS +//// std::cout << (ullong)PRIVATE->mutex << "locking..." << std::endl; +//// DWORD wr = +// WaitForSingleObject(PRIVATE->mutex, INFINITE); +//// std::cout << (ullong)PRIVATE->mutex << " lock wr=" << wr << std::endl; +//#else +// pthread_mutex_lock(&(PRIVATE->mutex)); +//#endif +//} -void PIMutex::unlock() { -#ifdef WINDOWS -// BOOL wr = -// ReleaseMutex(PRIVATE->mutex); - SetEvent(PRIVATE->mutex); -// std::cout << (ullong)PRIVATE->mutex << " unlock wr=" << wr << std::endl; -#else - pthread_mutex_unlock(&(PRIVATE->mutex)); -#endif - locked = false; -} +//void PIMutex::unlock() { +//#ifdef WINDOWS +//// BOOL wr = +//// ReleaseMutex(PRIVATE->mutex); +// SetEvent(PRIVATE->mutex); +//// std::cout << (ullong)PRIVATE->mutex << " unlock wr=" << wr << std::endl; +//#else +// pthread_mutex_unlock(&(PRIVATE->mutex)); +//#endif +//} -bool PIMutex::tryLock() { - bool ret = -#ifdef WINDOWS - (WaitForSingleObject(PRIVATE->mutex, 0) == WAIT_OBJECT_0); -#else - (pthread_mutex_trylock(&(PRIVATE->mutex)) == 0); -#endif - locked = true; - return ret; -} +//bool PIMutex::tryLock() { +// bool ret = +//#ifdef WINDOWS +// (WaitForSingleObject(PRIVATE->mutex, 0) == WAIT_OBJECT_0); +//#else +// (pthread_mutex_trylock(&(PRIVATE->mutex)) == 0); +//#endif +// return ret; +//} -bool PIMutex::isLocked() const { -// std::cout << "test " << (ullong)PRIVATE->mutex << std::endl; - return locked; -} +//void PIMutex::init() { +// if (inited_) destroy(); +//#ifdef WINDOWS +// PRIVATE->mutex = CreateEvent(NULL, FALSE, TRUE, NULL); +//// std::cout << "create " << (ullong)PRIVATE->mutex << std::endl; +//#else +// pthread_mutexattr_t attr; +// memset(&attr, 0, sizeof(attr)); +// pthread_mutexattr_init(&attr); +// pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL); +// memset(&(PRIVATE->mutex), 0, sizeof(PRIVATE->mutex)); +// pthread_mutex_init(&(PRIVATE->mutex), &attr); +// pthread_mutexattr_destroy(&attr); +//#endif +// inited_ = true; +//} -void PIMutex::init() { - if (inited_) destroy(); -#ifdef WINDOWS - PRIVATE->mutex = CreateEvent(NULL, FALSE, TRUE, NULL); -// std::cout << "create " << (ullong)PRIVATE->mutex << std::endl; -#else - pthread_mutexattr_t attr; - memset(&attr, 0, sizeof(attr)); - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL); - memset(&(PRIVATE->mutex), 0, sizeof(PRIVATE->mutex)); - pthread_mutex_init(&(PRIVATE->mutex), &attr); - pthread_mutexattr_destroy(&attr); -#endif - locked = false; - inited_ = true; -} - - -void PIMutex::destroy() { - if (inited_) { -#ifdef WINDOWS -// std::cout << "destroy " << (ullong)PRIVATE->mutex << std::endl; - if (PRIVATE->mutex) CloseHandle(PRIVATE->mutex); - PRIVATE->mutex = 0; -#else - pthread_mutex_destroy(&(PRIVATE->mutex)); -#endif - } - locked = inited_ = false; -} +//void PIMutex::destroy() { +// if (inited_) { +//#ifdef WINDOWS +//// std::cout << "destroy " << (ullong)PRIVATE->mutex << std::endl; +// if (PRIVATE->mutex) CloseHandle(PRIVATE->mutex); +// PRIVATE->mutex = 0; +//#else +// pthread_mutex_destroy(&(PRIVATE->mutex)); +//#endif +// } +// inited_ = false; +//} diff --git a/lib/main/thread/pimutex.h b/lib/main/thread/pimutex.h index ac4277e5..24ce7868 100644 --- a/lib/main/thread/pimutex.h +++ b/lib/main/thread/pimutex.h @@ -25,42 +25,42 @@ #include "piinit.h" -class PIP_EXPORT PIMutex -{ -public: - //! Constructs unlocked mutex - explicit PIMutex(); + +//class PIP_EXPORT PIMutex +//{ +//public: +// //! Constructs unlocked mutex +// explicit PIMutex(); - //! Destroy mutex - ~PIMutex(); +// //! Destroy mutex +// ~PIMutex(); - //! \brief Lock mutex - //! \details If mutex is unlocked it set to locked state and returns immediate. - //! If mutex is already locked function blocks until mutex will be unlocked - void lock(); +// //! \brief Lock mutex +// //! \details If mutex is unlocked it set to locked state and returns immediate. +// //! If mutex is already locked function blocks until mutex will be unlocked +// void lock(); - //! \brief Unlock mutex - //! \details In any case this function returns immediate - void unlock(); +// //! \brief Unlock mutex +// //! \details In any case this function returns immediate +// void unlock(); - //! \brief Try to lock mutex - //! \details If mutex is unlocked it set to locked state and returns "true" immediate. - //! If mutex is already locked function returns immediate an returns "false" - bool tryLock(); +// //! \brief Try to lock mutex +// //! \details If mutex is unlocked it set to locked state and returns "true" immediate. +// //! If mutex is already locked function returns immediate an returns "false" +// bool tryLock(); - //! Returns if mutex is locked - bool isLocked() const; +// //! Returns if mutex is locked +// bool isLocked() const; -private: - NO_COPY_CLASS(PIMutex) +//private: +// NO_COPY_CLASS(PIMutex) - void init(); - void destroy(); - bool inited_; - bool locked; - PRIVATE_DECLARATION -}; +// void init(); +// void destroy(); +// bool inited_; +// PRIVATE_DECLARATION +//}; class PIP_EXPORT PIMutexLocker @@ -71,7 +71,7 @@ public: ~PIMutexLocker() {if (cond) mutex->unlock();} private: PIMutex * mutex; - volatile bool cond; + std::atomic_bool cond; }; #endif // PIMUTEX_H diff --git a/main.cpp b/main.cpp index dafd934c..17beba83 100644 --- a/main.cpp +++ b/main.cpp @@ -2,308 +2,12 @@ #include #include #include -/*#include -#include -void print(PIConfig::Entry*e, PIString indent = "") { - piCout << indent << e->name() << "=" << e->value(); - indent += " "; - e->children().forEach([=](PIConfig::Entry*e)->PIConfig::Entry*{print(e, indent); return e;}); -} - -class AsyncIOWatcher: public PIThread { - PIOBJECT_SUBCLASS(AsyncIOWatcher, PIThread) +class A : public PIObject { public: - AsyncIOWatcher() { - pipe_fd[0] = pipe_fd[1] = 0; - if (pipe(pipe_fd) != 0) { - piCoutObj << "Warning: can`t create pipe," << errorString(); - } else { - fd_list << pipe_fd[0]; - } - piCout << pipe_fd[0] << pipe_fd[1]; - fd_list_changed = false; - start(); - } - ~AsyncIOWatcher() { - stop(); - breakSelect(); - if (!waitForFinish(2000)) - terminate(); - if (pipe_fd[0]) ::close(pipe_fd[0]); - if (pipe_fd[1]) ::close(pipe_fd[1]); - } - - void add(int fd) { - que_mutex.lock(); - fd_list_changed = true; - if (!add_que.contains(fd)) - add_que.enqueue(fd); - que_mutex.unlock(); - breakSelect(); - } - void remove(int fd) { - que_mutex.lock(); - fd_list_changed = true; - if (!remove_que.contains(fd)) - remove_que.enqueue(fd); - que_mutex.unlock(); - breakSelect(); - } - -private: - virtual void run() { - que_mutex.lock(); - if (fd_list_changed) { - for (int i = 0; i < add_que.size_s(); ++i) { - if (!fd_list.contains(add_que[i])) - fd_list << add_que[i]; - } - for (int i = 0; i < remove_que.size_s(); ++i) { - fd_list.removeAll(remove_que[i]); - } - add_que.clear(); - remove_que.clear(); - } - fd_list_changed = false; - que_mutex.unlock(); - - s_tv.tv_sec = 1; - s_tv.tv_usec = 0; - FD_ZERO(&s_set); - int max_fd = 0; - piForeachC (int fd, fd_list) { - FD_SET(fd, &s_set); - if (max_fd < fd) - max_fd = fd; - } - int ret = select(max_fd + 1, &s_set, 0, 0, 0); - piCout << "select" << ret; - if (ret <= 0) return; - read_buff.resize(1024); - uint ibuff = 0; - piForeachC (int fd, fd_list) { - if (!FD_ISSET(fd, &s_set)) continue; - if (fd == pipe_fd[0]) { - read(fd, &ibuff, sizeof(ibuff)); - piCoutObj << "breaked"; - continue; - } - int readed = read(fd, read_buff.data(), read_buff.size_s()); - piCout << "readed" << fd << readed; - } - } - void breakSelect() { - if (pipe_fd[1]) - ::write(pipe_fd[1], "\0", 1); - } - - PIQueue add_que, remove_que; - PIDeque fd_list; - PIByteArray read_buff; - PIMutex que_mutex; - bool fd_list_changed; - int pipe_fd[2]; - - fd_set s_set; - struct timeval s_tv; - + void test() {piCout << "test";} }; -*/ -struct A { - double arr[1000]; -}; - - -//PIKbdListener kbd(0, 0, false); - -// void swap(int & x, int & y) {int t = x; x = y; y = t;} -// void swap2(int & x, int & y) {int t(std::move(x)); x = y; y = t;} -// void swap(uint & x, uint & y) {uint t = x; x = y; y = t;} -// void swap2(uint & x, uint & y) {uint t(std::move(x)); x = y; y = t;} -// void swap(ullong & x, ullong & y) {ullong t = x; x = y; y = t;} -// void swap2(ullong & x, ullong & y) {ullong t{std::move(x)}; x = y; y = t;} -// void swap(llong & x, llong & y) {llong t = x; x = y; y = t;} -// void swap2(llong & x, llong & y) {llong t{std::move(x)}; x = y; y = t;} -// void swap(double & x, double & y) {double t = x; x = y; y = t;} -// void swap2(double & x, double & y) {double t(std::move(x)); x = std::move(y); y = std::move(t);} -// void swap(float & x, float & y) {float t = x; x = y; y = t;} -// void swap2(float & x, float & y) {float t(std::move(x)); x = std::move(y); y = std::move(t);} -// void swap(PIString & x, PIString & y) {PIString t = x; x = y; y = t;} -// void swap2(PIString & x, PIString & y) {PIString t(std::move(x)); x = std::move(y); y = std::move(t);} -// void swap(std::string & x, std::string & y) {std::string t = x; x = y; y = t;} -// void swap2(std::string & x, std::string & y) {std::string t{std::move(x)}; x = std::move(y); y = std::move(t);} -// void swap(A & x, A & y) {A t = x; x = y; y = t;} -// void swap2(A & x, A & y) {A t{std::move(x)}; x = std::move(y); y = std::move(t);} -//void swap(PIObject & x, PIObject & y) {A t = x; x = y; y = t;} -//void swap2(PIObject & x, PIObject & y) {A t(std::move(x)); x = std::move(y); y = std::move(t);} int main(int argc, char * argv[]) { - // PITimeMeasurer tm; - // int m = 100000; - // int a = 99, b = 77; - // piCout << "int"; - // tm.reset(); - // for (int i = 0; i < m; ++i) { - // swap(a,b); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // swap2(a,b); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // piSwapBinary(a,b); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // piSwap(a,b); - // } - // piCout << tm.elapsed_s(); - - // piCout << "size_t"; - // size_t ta = 99, tb = 77; - // tm.reset(); - // for (int i = 0; i < m; ++i) { - // swap(ta,tb); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // swap2(ta,tb); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // piSwapBinary(ta,tb); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // piSwap(ta,tb); - // } - // piCout << tm.elapsed_s(); - - // piCout << "ullong"; - // ullong lla = 99, llb = 77; - // tm.reset(); - // for (int i = 0; i < m; ++i) { - // swap(lla,llb); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // swap2(lla,llb); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // piSwapBinary(lla,llb); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // piSwap(lla,llb); - // } - // piCout << tm.elapsed_s(); - - // piCout << "double"; - // double da = 0.99,db = 77.77; - // tm.reset(); - // for (int i = 0; i < m; ++i) { - // swap(da,db); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // swap2(da,db); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // piSwapBinary(da,db); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // piSwap(da,db); - // } - // piCout << tm.elapsed_s(); - - // piCout << "float"; - // float fa = 0.99,fb = 77.77; - // tm.reset(); - // for (int i = 0; i < m; ++i) { - // swap(fa,fb); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // swap2(fa,fb); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // piSwapBinary(fa,fb); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // piSwap(fa,fb); - // } - // piCout << tm.elapsed_s(); - - // piCout << "A"; - // A aa,ab; - // tm.reset(); - // for (int i = 0; i < m; ++i) { - // swap(aa,ab); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // swap2(aa,ab); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // piSwapBinary(aa,ab); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // piSwap(aa,ab); - // } - // piCout << tm.elapsed_s(); - - // piCout << "std::string"; - // std::string ia = "123456789012345678901vfsdvsd2345678",ib = "qwertyvsdfvvsdvfsuiopqwertyuikolsdfghjklsdfghjk"; - // tm.reset(); - // for (int i = 0; i < m; ++i) { - // swap(ia,ib); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // swap2(ia,ib); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // ia.swap(ib); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // piSwap(ia,ib); - // } - // piCout << tm.elapsed_s(); - - - // PIString sa = "123456789012345678901vfsdvsd2345678",sb = "qwertyvsdfvvsdvfsuiopqwertyuikolsdfghjklsdfghjk"; - // piCout << "PIString"; - // tm.reset(); - // for (int i = 0; i < m; ++i) { - // swap(sa,sb); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // swap2(sa, sb); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // sa.swap(sb); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // piSwapBinary(sa, sb); - // } - // piCout << tm.elapsed_s(); tm.reset(); - // for (int i = 0; i < m; ++i) { - // piSwap(sa, sb); - // } - // piCout << tm.elapsed_s(); return 0; } diff --git a/utils/system_daemon/main.cpp b/utils/system_daemon/main.cpp index 40962fa0..b1ed08d4 100755 --- a/utils/system_daemon/main.cpp +++ b/utils/system_daemon/main.cpp @@ -164,19 +164,20 @@ public: tl->content << TileSimple::Row("Quality: " + PIString::fromNumber((int)ds.quality), CellFormat()); } void updatePeerInfo() { - bool pm = daemon_.lockedPeers(); +// bool pm = daemon_.lockedPeers(); screen->lock(); daemon_.lock(); peers_tl->content.clear(); addrs_tl->content.clear(); peerinfo_tl->content.clear(); peermap_tl->content.clear(); - peers_tl->content << TileList::Row("this | 0 | 0 | " + PIString::fromNumber(daemon_.allPeers().size_s()) + - " [em = " + PIString::fromBool(daemon_.lockedEth()) + ", " - "mm = " + PIString::fromBool(daemon_.lockedMBcasts()) + ", " - "sm = " + PIString::fromBool(daemon_.lockedSends()) + ", " - "ms = " + PIString::fromBool(daemon_.lockedMCSends()) + ", " - "pm = " + PIString::fromBool(pm) + "]", CellFormat()); + peers_tl->content << TileList::Row("this | 0 | 0 | " + PIString::fromNumber(daemon_.allPeers().size_s()) +// + " [em = " + PIString::fromBool(daemon_.lockedEth()) + ", " +// "mm = " + PIString::fromBool(daemon_.lockedMBcasts()) + ", " +// "sm = " + PIString::fromBool(daemon_.lockedSends()) + ", " +// "ms = " + PIString::fromBool(daemon_.lockedMCSends()) + ", " +// "pm = " + PIString::fromBool(pm) + "]" + , CellFormat()); piForeachC(PIPeer::PeerInfo &p , daemon_.allPeers()) peers_tl->content << TileList::Row(p.name + " | d = " + PIString::fromNumber(p.dist) + " | p = " + PIString::fromNumber(p.ping()) +