Skip to content

Commit 1cfec8c

Browse files
authored
pxWayland: clear context in gUIThreadQueue on setEvents (#2222)
1 parent d044041 commit 1cfec8c

File tree

4 files changed

+45
-32
lines changed

4 files changed

+45
-32
lines changed

examples/pxScene2d/src/pxWayland.cpp

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ pxWayland::~pxWayland()
147147
}
148148
if (gUIThreadQueue)
149149
{
150-
gUIThreadQueue->removeAllTasksForObject(this);
150+
gUIThreadQueue->removeAllTasksForObject(this, onRemoveTask);
151151
}
152152
}
153153

@@ -559,7 +559,7 @@ uint32_t pxWayland::getModifiers( uint32_t flags )
559559
bool pxWayland::isRotated()
560560
{
561561
pxMatrix4f matrix = context.getMatrix();
562-
float *f = matrix.data();
562+
float *f = matrix.data();
563563
const float e= 1.0e-2;
564564

565565
if ( (fabsf(f[1]) > e) ||
@@ -666,34 +666,33 @@ struct pxWaylandClientStatus
666666

667667
void pxWayland::onClientStatus(void* context, void* data)
668668
{
669-
pxWayland* pxw = (pxWayland*)context;
670-
pxWaylandClientStatus* statusData = (pxWaylandClientStatus*)data;
671-
if (pxw)
669+
if (context && data)
672670
{
671+
pxWayland* pxw = (pxWayland*)context;
672+
pxWaylandClientStatus* statusData = (pxWaylandClientStatus*)data;
673673
pxw->handleClientStatus(statusData->status, statusData->pid, statusData->detail);
674-
pxw->Release();
675674
}
676-
delete statusData;
675+
onRemoveTask(context, data);
677676
}
678677

679678
void pxWayland::clientStatus( WstCompositor *wctx, int status, int pid, int detail, void *userData )
680679
{
681680
(void)wctx;
681+
if (userData && gUIThreadQueue)
682+
gUIThreadQueue->addTask(onClientStatus, userData, new pxWaylandClientStatus(status, pid, detail));
683+
}
682684

683-
pxWayland *pxw = (pxWayland*)userData;
684-
685-
if (pxw && gUIThreadQueue)
686-
{
687-
pxw->AddRef();
688-
pxWaylandClientStatus* statusData = new pxWaylandClientStatus(status, pid, detail);
689-
gUIThreadQueue->addTask(onClientStatus, pxw, statusData);
690-
}
685+
bool pxWayland::onRemoveTask(void* context, void* data)
686+
{
687+
if (data)
688+
delete (pxWaylandClientStatus*)data;
689+
return true;
691690
}
692691

693692
void pxWayland::remoteDisconnectedCB(void *data)
694693
{
695694
pxWayland *pxw = (pxWayland *)data;
696-
if(pxw->mEvents)
695+
if (pxw->mEvents)
697696
pxw->mEvents->remoteDisconnected(data);
698697
}
699698

@@ -969,7 +968,7 @@ rtError pxWayland::drawToFbo(pxContextFramebufferRef& fbo)
969968

970969
context.setFramebuffer( previousFrameBuffer );
971970
context.popState();
972-
971+
973972
return RT_OK;
974973
}
975974

examples/pxScene2d/src/pxWayland.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ class pxWayland: public pxIView {
190190
static void clientStatus( WstCompositor *wctx, int status, int pid, int detail, void *userData );
191191
static void remoteDisconnectedCB(void *data);
192192
static void onClientStatus(void* context, void* data);
193+
static bool onRemoveTask(void* context, void* data);
193194

194195
void handleInvalidate();
195196
void handleHidePointer( bool hide );

src/rtThreadQueue.cpp

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ rtThreadQueue::~rtThreadQueue() {}
2929
rtError rtThreadQueue::addTask(rtThreadTaskCB t, void* context, void* data)
3030
{
3131
mTaskMutex.lock();
32-
ThreadQueueEntry entry;
32+
rtThreadQueueEntry entry;
3333
entry.task = t;
3434
entry.context = context;
3535
entry.data = data;
@@ -39,18 +39,30 @@ rtError rtThreadQueue::addTask(rtThreadTaskCB t, void* context, void* data)
3939
return RT_OK;
4040
}
4141

42-
rtError rtThreadQueue::removeAllTasksForObject(void* context)
42+
template<class It, class Pr>
43+
It removeIf(It first, It last, Pr pred)
44+
{
45+
It result = first;
46+
for (; first != last; ++first)
47+
if (!pred(*first))
48+
*result++ = move(*first);
49+
return result;
50+
}
51+
52+
rtError rtThreadQueue::removeAllTasksForObject(void* context, rtThreadQueueRemoveTaskCB cb)
4353
{
4454
mTaskMutex.lock();
45-
for(deque<ThreadQueueEntry>::iterator it = mTasks.begin();
46-
it != mTasks.end(); ++it)
47-
{
48-
if ((it)->context == context)
49-
{
50-
it = mTasks.erase(it);
51-
break;
52-
}
53-
}
55+
mTasks.erase(
56+
removeIf(
57+
mTasks.begin(),
58+
mTasks.end(),
59+
[context, cb](const rtThreadQueueEntry& e)
60+
{
61+
return (e.context == context) && (!cb || cb(e.context, e.data));
62+
}
63+
),
64+
mTasks.end()
65+
);
5466
mTaskMutex.unlock();
5567

5668
return RT_OK;
@@ -62,7 +74,7 @@ rtError rtThreadQueue::process(double maxSeconds)
6274
double start = pxSeconds();
6375
do
6476
{
65-
ThreadQueueEntry entry;
77+
rtThreadQueueEntry entry;
6678
mTaskMutex.lock();
6779
if (!mTasks.empty())
6880
{

src/rtThreadQueue.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@
2626
#include <deque>
2727

2828
typedef void (*rtThreadTaskCB)(void* context, void* data);
29+
typedef bool (*rtThreadQueueRemoveTaskCB)(void* context, void* data);
2930

30-
struct ThreadQueueEntry
31+
struct rtThreadQueueEntry
3132
{
3233
rtThreadTaskCB task;
3334
void* context;
@@ -44,14 +45,14 @@ class rtThreadQueue
4445
// Thread safe
4546
rtError addTask(rtThreadTaskCB t, void* context, void* data);
4647

47-
rtError removeAllTasksForObject(void* context);
48+
rtError removeAllTasksForObject(void* context, rtThreadQueueRemoveTaskCB cb = nullptr);
4849

4950
// Invoke this method periodically on the dispatching (owning) thread
5051
// maxSeconds=0 means process until empty
5152
rtError process(double maxSeconds = 0);
5253

5354
private:
54-
std::deque<ThreadQueueEntry> mTasks;
55+
std::deque<rtThreadQueueEntry> mTasks;
5556
rtMutex mTaskMutex;
5657
};
5758
#endif //RT_THREAD_QUEUE_H

0 commit comments

Comments
 (0)