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
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
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