kwin: fixing high cpu usage bugs

In some unfortunate situations it is possible that a window is deleted
before it is marked ready_for_painting=true. The last point is
especially troublesome for effects that reference the deleted window.

Many thanks to Elias Probst for all the testing.

CCBUG: 290025
CCBUG: 288948
REVIEW: 103733
This commit is contained in:
Philipp Knechtges 2012-01-19 11:38:04 +01:00
parent 87745d696d
commit d6e7ebcb26
2 changed files with 11 additions and 1 deletions

View file

@ -66,6 +66,15 @@ void Deleted::copyToDeleted(Toplevel* c)
{ {
assert(dynamic_cast< Deleted* >(c) == NULL); assert(dynamic_cast< Deleted* >(c) == NULL);
Toplevel::copyToDeleted(c); Toplevel::copyToDeleted(c);
// In some cases the window has been deleted before the sync request which marks
// the window ready for painting has finished. This is especially troublesome
// when effects reference the deleted window and the unreferencing is part of
// the rendering pass (e.g. Effect::postPaintScreen/postPaintWindow), which will
// never be executed because we remove it every time from the stacking list in
// Workspace::performCompositing.
if (!c->readyForPainting()) {
QTimer::singleShot(0, this, SLOT(discard()));
}
desk = c->desktop(); desk = c->desktop();
activityList = c->activities(); activityList = c->activities();
contentsRect = QRect(c->clientPos(), c->clientSize()); contentsRect = QRect(c->clientPos(), c->clientSize());

View file

@ -35,7 +35,6 @@ public:
// used by effects to keep the window around for e.g. fadeout effects when it's destroyed // used by effects to keep the window around for e.g. fadeout effects when it's destroyed
void refWindow(); void refWindow();
void unrefWindow(bool delay = false); void unrefWindow(bool delay = false);
void discard(allowed_t);
virtual int desktop() const; virtual int desktop() const;
virtual QStringList activities() const; virtual QStringList activities() const;
virtual QPoint clientPos() const; virtual QPoint clientPos() const;
@ -58,6 +57,8 @@ public:
} }
void layoutDecorationRects(QRect &left, QRect &top, QRect &right, QRect &bottom) const; void layoutDecorationRects(QRect &left, QRect &top, QRect &right, QRect &bottom) const;
QRect decorationRect() const; QRect decorationRect() const;
public slots:
void discard(allowed_t = Allowed);
protected: protected:
virtual void debug(QDebug& stream) const; virtual void debug(QDebug& stream) const;
virtual bool shouldUnredirect() const; virtual bool shouldUnredirect() const;