yshui / picom

A lightweight compositor for X11 with animation support
https://picom.app/
Other
4.1k stars 587 forks source link

No signal handling during config reload #639

Open nick87720z opened 3 years ago

nick87720z commented 3 years ago

Platform

gentoo (calculate)

GPU, drivers, and screen setup

Intel B950 (sandybridge with ssse3), modesetting (i965), xorg-1.20.11

glxinfo -B ``` $ glxinfo -B name of display: :0 display: :0 screen: 0 direct rendering: Yes Extended renderer info (GLX_MESA_query_renderer): Vendor: Intel Open Source Technology Center (0x8086) Device: Mesa DRI Intel(R) HD Graphics 2000 (SNB GT1) (0x106) Version: 21.0.3 Accelerated: yes Video memory: 1536MB Unified memory: yes Preferred profile: core (0x1) Max core profile version: 3.3 Max compat profile version: 3.0 Max GLES1 profile version: 1.1 Max GLES[23] profile version: 3.0 OpenGL vendor string: Intel Open Source Technology Center OpenGL renderer string: Mesa DRI Intel(R) HD Graphics 2000 (SNB GT1) OpenGL core profile version string: 3.3 (Core Profile) Mesa 21.0.3 OpenGL core profile shading language version string: 3.30 OpenGL core profile context flags: (none) OpenGL core profile profile mask: core profile OpenGL version string: 3.0 Mesa 21.0.3 OpenGL shading language version string: 1.30 OpenGL context flags: (none) OpenGL ES profile version string: OpenGL ES 3.0 Mesa 21.0.3 OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00 ```

Environment

custom xsession, including xfwm4 (compositing off for picom).

picom version

git commit d9c97421324b51c8beefacc7e66a2218ab3e5247

Diagnostics ``` $ picom --diagnostics [ 06/14/21 12:48:35.347 get_cfg WARN ] Dual-kawase blur is not implemented by the legacy backends, you must use the `experimental-backends` option. [ 06/14/21 12:48:35.399 glx_has_extension INFO ] Found GLX extension GLX_SGI_video_sync. [ 06/14/21 12:48:35.399 glx_has_extension INFO ] Found GLX extension GLX_SGI_swap_control. [ 06/14/21 12:48:35.399 glx_has_extension INFO ] Found GLX extension GLX_OML_sync_control. [ 06/14/21 12:48:35.399 glx_has_extension INFO ] Found GLX extension GLX_MESA_swap_control. [ 06/14/21 12:48:35.399 glx_has_extension INFO ] Found GLX extension GLX_EXT_swap_control. [ 06/14/21 12:48:35.399 glx_has_extension INFO ] Found GLX extension GLX_EXT_texture_from_pixmap. [ 06/14/21 12:48:35.399 glx_has_extension INFO ] Found GLX extension GLX_ARB_create_context. [ 06/14/21 12:48:35.399 glx_has_extension INFO ] Found GLX extension GLX_EXT_buffer_age. [ 06/14/21 12:48:35.399 glx_has_extension INFO ] Found GLX extension GLX_MESA_query_renderer. [ 06/14/21 12:48:35.462 init_render WARN ] Old backends only support blur method "kernel". Your blur setting will not be applied **Version:** vgit-d9c97 ### Extensions: * Shape: Yes * XRandR: Yes * Present: Present ### Misc: * Use Overlay: Yes * Config file used: /home/nick87720z/.config/picom.conf ### Drivers (inaccurate): modesetting ### Backend: glx [ 06/14/21 12:48:35.481 gl_has_extension INFO ] Missing GL extension GL_GREMEDY_string_marker. * Driver vendors: * GLX: Mesa Project and SGI * GL: Intel Open Source Technology Center * GL renderer: Mesa DRI Intel(R) HD Graphics 2000 (SNB GT1) * Accelerated: 1 ```

Configuration:

Configuration file ``` log-level = "info"; shadow = false; shadow-radius = 20; shadow-offset-x = -20; shadow-offset-y = -20; shadow-opacity = 0.3; shadow-red = 0.0; shadow-green = 0.0; shadow-blue = 0.0; # "_GTK_FRAME_EXTENTS@:c" shadow-exclude = [ "class_g = 'Xfwm4'", "class_g = 'Conky'", "class_g ?= 'Notify-osd'", "class_g = 'Cairo-clock'", "window_type = 'dock' && class_g = 'Plank'" ]; #clear-shadow = true; shadow-ignore-shaped = false; inactive-opacity = 1.0; active-opacity = 1.0; frame-opacity = 1.0; inactive-opacity-override = false; inactive-dim = 0.2; blur-background-exclude = [ "window_type = 'desktop'", "window_type = 'notify'", "window_type = 'dock' && class_g = 'Plank'", "window_type = 'dock' && class_g = 'Tint2'", "class_g = 'Xfce4-screenshooter'" ]; fading = false; fade-in-step = 0.05; fade-out-step = 0.05; fade-exclude = [ ]; backend = "glx"; mark-wmwin-focused = true; mark-ovredir-focused = true; detect-rounded-corners = false; detect-client-opacity = true; refresh-rate = 0; vsync = true; dbe = true; glx-no-rebind-pixmap = true; glx-no-stencil = true; use-damage = true; #glx-swap-method = "buffer-age"; focus-exclude = [ "class_g = 'Cairo-clock'" ]; detect-transient = true; detect-client-leader = true; #invert-color-include = [ "class_g = 'Gcolor3'" ]; wintypes : { tooltip : { fade = true; shadow = false; full-shadow = true; opacity = 1.0; focus = true; } notify: { shadow = false; full-shadow = true; } dock: { shadow = false; full-shadow = false; } dnd: { shadow = false; } popup_menu: { opacity = 1.0; } dropdown_menu: { opacity = 1.0; } }; fade-delta = 10; blur-background = true; blur-background-frame = true; blur-background-fixed = false; resize-damage = 3; blur: { method = "dual_kawase"; # kernel, gaussian, dual_kawase size = 7; deviation = 3.0; strength = 4; kernel = "3x3gaussian"; } inactive-dim-fixed = false; dbus = true; // Paste your configuration here ```

Steps of reproduction

  1. Start picom with disabled experimental backends
  2. In another terminal: while killall -USR1 picom; do sleep 0.15; done
  3. Decrease sleep argument until picom quits in few seconds (not a crash)
  4. Start picom with experimental backends on, then do steps 2, 3

Expected behavior

Should handle them.

Current Behavior

Terminated on too much signals, which I suspect to be default handler when app handler doesn't it in time (hence difference between required frequency to trigger this bug, depending on experimental backends option status). If picom was started from terminal (at least bash) - it ends output with message from shell:

User defined signal 1
nick87720z commented 3 years ago

picom-trace.log

nick87720z commented 3 years ago

It's certainly not just too high signals rate. I tried minimal example:

sleep (3);
puts ("usr1");
fflush (stdout);

and set with SA_NODEFER option (to not block this signal until handler is done), handles ok (though output doesn't appear before all events are done). https://gist.github.com/nick87720z/1d3efc7280d130b71ceb55398b93a0c8

nick87720z commented 3 years ago

I suspect, this is how event loop system is used. Event loop seems to be restarted by config reloading. But since it manages signals automatically, this causes signal handlers to be uninstalled for brief period between loop quit and new start. Some signals could pass during this period.

Although case with SIGUSR1 look not more than abuse, cases with INT,TERM and like signals should be more real if picom must handle them specially.