锁优化
This commit is contained in:
+20
-14
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user