* PIThread::~PIThread() now unregister itself from introspection, if terminates than show warning * PISystemMonitor now correctly stops * PIPeer now can correctly stopAndWait * PIPeer::destroy(), protected method for close all eths and threads * new PIINTROSPECTION_STOP macro * Introspection now can be correctly stopped by macro, more safety ClientServer: * ClientBase::close() stop and disconnect channel * Server clients clean-up now event-based * No warnings on client destructor
414 lines
14 KiB
C++
414 lines
14 KiB
C++
/*! \file pibase_macros.h
|
||
* \ingroup Core
|
||
* \~\brief
|
||
* \~english Base macros
|
||
* \~russian Базовые макросы
|
||
*
|
||
* \~\details
|
||
* \~english
|
||
* This file declares basic useful maros
|
||
* \~russian
|
||
* Этот файл объявляет основные вспомогательные макросы
|
||
*/
|
||
/*
|
||
PIP - Platform Independent Primitives
|
||
Base macros
|
||
Ivan Pelipenko peri4ko@yandex.ru
|
||
|
||
This program is free software: you can redistribute it and/or modify
|
||
it under the terms of the GNU Lesser General Public License as published by
|
||
the Free Software Foundation, either version 3 of the License, or
|
||
(at your option) any later version.
|
||
|
||
This program is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU Lesser General Public License for more details.
|
||
|
||
You should have received a copy of the GNU Lesser General Public License
|
||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
*/
|
||
|
||
#ifndef PIBASE_MACROS_H
|
||
#define PIBASE_MACROS_H
|
||
|
||
#include "pip_defs.h"
|
||
#include "pip_version.h"
|
||
#include "piplatform.h"
|
||
|
||
//! \~english
|
||
//! Meta-information section for any entity.
|
||
//! Parsing by \a pip_cmg and can be accessed by \a PICodeInfo.
|
||
//! Contains sequence of key=value pairs, e.g.
|
||
//! \~russian
|
||
//! Секция метаинформации для любой сущности.
|
||
//! Парсится \a pip_cmg и доступна с помощью \a PICodeInfo.
|
||
//! Содержит набор пар ключ=значение, например
|
||
//! \~
|
||
//! PIMETA(id=12345,tag="my string")
|
||
#define PIMETA(...)
|
||
|
||
#ifdef DOXYGEN
|
||
|
||
//! \~\brief
|
||
//! \~english Major value of PIP version
|
||
//! \~russian Мажорная версия PIP
|
||
# define PIP_VERSION_MAJOR
|
||
|
||
//! \~\brief
|
||
//! \~english Minor value of PIP version
|
||
//! \~russian Минорная версия PIP
|
||
# define PIP_VERSION_MINOR
|
||
|
||
//! \~\brief
|
||
//! \~english Revision value of PIP version
|
||
//! \~russian Ревизия версии PIP
|
||
# define PIP_VERSION_REVISION
|
||
|
||
//! \~\brief
|
||
//! \~english Suffix of PIP version
|
||
//! \~russian Суффикс версии PIP
|
||
# define PIP_VERSION_SUFFIX
|
||
|
||
//! \~\brief
|
||
//! \~english Version of PIP in hex - 0x##(Major)##(Minor)##(Revision)
|
||
//! \~russian Версия PIP в hex - 0x##(Major)##(Minor)##(Revision)
|
||
# define PIP_VERSION
|
||
|
||
//! \~\brief
|
||
//! \~english Macro is defined when compile-time debug is enabled
|
||
//! \~russian Макрос объявлен когда включена compile-time отладка
|
||
# define PIP_DEBUG
|
||
|
||
//! \~\brief
|
||
//! \~english Macro is defined when operation system is any Windows
|
||
//! \~russian Макрос объявлен когда операционная система Windows
|
||
# define WINDOWS
|
||
|
||
//! \~\brief
|
||
//! \~english Macro is defined when operation system is QNX or Blackberry
|
||
//! \~russian Макрос объявлен когда операционная система QNX или Blackberry
|
||
# define QNX
|
||
|
||
//! \~\brief
|
||
//! \~english Macro is defined when operation system is Blackberry
|
||
//! \~russian Макрос объявлен когда операционная система Blackberry
|
||
# define BLACKBERRY
|
||
|
||
//! \~\brief
|
||
//! \~english Macro is defined when operation system is FreeBSD
|
||
//! \~russian Макрос объявлен когда операционная система FreeBSD
|
||
# define FREE_BSD
|
||
|
||
//! \~\brief
|
||
//! \~english Macro is defined when operation system is Mac OS
|
||
//! \~russian Макрос объявлен когда операционная система Mac OS
|
||
# define MAC_OS
|
||
|
||
//! \~\brief
|
||
//! \~english Macro is defined when operation system is Android
|
||
//! \~russian Макрос объявлен когда операционная система Android
|
||
# define ANDROID
|
||
|
||
//! \~\brief
|
||
//! \~english Macro is defined when operation system is any Linux
|
||
//! \~russian Макрос объявлен когда операционная система Linux
|
||
# define LINUX
|
||
|
||
//! \~\brief
|
||
//! \~english Macro is defined when operation system is FreeRTOS
|
||
//! \~russian Макрос объявлен когда операционная система FreeRTOS
|
||
# define FREERTOS
|
||
|
||
//! \~\brief
|
||
//! \~english Macro is defined when compiler is GCC or MinGW
|
||
//! \~russian Макрос объявлен когда компилятор GCC или MinGW
|
||
# define CC_GCC
|
||
|
||
//! \~\brief
|
||
//! \~english Macro is defined when PIP is decided that host is support language
|
||
//! \~russian Макрос объявлен когда PIP решил что система поддерживает локализацию
|
||
# define HAS_LOCALE
|
||
|
||
//! \~\brief
|
||
//! \~english Macro is defined when PIP is building for embedded systems
|
||
//! \~russian Макрос объявлен когда PIP собирается для встраиваемых систем
|
||
# define MICRO_PIP
|
||
|
||
//! \~\brief
|
||
//! \~english Macro is defined when compiler is Visual Studio
|
||
//! \~russian Макрос объявлен когда компилятор Visual Studio
|
||
# define CC_VC
|
||
|
||
//! \~\brief
|
||
//! \~english Macro is defined when compiler is AVR GCC
|
||
//! \~russian Макрос объявлен когда компилятор AVR GCC
|
||
# define CC_AVR_GCC
|
||
|
||
//! \~\brief
|
||
//! \~english Macro is defined when compiler is unknown
|
||
//! \~russian Макрос объявлен когда компилятор неизвестен
|
||
# define CC_OTHER
|
||
|
||
//! \~\brief
|
||
//! \~english Macro to declare private section, "export" is optional
|
||
//! \~russian Макрос для объявления частной секции, "export" необязателен
|
||
# define PRIVATE_DECLARATION(export)
|
||
|
||
//! \~\brief
|
||
//! \~english Macro to start definition of private section
|
||
//! \~russian Макрос для начала реализации частной секции
|
||
# define PRIVATE_DEFINITION_START(Class)
|
||
|
||
//! \~\brief
|
||
//! \~english Macro to end definition of private section
|
||
//! \~russian Макрос для окончания реализации частной секции
|
||
# define PRIVATE_DEFINITION_END(Class)
|
||
|
||
//! \~\brief
|
||
//! \~english Macro to access private section by pointer
|
||
//! \~russian Макрос для доступа к частной секции
|
||
# define PRIVATE
|
||
|
||
//! \~\brief
|
||
//! \~english Macro to access private section by pointer without brakes ()
|
||
//! \~russian Макрос для доступа к частной секции без обрамляющих скобок ()
|
||
# define PRIVATEWB
|
||
|
||
//! \~\brief
|
||
//! \~english Macro to start static initializer
|
||
//! \~russian Макрос для начала статической инициализации
|
||
# define STATIC_INITIALIZER_BEGIN
|
||
|
||
//! \~\brief
|
||
//! \~english Macro to end static initializer
|
||
//! \~russian Макрос для окончания статической инициализации
|
||
# define STATIC_INITIALIZER_END
|
||
|
||
//! \~\brief
|
||
//! \~english Macro to remove class copy availability
|
||
//! \~russian Макрос для запрета копирования класса
|
||
# define NO_COPY_CLASS(Class)
|
||
|
||
//! \~\brief
|
||
//! \~english Macro to supress compiler warning about unused variable
|
||
//! \~russian Макрос для подавления предупреждения компилятора о неиспользуемой переменной
|
||
# define NO_UNUSED(x)
|
||
|
||
# undef MICRO_PIP
|
||
# undef FREERTOS
|
||
|
||
#endif // DOXYGEN
|
||
|
||
#ifdef WINDOWS
|
||
# ifdef CC_VC
|
||
# define SHUT_RDWR 2
|
||
# pragma comment(lib, "Ws2_32.lib")
|
||
# pragma comment(lib, "Iphlpapi.lib")
|
||
# pragma comment(lib, "Psapi.lib")
|
||
# ifdef ARCH_BITS_32
|
||
# define _X86_
|
||
# else
|
||
# define _IA64_
|
||
# endif
|
||
# else
|
||
# define SHUT_RDWR SD_BOTH
|
||
# endif
|
||
typedef int socklen_t;
|
||
extern long long __pi_perf_freq;
|
||
#endif
|
||
|
||
#ifndef DOXYGEN
|
||
|
||
# ifdef ANDROID
|
||
// # define tcdrain(fd) ioctl(fd, TCSBRK, 1)
|
||
// inline int wctomb(char * c, wchar_t w) {*c = ((char * )&w)[0]; return 1;}
|
||
// inline int mbtowc(wchar_t * w, const char * c, size_t) {*w = ((wchar_t * )&c)[0]; return 1;}
|
||
# endif
|
||
|
||
# ifdef MAC_OS
|
||
# define environ (*_NSGetEnviron())
|
||
typedef long time_t;
|
||
# endif
|
||
|
||
# ifdef LINUX
|
||
# define environ __environ
|
||
# endif
|
||
|
||
# ifdef FREE_BSD
|
||
extern char ** environ;
|
||
# endif
|
||
|
||
# ifndef NO_UNUSED
|
||
# define NO_UNUSED(x) (void)x
|
||
# endif
|
||
|
||
# ifndef assert
|
||
# define assert(x)
|
||
# define assertm(exp, msg)
|
||
# else
|
||
# define assertm(exp, msg) assert(((void)msg, exp))
|
||
# endif
|
||
|
||
# ifdef MICRO_PIP
|
||
# define __PIP_TYPENAME__(T) "?"
|
||
# else
|
||
# define __PIP_TYPENAME__(T) typeid(T).name()
|
||
# endif
|
||
|
||
# ifdef CC_GCC
|
||
# undef DEPRECATED
|
||
# undef DEPRECATEDM
|
||
# define DEPRECATED __attribute__((deprecated))
|
||
# define DEPRECATEDM(msg) __attribute__((deprecated(msg)))
|
||
# if CC_GCC_VERSION > 0x025F // > 2.95
|
||
# pragma GCC diagnostic warning "-Wdeprecated-declarations"
|
||
# ifdef LINUX
|
||
# define HAS_LOCALE
|
||
# endif
|
||
# ifdef MAC_OS
|
||
# pragma GCC diagnostic ignored "-Wundefined-bool-conversion"
|
||
# pragma GCC diagnostic ignored "-Wc++11-extensions"
|
||
# endif
|
||
# endif
|
||
# ifdef ANDROID
|
||
# pragma GCC diagnostic ignored "-Wunused-parameter"
|
||
# pragma GCC diagnostic ignored "-Wextra"
|
||
# pragma GCC diagnostic ignored "-Wc++11-extensions"
|
||
# pragma GCC diagnostic ignored "-Wundefined-bool-conversion"
|
||
// # pragma GCC diagnostic ignored "-Wliteral-suffix"
|
||
# endif
|
||
# endif
|
||
|
||
# ifdef CC_VC
|
||
# undef DEPRECATED
|
||
# undef DEPRECATEDM
|
||
# define DEPRECATED __declspec(deprecated)
|
||
# define DEPRECATEDM(msg) __declspec(deprecated(msg))
|
||
# pragma warning(disable: 4018)
|
||
# pragma warning(disable: 4061)
|
||
# pragma warning(disable: 4100)
|
||
# pragma warning(disable: 4239)
|
||
# pragma warning(disable: 4242)
|
||
# pragma warning(disable: 4244)
|
||
# pragma warning(disable: 4251)
|
||
# pragma warning(disable: 4365)
|
||
# pragma warning(disable: 4512)
|
||
# pragma warning(disable: 4668)
|
||
# pragma warning(disable: 4710)
|
||
# pragma warning(disable: 4800)
|
||
# pragma warning(disable: 4820)
|
||
# pragma warning(disable: 4986)
|
||
# pragma warning(disable: 4996)
|
||
# ifdef ARCH_BITS_32
|
||
typedef long ssize_t;
|
||
# else
|
||
typedef long long ssize_t;
|
||
# endif
|
||
# endif
|
||
|
||
# ifdef CC_OTHER
|
||
# undef DEPRECATED
|
||
# undef DEPRECATEDM
|
||
# define DEPRECATED
|
||
# define DEPRECATEDM(msg)
|
||
# endif
|
||
|
||
#endif // DOXYGEN
|
||
|
||
|
||
// Private data macros
|
||
#ifndef DOXYGEN
|
||
|
||
# define PRIVATE_DECLARATION(e) \
|
||
struct __Private__; \
|
||
friend struct __Private__; \
|
||
struct e __PrivateInitializer__ { \
|
||
__PrivateInitializer__(); \
|
||
__PrivateInitializer__(const __PrivateInitializer__ & o); \
|
||
~__PrivateInitializer__(); \
|
||
__PrivateInitializer__ & operator=(const __PrivateInitializer__ & o); \
|
||
__Private__ * p = nullptr; \
|
||
}; \
|
||
__PrivateInitializer__ __privateinitializer__;
|
||
|
||
# define PRIVATE_DEFINITION_START(c) struct c::__Private__ {
|
||
# define PRIVATE_DEFINITION_END(c) \
|
||
} \
|
||
; \
|
||
c::__PrivateInitializer__::__PrivateInitializer__() { \
|
||
p = new c::__Private__(); \
|
||
} \
|
||
c::__PrivateInitializer__::__PrivateInitializer__(const c::__PrivateInitializer__ &) { /*if (p) delete p;*/ \
|
||
p = new c::__Private__(); \
|
||
} \
|
||
c::__PrivateInitializer__::~__PrivateInitializer__() { \
|
||
piDeleteSafety(p); \
|
||
} \
|
||
c::__PrivateInitializer__ & c::__PrivateInitializer__::operator=(const c::__PrivateInitializer__ &) { \
|
||
piDeleteSafety(p); \
|
||
p = new c::__Private__(); \
|
||
return *this; \
|
||
}
|
||
|
||
# define PRIVATE (__privateinitializer__.p)
|
||
# define PRIVATEWB __privateinitializer__.p
|
||
|
||
#endif // DOXYGEN
|
||
|
||
#define NO_COPY_CLASS(name) \
|
||
name(const name &) = delete; \
|
||
name & operator=(const name &) = delete;
|
||
|
||
|
||
#define _PIP_ADD_COUNTER_WS(a, cnt, line) a##cnt##_##line
|
||
#define _PIP_ADD_COUNTER_WF(a, cnt, line) _PIP_ADD_COUNTER_WS(a, cnt, line)
|
||
#define _PIP_ADD_COUNTER(a) _PIP_ADD_COUNTER_WF(a, __COUNTER__, __LINE__)
|
||
|
||
|
||
#define STATIC_INITIALIZER_BEGIN \
|
||
class { \
|
||
class _Initializer_ { \
|
||
public: \
|
||
_Initializer_() {
|
||
#define STATIC_INITIALIZER_END \
|
||
} \
|
||
} \
|
||
_initializer_; \
|
||
} \
|
||
_PIP_ADD_COUNTER(_pip_initializer_);
|
||
|
||
|
||
//! \~\brief
|
||
//! \~english Minimal sleep in milliseconds for internal PIP using
|
||
//! \~russian Минимальное значание задержки в милисекундах для внутреннего использования в библиотеке PIP
|
||
//! \~\details
|
||
//! \~english Using in \a piMinSleep(), \a PIThread, \a PITimer::Pool. By default 1ms.
|
||
//! \~russian Используется в \a piMinSleep(), \a PIThread, \a PITimer::Pool. По умолчанию равна 1мс.
|
||
#ifndef PIP_MIN_MSLEEP
|
||
# ifndef MICRO_PIP
|
||
# define PIP_MIN_MSLEEP 1.
|
||
# else
|
||
# define PIP_MIN_MSLEEP 10.
|
||
# endif
|
||
#endif
|
||
|
||
|
||
//! \~\brief
|
||
//! \~english Macro used for infinite loop
|
||
//! \~russian Макрос для бесконечного цикла
|
||
#define FOREVER for (;;)
|
||
|
||
//! \~\brief
|
||
//! \~english Macro used for infinite wait
|
||
//! \~russian Макрос для бесконечного ожидания
|
||
#define FOREVER_WAIT FOREVER piMinSleep();
|
||
|
||
//! \~\brief
|
||
//! \~english Macro used for infinite wait
|
||
//! \~russian Макрос для бесконечного ожидания
|
||
#define WAIT_FOREVER FOREVER piMinSleep();
|
||
|
||
|
||
#endif // PIBASE_MACROS_H
|