Merge branch 'master' into pitimer_slot
This commit is contained in:
@@ -726,6 +726,7 @@ inline bool piDeleteSafety(T *& pointer) {
|
||||
//! \~english In this example "Error!" will be printed on every \b false function return.
|
||||
//! \~russian В данном примере будет выведен "Error!" при каждом \b false возврате из функции.
|
||||
class PIP_EXPORT PIScopeExitCall {
|
||||
NO_COPY_CLASS(PIScopeExitCall)
|
||||
public:
|
||||
//! \~\brief
|
||||
//! \~english Constructor that takes a function to execute
|
||||
@@ -758,8 +759,6 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
NO_COPY_CLASS(PIScopeExitCall)
|
||||
|
||||
std::function<void()> func;
|
||||
};
|
||||
|
||||
@@ -768,14 +767,14 @@ private:
|
||||
//! \~english Inherit from this class to make your class non-trivially copyable.
|
||||
//! \~russian Наследуйтесь от этого класса чтобы сделать свой класс нетривиально копируемым.
|
||||
struct PIP_EXPORT PINonTriviallyCopyable {
|
||||
PINonTriviallyCopyable() noexcept = default;
|
||||
PINonTriviallyCopyable(const PINonTriviallyCopyable &) noexcept = default;
|
||||
PINonTriviallyCopyable(PINonTriviallyCopyable &&) noexcept;
|
||||
PINonTriviallyCopyable & operator=(const PINonTriviallyCopyable &) noexcept = default;
|
||||
PINonTriviallyCopyable & operator=(PINonTriviallyCopyable &&) noexcept = default;
|
||||
PINonTriviallyCopyable() = default;
|
||||
PINonTriviallyCopyable(const PINonTriviallyCopyable &) = default;
|
||||
PINonTriviallyCopyable(PINonTriviallyCopyable &&) ;
|
||||
PINonTriviallyCopyable & operator=(const PINonTriviallyCopyable &) = default;
|
||||
PINonTriviallyCopyable & operator=(PINonTriviallyCopyable &&) = default;
|
||||
~PINonTriviallyCopyable() = default;
|
||||
};
|
||||
inline PINonTriviallyCopyable::PINonTriviallyCopyable(PINonTriviallyCopyable &&) noexcept = default;
|
||||
inline PINonTriviallyCopyable::PINonTriviallyCopyable(PINonTriviallyCopyable &&) = default;
|
||||
|
||||
|
||||
//! \~\brief
|
||||
|
||||
@@ -527,6 +527,7 @@ bool PIEthernet::listen(bool threaded) {
|
||||
listen_threaded = true;
|
||||
server_bounded = false;
|
||||
server_thread_.start(server_func);
|
||||
server_thread_.waitForStart();
|
||||
return true;
|
||||
}
|
||||
listen_threaded = server_bounded = false;
|
||||
|
||||
@@ -4,22 +4,22 @@
|
||||
//! \~english Thread-safe variable
|
||||
//! \~russian Потокобезопасная переменная
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Thread-safe variable
|
||||
Ivan Pelipenko peri4ko@yandex.ru
|
||||
PIP - Platform Independent Primitives
|
||||
Thread-safe variable
|
||||
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 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.
|
||||
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/>.
|
||||
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 PIPROTECTEDVARIABLE_H
|
||||
@@ -34,21 +34,29 @@
|
||||
template<typename T>
|
||||
class PIP_EXPORT PIProtectedVariable {
|
||||
public:
|
||||
//! \~english Constructs %PIProtectedVariable and initialize variable by value `v`.
|
||||
//! \~russian Создает %PIProtectedVariable и инициализирует переменную значением `v`.
|
||||
PIProtectedVariable(T v = T()): var(std::move(v)) {}
|
||||
|
||||
//! \~\brief
|
||||
//! \~english Pointer-like wrapper returned by \a getRef() while the protected value remains locked.
|
||||
//! \~russian Указателеподобная обертка, возвращаемая \a getRef(), пока защищенное значение остается заблокированным.
|
||||
class PIP_EXPORT Pointer {
|
||||
friend class PIProtectedVariable<T>;
|
||||
NO_COPY_CLASS(Pointer);
|
||||
Pointer & operator=(Pointer && other) = delete;
|
||||
|
||||
public:
|
||||
//! \~english Copies wrapper state for access to the same protected value.
|
||||
//! \~russian Копирует состояние обертки для доступа к тому же защищенному значению.
|
||||
Pointer(const Pointer & v): pv(v.pv), counter(v.counter + 1) {}
|
||||
//! \~english Move constructor - transfers ownership of the lock.
|
||||
//! \~russian Конструктор перемещения - передает владение блокировкой.
|
||||
Pointer(Pointer && other): pv(other.pv) { other.can_unlock = false; };
|
||||
|
||||
//! \~english Destroys wrapper and releases the mutex when it owns the original lock.
|
||||
//! \~russian Уничтожает обертку и освобождает мьютекс, когда она владеет исходной блокировкой.
|
||||
//! \~english Destroys wrapper and releases the mutex.
|
||||
//! \~russian Уничтожает обертку и освобождает мьютекс.
|
||||
~Pointer() {
|
||||
if (counter == 0) pv.mutex.unlock();
|
||||
if (can_unlock) {
|
||||
pv.mutex.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
//! \~english Returns pointer access to the protected value.
|
||||
@@ -60,11 +68,11 @@ public:
|
||||
T & operator*() { return pv.var; }
|
||||
|
||||
private:
|
||||
Pointer() = delete;
|
||||
Pointer(PIProtectedVariable<T> & v): pv(v) {}
|
||||
explicit Pointer() = delete;
|
||||
explicit Pointer(PIProtectedVariable<T> & v): pv(v) { pv.mutex.lock(); }
|
||||
|
||||
PIProtectedVariable<T> & pv;
|
||||
int counter = 0;
|
||||
bool can_unlock = true;
|
||||
};
|
||||
|
||||
//! \~english Replaces the protected value with \a v.
|
||||
@@ -76,10 +84,7 @@ public:
|
||||
|
||||
//! \~english Locks the value and returns wrapper-based access to it.
|
||||
//! \~russian Блокирует значение и возвращает обертку для доступа к нему.
|
||||
Pointer getRef() {
|
||||
mutex.lock();
|
||||
return Pointer(*this);
|
||||
}
|
||||
Pointer getRef() { return Pointer(*this); }
|
||||
|
||||
//! \~english Returns a copy of the protected value.
|
||||
//! \~russian Возвращает копию защищенного значения.
|
||||
@@ -98,7 +103,7 @@ public:
|
||||
|
||||
private:
|
||||
mutable PIMutex mutex;
|
||||
T var;
|
||||
T var = {};
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -105,7 +105,7 @@ extern clock_serv_t __pi_mac_clock;
|
||||
//! Используйте этот метод для ожидания разниц системных времен или своего времени.
|
||||
//! Если метод будет вызван для системного времени \a PISystemTime::current(), то
|
||||
//! ожидание будет почти бесконечным
|
||||
void PISystemTime::sleep() {
|
||||
void PISystemTime::sleep() const {
|
||||
piUSleep(piFloord(toMicroseconds()));
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ void PISystemTime::toTimespec(void * ts) {
|
||||
}
|
||||
|
||||
|
||||
PISystemTime::Frequency PISystemTime::toFrequency() {
|
||||
PISystemTime::Frequency PISystemTime::toFrequency() const {
|
||||
return PISystemTime::Frequency::fromSystemTime(*this);
|
||||
}
|
||||
|
||||
|
||||
@@ -253,7 +253,7 @@ public:
|
||||
|
||||
//! \~english Sleep for this time
|
||||
//! \~russian Ожидать это время
|
||||
void sleep();
|
||||
void sleep() const;
|
||||
|
||||
//! \~english On *nix system assign current value to timespec struct
|
||||
//! \~russian На *nix системах присваивает время к timespec структуре
|
||||
@@ -261,7 +261,7 @@ public:
|
||||
|
||||
//! \~english Returns \a Frequency that corresponds this time interval
|
||||
//! \~russian Возвращает \a Frequency соответствующую этому временному интервалу
|
||||
PISystemTime::Frequency toFrequency();
|
||||
PISystemTime::Frequency toFrequency() const;
|
||||
|
||||
//! \~english Returns "yyyy-MM-dd hh:mm:ss.zzz" for absolute time and "<V> <d|h|m|s|ms|us|ns> ..." for relative
|
||||
//! \~russian Возвращает "yyyy-MM-dd hh:mm:ss.zzz" для абсолютного времени и "<V> <d|h|m|s|ms|us|ns> ..." для относительного
|
||||
|
||||
Reference in New Issue
Block a user