Bug 434647 - Assert in tool invocations
Summary: Assert in tool invocations
Status: RESOLVED FIXED
Alias: None
Product: krita
Classification: Applications
Component: General (other bugs)
Version First Reported In: git master (please specify the git hash!)
Platform: Mint (Ubuntu based) Linux
: NOR crash
Target Milestone: ---
Assignee: Krita Bugs
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-03-20 01:44 UTC by Tiar
Modified: 2021-08-02 15:17 UTC (History)
0 users

See Also:
Latest Commit:
Version Fixed/Implemented In:
Sentry Crash Report:


Attachments
Crash log for all threads (42.92 KB, text/plain)
2021-03-20 01:44 UTC, Tiar
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Tiar 2021-03-20 01:44:18 UTC
Created attachment 136868 [details]
Crash log for all threads

SUMMARY
I got an assert but while I could move the dialog window, I couldn't click on "Abort"? I don't know... but I used ctrl+C eventually.

This might be related to https://invent.kde.org/graphics/krita/-/merge_requests/693 ?

STEPS TO REPRODUCE
I was just painting, doing usual stuff: paint, sample a color, undo...
No known specific steps to reproduce.

OBSERVED RESULT
Assert

EXPECTED RESULT
No assert! :D

SOFTWARE/OS VERSIONS
Krita

 Version: 5.0.0-prealpha (git e87d7f580a)
 Languages: pl_PL, pl, pl_PL, pl
 Hidpi: true

Qt

  Version (compiled): 5.11.1
  Version (loaded): 5.11.1


ADDITIONAL INFORMATION
From the Krita log file I got the safe assert message:
20 Mar 2021 02:27:59 +0100: SAFE ASSERT (krita): "it == end" in file /home/tymon/kritadev/krita/libs/image/kis_strokes_queue.cpp, line 152
---
^C
Thread 1 "krita" received signal SIGINT, Interrupt.
syscall () at ../sysdeps/unix/sysv/linux/x86_64/syscall.S:38
38	../sysdeps/unix/sysv/linux/x86_64/syscall.S: Nie ma takiego pliku ani katalogu.
(gdb) bt
#0  0x00007ffff3e382e9 in syscall ()
    at ../sysdeps/unix/sysv/linux/x86_64/syscall.S:38
#1  0x00007ffff4562c25 in QBasicMutex::lockInternal() ()
    at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#2  0x00007ffff5bae277 in QMutexLocker::QMutexLocker(QBasicMutex*) (m=0x5555602cea20, this=<synthetic pointer>)
    at /usr/include/x86_64-linux-gnu/qt5/QtCore/qmutex.h:206
#3  0x00007ffff5bae277 in KisStrokesQueue::isEmpty() const (this=0x55555faed3e0) at /home/tymon/kritadev/krita/libs/image/kis_strokes_queue.cpp:608
#4  0x00007ffff5bba73d in KisUpdateScheduler::tryBarrierLock() (this=0x55555eb2f150) at /home/tymon/kritadev/krita/libs/image/kis_update_scheduler.cpp:363
#5  0x00007ffff5bba79d in KisUpdateScheduler::isIdle() (this=0x55555eb2f150)
    at /home/tymon/kritadev/krita/libs/image/kis_update_scheduler.cpp:336
#6  0x00007ffff5bd89c3 in KisImage::isIdle(bool) (this=this@entry=0x5555712512c0, allowLocked=allowLocked@entry=false)
    at /home/tymon/kritadev/krita/libs/image/kis_image.cc:740
#7  0x00007ffff5d57d66 in KisIdleWatcher::isIdle() const (this=0x55555f845b10)
    at /home/tymon/kritadev/krita/libs/global/kis_shared_ptr.h:167
#8  0x00007ffff5d583b9 in KisIdleWatcher::slotIdleCheckTick() (this=0x55555f845b10) at /home/tymon/kritadev/krita/libs/image/kis_idle_watcher.cpp:109
#9  0x00007ffff47416db in QMetaObject::activate(QObject*, int, int, void**) ()
    at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#10 0x00007ffff474d407 in QTimer::timeout(QTimer::QPrivateSignal) ()
