LINUX.ORG.RU

История изменений

Исправление 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, однако этот код в том числе должен работать на микроконтроллерах, а там с исключениями туго (даже если компилятор умеет, то рантайм нет).