锁优化

This commit is contained in:
2026-07-23 12:27:06 +08:00
parent e2ecf8081f
commit ad9693dfba
30 changed files with 222 additions and 293 deletions
+20 -14
View File
@@ -266,7 +266,6 @@ struct InputBufferSlot {
bool pending = false;
};
struct RenderData {
SpinLock mBufferLock;
RenderAble* qPtr{};
bool mRenderStart = false;
Triple_Role_Buffer_Control mStateControl;
@@ -314,7 +313,7 @@ struct RenderData {
const InputBufferSlot& inputSlotByIndex(std::uint8_t index) const {
return mInputBuffers[index];
}
void markInputDirty();
void markInputDirty(Triple_Buffer_Lease lease);
void clearInputRole(std::uint8_t role) {
InputBufferSlot& slot = inputSlot(role);
slot.data->clear();
@@ -346,7 +345,6 @@ protected:
}
virtual void draw(QPainter* painter) {}
virtual void prepareData() {
SpinLockGuard g(&mBufferLock);
syncStatePipeline();
}
virtual bool selectTest(const QPointF& pos) {
@@ -384,14 +382,16 @@ struct BaseRenderData : RenderData {
};
class Plot;
struct LIB_DECL RenderEditGuard {
explicit RenderEditGuard(RenderData* data);
RenderEditGuard(RenderData* data, Triple_Buffer_Lease lease);
~RenderEditGuard();
RenderData* mData{};
Triple_Buffer_Lease mLease{};
};
struct LIB_DECL RenderInputGuard {
explicit RenderInputGuard(RenderData* data);
RenderInputGuard(RenderData* data, Triple_Buffer_Lease lease);
~RenderInputGuard();
RenderData* mData{};
Triple_Buffer_Lease mLease{};
};
struct RenderAble {
enum class JobState {
@@ -533,11 +533,13 @@ private:
ClassName##InputData* editInputData() override {return reinterpret_cast<ClassName##InputData*>(inputData(Input_Edit));} \
friend class ClassName; \
void syncStatePipeline() override { \
Triple_Buffer_Lease editLease = mStateControl.wait_mark_use_role(State_Edit); \
Triple_Buffer_Lease readyLease = mStateControl.wait_mark_use_role(State_Ready); \
auto ready = reinterpret_cast<ClassName##RenderState*>(stateByIndex(readyLease.index)); \
auto edit = editState(); \
auto edit = reinterpret_cast<ClassName##RenderState*>(stateByIndex(editLease.index)); \
if(buffer_version_newer(edit->version, ready->version)) *ready = *edit; \
mStateControl.unmark_use(readyLease); \
mStateControl.unmark_use(editLease); \
mStateControl.wait_swap_role(State_Ready, State_Render, [this](const Triple_Buffer_View& view) { \
auto ready = reinterpret_cast<ClassName##RenderState*>(stateByIndex(view[State_Ready])); \
auto render = reinterpret_cast<ClassName##RenderState*>(stateByIndex(view[State_Render])); \
@@ -564,11 +566,13 @@ private:
ClassName##InputData* editInputData() override {return reinterpret_cast<ClassName##InputData*>(inputData(Input_Edit));} \
friend class ClassName; \
void syncStatePipeline() override { \
Triple_Buffer_Lease editLease = mStateControl.wait_mark_use_role(State_Edit); \
Triple_Buffer_Lease readyLease = mStateControl.wait_mark_use_role(State_Ready); \
auto ready = reinterpret_cast<ClassName##RenderState*>(stateByIndex(readyLease.index)); \
auto edit = editState(); \
auto edit = reinterpret_cast<ClassName##RenderState*>(stateByIndex(editLease.index)); \
if(buffer_version_newer(edit->version, ready->version)) *ready = *edit; \
mStateControl.unmark_use(readyLease); \
mStateControl.unmark_use(editLease); \
mStateControl.wait_swap_role(State_Ready, State_Render, [this](const Triple_Buffer_View& view) { \
auto ready = reinterpret_cast<ClassName##RenderState*>(stateByIndex(view[State_Ready])); \
auto render = reinterpret_cast<ClassName##RenderState*>(stateByIndex(view[State_Render])); \
@@ -595,11 +599,13 @@ private:
ClassName##InputData* editInputData() override {return reinterpret_cast<ClassName##InputData*>(inputData(Input_Edit));} \
friend class ClassName; \
void syncStatePipeline() override { \
Triple_Buffer_Lease editLease = mStateControl.wait_mark_use_role(State_Edit); \
Triple_Buffer_Lease readyLease = mStateControl.wait_mark_use_role(State_Ready); \
auto ready = reinterpret_cast<ClassName##RenderState*>(stateByIndex(readyLease.index)); \
auto edit = editState(); \
auto edit = reinterpret_cast<ClassName##RenderState*>(stateByIndex(editLease.index)); \
if(buffer_version_newer(edit->version, ready->version)) *ready = *edit; \
mStateControl.unmark_use(readyLease); \
mStateControl.unmark_use(editLease); \
mStateControl.wait_swap_role(State_Ready, State_Render, [this](const Triple_Buffer_View& view) { \
auto ready = reinterpret_cast<ClassName##RenderState*>(stateByIndex(view[State_Ready])); \
auto render = reinterpret_cast<ClassName##RenderState*>(stateByIndex(view[State_Render])); \
@@ -618,11 +624,11 @@ private:
if(!mRenderStart) mRenderStart = true; \
}
#define INIT_SET(className) className##Private* pd = d(); \
className##RenderState* sc = reinterpret_cast<className##RenderState*>(pd->state(State_Edit));\
SpinLockGuard _guard(&pd->mBufferLock); \
RenderEditGuard _editGuard(pd);
Triple_Buffer_Lease _stateLease = pd->mStateControl.wait_mark_use_role(State_Edit); \
className##RenderState* sc = reinterpret_cast<className##RenderState*>(pd->stateByIndex(_stateLease.index));\
RenderEditGuard _editGuard(pd, _stateLease);
#define INIT_INPUT(className) className##Private* pd = d(); \
className##InputData* input = reinterpret_cast<className##InputData*>(pd->inputData(Input_Edit)); \
SpinLockGuard _guard(&pd->mBufferLock); \
RenderInputGuard _inputGuard(pd);
Triple_Buffer_Lease _inputLease = pd->mInputControl.wait_mark_use_role(Input_Edit); \
className##InputData* input = reinterpret_cast<className##InputData*>(pd->inputDataByIndex(_inputLease.index)); \
RenderInputGuard _inputGuard(pd, _inputLease);
}