---Type <return> to continue, or q <return> to quit---
    at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#11 0x00007ffff4741f4b in QObject::event(QEvent*) ()
    at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#12 0x00007ffff50d74a1 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#13 0x00007ffff50deae0 in QApplication::notify(QObject*, QEvent*) ()
    at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#14 0x00007ffff6ff7f17 in KisApplication::notify(QObject*, QEvent*) (this=<optimized out>, receiver=0x55555f845c20, event=0x7fffffffbc70)
    at /home/tymon/kritadev/krita/libs/ui/KisApplication.cpp:711
#15 0x00007ffff4718499 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#16 0x00007ffff4769558 in QTimerInfoList::activateTimers() ()
    at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#17 0x00007ffff4769dec in  () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#18 0x00007ffff062bd5e in g_main_context_dispatch ()
    at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#19 0x00007ffff062bff8 in  () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#20 0x00007ffff062c08c in g_main_context_iteration ()
    at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#21 0x00007ffff476a143 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#22 0x00007fffea761e51 in  () at /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5
---Type <return> to continue, or q <return> to quit---
#23 0x00007ffff471716b in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#24 0x00007ffff52c222d in QDialog::exec() ()
    at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#25 0x00007ffff52f598d in  () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#26 0x00007ffff563b669 in kis_assert_common(char const*, char const*, int, bool, bool) (assertion=0x7ffff5e2715d "it == end", file=0x7ffff5e26f88 "/home/tymon/kritadev/krita/libs/image/kis_strokes_queue.cpp", line=152, throwException=false, isIgnorable=true)
    at /usr/include/x86_64-linux-gnu/qt5/QtCore/qcoreapplication.h:116
#27 0x00007ffff563b8fd in kis_safe_assert_recoverable(char const*, char const*, int) (assertion=assertion@entry=0x7ffff5e2715d "it == end", file=file@entry=0x7ffff5e26f88 "/home/tymon/kritadev/krita/libs/image/kis_strokes_queue.cpp", line=line@entry=152) at /home/tymon/kritadev/krita/libs/global/kis_assert.cpp:107
#28 0x00007ffff5bb0702 in KisStrokesQueue::Private::startLod0ToNStroke(int, bool) (this=0x5555602ce9f0, levelOfDetail=1, forgettable=false)
    at /home/tymon/kritadev/krita/libs/image/kis_strokes_queue.cpp:152
#29 0x00007ffff5bb1db2 in KisStrokesQueue::startStroke(KisStrokeStrategy*) (this=0x55555faed3e0, strokeStrategy=0x55557410b540)
    at /home/tymon/kritadev/krita/libs/image/kis_strokes_queue.cpp:295
#30 0x00007ffff5bbadb9 in KisUpdateScheduler::startStroke(KisStrokeStrategy*) (this=0x55555eb2f150, strokeStrategy=<optimized out>)
    at /home/tymon/kritadev/krita/libs/image/kis_update_scheduler.cpp:209
---Type <return> to continue, or q <return> to quit---
#31 0x00007ffff5be6442 in KisImage::startStroke(KisStrokeStrategy*) (this=0x5555712512c0, strokeStrategy=0x55557410b540)
    at /home/tymon/kritadev/krita/libs/image/kis_image.cc:1779
#32 0x00007ffff6e4ce06 in KisToolFreehandHelper::initPaintImpl(double, KisPaintInformation const&, KoCanvasResourceProvider*, KisWeakSharedPtr<KisImage>, KisSharedPtr<KisNode>, KisStrokesFacade*, KisSharedPtr<KisNode>, KisSharedPtr<KisDefaultBoundsBase>) (this=0x555571fc7630, startAngle=-2.154350757598877, pi=..., resourceManager=<optimized out>, image=..., currentNode=..., strokesFacade=0x5555712512d0, overrideNode=..., bounds=...)
    at /home/tymon/kritadev/krita/libs/ui/tool/kis_tool_freehand_helper.cpp:298
