История изменений
Исправление KivApple, (текущая версия) :
Сделал так:
class MutexLock final {
private:
Mutex& m_mutex;
bool m_success;
public:
MutexLock(Mutex& mutex): m_mutex(mutex) {
m_success = mutex.lock();
}
MutexLock(Mutex& mutex, timeout_t timeout): m_mutex(mutex) {
m_success = mutex.lock(timeout);
}
MutexLock(const MutexLock& that) = delete;
~MutexLock() {
if (m_success) {
m_mutex.unlock();
}
}
bool success() const {
return m_success;
}
};
Если что, это не касается mutex внутри sleep и wakeup, потому что там нужны pthread mutex, а не самодельные (CAS + вышеописанный механизм событий), к тому же я уверен, что там не случится внезапный return, ибо функции очень простые.
Да, я понимаю, что бы логичнее кидать исключение, если не получилось залочить mutex, однако этот код в том числе должен работать на микроконтроллерах, а там с исключениями туго (даже если компилятор умеет, то рантайм нет).
Исправление KivApple, :
Сделал так:
class MutexLock final {
private:
Mutex& m_mutex;
bool m_success;
public:
MutexLock(Mutex& mutex): m_mutex(mutex) {
m_success = mutex.lock();
}
MutexLock(Mutex& mutex, timeout_t timeout): m_mutex(mutex) {
m_success = mutex.lock(timeout);
}
~MutexLock() {
if (m_success) {
m_mutex.unlock();
}
}
bool success() const {
return m_success;
}
};
Если что, это не касается mutex внутри sleep и wakeup, потому что там нужны pthread mutex, а не самодельные (CAS + вышеописанный механизм событий), к тому же я уверен, что там не случится внезапный return, ибо функции очень простые.
Да, я понимаю, что бы логичнее кидать исключение, если не получилось залочить mutex, однако этот код в том числе должен работать на микроконтроллерах, а там с исключениями туго (даже если компилятор умеет, то рантайм нет).
Исходная версия KivApple, :
Сделал так:
class MutexLock final { private: Mutex& m_mutex; bool m_success; public: MutexLock(Mutex& mutex): m_mutex(mutex) { m_success = mutex.lock(); } MutexLock(Mutex& mutex, timeout_t timeout): m_mutex(mutex) { m_success = mutex.lock(timeout); } ~MutexLock() { if (m_success) { m_mutex.unlock(); } } bool success() const { return m_success; } };
Если что, это не касается mutex внутри sleep и wakeup, потому что там нужны pthread mutex, а не самодельные (CAS + вышеописанный механизм событий), к тому же я уверен, что там не случится внезапный return, ибо функции очень простые.
Да, я понимаю, что бы логичнее кидать исключение, если не получилось залочить mutex, однако этот код в том числе должен работать на микроконтроллерах, а там с исключениями туго (даже если компилятор умеет, то рантайм нет).