53 lines
1.4 KiB
C++
53 lines
1.4 KiB
C++
/**
|
|
* @file : sequence_checker_internal
|
|
* @created : Saturday Feb 03, 2024 13:34:40 CST
|
|
* @license : MIT
|
|
**/
|
|
|
|
#ifndef SLED_SYNCHRONIZATION_SEQUENCE_CHECKER_INTERNAL_H
|
|
#define SLED_SYNCHRONIZATION_SEQUENCE_CHECKER_INTERNAL_H
|
|
#pragma once
|
|
|
|
#include "sled/log/log.h"
|
|
#include "sled/synchronization/mutex.h"
|
|
#include "sled/task_queue/task_queue_base.h"
|
|
|
|
namespace sled {
|
|
|
|
class SLED_LOCKABLE SequenceChecker {
|
|
public:
|
|
enum InitialState { kDetached = false, kAttached = true };
|
|
|
|
explicit SequenceChecker(InitialState initial_state = kAttached);
|
|
~SequenceChecker() = default;
|
|
|
|
bool IsCurrent() const;
|
|
|
|
void Detach();
|
|
|
|
// only use by macro RUN_ON
|
|
std::string ExpectationToString() const;
|
|
|
|
private:
|
|
mutable Mutex mutex_;
|
|
mutable bool attached_; //GUARDED_BY(mutex_);
|
|
mutable pthread_t valid_thread_; //GUARDED_BY(mutex_);
|
|
mutable const TaskQueueBase *valid_queue_;//GUARDED_BY(mutex_);
|
|
};
|
|
|
|
class SequenceCheckerDoNothing {
|
|
public:
|
|
explicit SequenceCheckerDoNothing(bool attach_to_current_thread) {}
|
|
|
|
bool IsCurrent() const { return true; }
|
|
|
|
void Detach() {}
|
|
};
|
|
|
|
#define SLED_RUN_ON(x) THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(x))
|
|
#define SLED_DCHECK_RUN_ON(x) SLED_DCHECK((x)->IsCurrent(), (x)->ExpectationToString())
|
|
|
|
}// namespace sled
|
|
|
|
#endif// SLED_SYNCHRONIZATION_SEQUENCE_CHECKER_INTERNAL_H
|