#33 0x00007ffff6e4dcd1 in KisToolFreehandHelper::initPaint(KoPointerEvent*, QPointF const&, KisWeakSharedPtr<KisImage>, KisSharedPtr<KisNode>, KisStrokesFacade*, KisSharedPtr<KisNode>, KisSharedPtr<KisDefaultBoundsBase>) (this=0x555571fc7630, event=<optimized out>, pixelCoords=..., image=..., currentNode=..., strokesFacade=0x5555712512d0, overrideNode=..., bounds=...)
    at /usr/include/c++/8/bits/atomic_base.h:512
#34 0x00007ffff6e458bb in KisToolFreehand::initStroke(KoPointerEvent*) (this=0x555571384460, event=0x7fffffffc9a0)
    at /home/tymon/kritadev/krita/libs/global/kis_shared_ptr.h:419
#35 0x00007ffff6e46dce in KisToolFreehand::beginPrimaryAction(KoPointerEvent*) (this=0x555571384460, event=0x7fffffffc9a0)
    at /home/tymon/kritadev/krita/libs/ui/tool/kis_tool_freehand.cc:215
#36 0x00007ffff6ba6483 in KisToolProxy::forwardToTool(KisToolProxy::ActionState,---Type <return> to continue, or q <return> to quit---
 KisTool::ToolAction, QEvent*, QPointF const&) (this=0x555566d28e30, state=KisToolProxy::BEGIN, action=KisTool::Primary, event=0x7fffffffd4a0, docPoint=...)
    at /home/tymon/kritadev/krita/libs/ui/canvas/kis_tool_proxy.cpp:172
#37 0x00007ffff6ba65eb in KisToolProxy::forwardEvent(KisToolProxy::ActionState, KisTool::ToolAction, QEvent*, QEvent*) (this=0x555566d28e30, state=KisToolProxy::BEGIN, action=KisTool::Primary, event=<optimized out>, originalEvent=0x7fffffffd4a0) at /home/tymon/kritadev/krita/libs/ui/canvas/kis_tool_proxy.cpp:121
#38 0x00007ffff6f7d331 in KisToolInvocationAction::begin(int, QEvent*) (this=<optimized out>, shortcut=<optimized out>, event=0x7fffffffd4a0)
    at /usr/include/c++/8/bits/atomic_base.h:390
#39 0x00007ffff6f8dafa in KisShortcutMatcher::tryRunReadyShortcut(Qt::MouseButton, QEvent*) (this=0x55555a286780, button=Qt::LeftButton, event=0x7fffffffd4a0)
    at /home/tymon/kritadev/krita/libs/ui/input/kis_shortcut_matcher.cpp:636
#40 0x00007ffff6f8dd34 in KisShortcutMatcher::buttonPressed(Qt::MouseButton, QEvent*) (this=0x55555a286780, button=Qt::LeftButton, event=0x7fffffffd4a0)
    at /home/tymon/kritadev/krita/libs/ui/input/kis_shortcut_matcher.cpp:259
#41 0x00007ffff6f6ce04 in KisInputManager::eventFilterImpl(QEvent*) [clone .localalias.272] (this=0x55555a28c8f8, event=0x7fffffffd4a0)
    at /home/tymon/kritadev/krita/libs/ui/input/kis_input_manager.cpp:540
#42 0x00007ffff47181ab in QCoreApplicationPrivate::sendThroughObjectEventFilters(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#43 0x00007ffff50d7491 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
---Type <return> to continue, or q <return> to quit---
#44 0x00007ffff50df0d8 in QApplication::notify(QObject*, QEvent*) ()
    at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#45 0x00007ffff6ff7f17 in KisApplication::notify(QObject*, QEvent*) (this=<optimized out>, receiver=0x5555708663f0, event=0x7fffffffd4a0)
    at /home/tymon/kritadev/krita/libs/ui/KisApplication.cpp:711
#46 0x00007ffff4718499 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#47 0x00007ffff5132820 in  () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#48 0x00007ffff5132d9d in  () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#49 0x00007ffff50d74a1 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#50 0x00007ffff50deae0 in QApplication::notify(QObject*, QEvent*) ()
    at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#51 0x00007ffff6ff7f17 in KisApplication::notify(QObject*, QEvent*) (this=<optimized out>, receiver=0x55555fc98340, event=0x7fffffffd8f0)
    at /home/tymon/kritadev/krita/libs/ui/KisApplication.cpp:711
#52 0x00007ffff4718499 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#53 0x00007ffff4b1e025 in QGuiApplicationPrivate::processTabletEvent(QWindowSystemInterfacePrivate::TabletEvent*) ()
    at /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#54 0x00007ffff4b1f3e5 in QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*) ()
---Type <return> to continue, or q <return> to quit---
    at /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#55 0x00007ffff4af9b6b in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#56 0x00007fffea761e5b in  () at /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5
#57 0x00007ffff471716b in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#58 0x00007ffff471f2e2 in QCoreApplication::exec() ()
    at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#59 0x0000555555e2a21b in main (argc=<optimized out>, argv=0x7fffffffde48)
    at /home/tymon/kritadev/krita/krita/main.cc:663
#60 0x00007ffff3d47b6b in __libc_start_main (main=
    0x555555e28890 <main>, argc=1, argv=0x7fffffffde48, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffde38)
    at ../csu/libc-start.c:308
#61 0x0000555555e2b2da in _start ()
    at /home/tymon/kritadev/krita/krita/main.cc:468
(gdb) thread apply all bt
Comment 1 Dmitry Kazakov 2021-08-02 15:17:41 UTC
Git commit 5c6d30a5d1de83128e73fff9f61b12d34cfacd5d by Dmitry Kazakov.
Committed on 02/08/2021 at 15:17.
Pushed by dkazakov into branch 'master'.

Rename KisImage::lock() into KisImage::immediateLockForReadOnly()

If we lock for write we must regenerate LodN planes, which
is not possible right inside the stroke. Therefore, if you
need to lock the image for write you need to use
image->barrierLock(). It ensures that all the strokes are
finished before you do any modifications to the image.

M  +3    -3    libs/image/kis_image.cc
M  +1    -1    libs/image/kis_image.h
M  +3    -3    libs/image/kis_update_scheduler.cpp
M  +1    -1    libs/image/kis_update_scheduler.h
M  +1    -1    libs/image/tests/kis_update_scheduler_test.cpp
M  +1    -1    libs/ui/canvas/kis_canvas2.cpp
M  +1    -1    plugins/dockers/recorder/recorder_writer.cpp
M  +4    -2    plugins/tools/basictools/kis_tool_colorsampler.cc

https://invent.kde.org/graphics/krita/commit/5c6d30a5d1de83128e73fff9f61b12d34cfacd5d
Comment 2 Dmitry Kazakov 2021-08-02 15:17:49 UTC
Git commit ad9e3211d82204ff9461c45aec2b82f5f95bd306 by Dmitry Kazakov.
Committed on 02/08/2021 at 15:17.
Pushed by dkazakov into branch 'master'.

Fix an assert in KisStrokesQueue when cancelling LoDN stroke too quickly

When the user cancells the stroke with Esc key and starts a new stroke
with instant preview too quickly, the queue may enter a race condition,
when the current lod range is not estimated correctly. To overcome this
issue, we now add a fake legacy stroke into the end of the queue to
make sure that the lod range is properly closed.

M  +22   -2    libs/image/kis_strokes_queue.cpp
M  +100  -0    libs/image/tests/kis_strokes_queue_test.cpp
M  +2    -0    libs/image/tests/kis_strokes_queue_test.h

https://invent.kde.org/graphics/krita/commit/ad9e3211d82204ff9461c45aec2b82f5f95bd306