Skip to content

Commit

Permalink
move signal-unsafe functions out of signal handlers
Browse files Browse the repository at this point in the history
A signal interrupts the blocking function calls in the main iteration, so
there is really no need to do (unsafe) heavy lifting in the signal handler.

Closes #705
  • Loading branch information
derf committed Oct 2, 2023
1 parent 4d40380 commit c73aab0
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 20 deletions.
34 changes: 34 additions & 0 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,28 @@ int main(int argc, char **argv)
return(sig_exit);
}

static void feh_process_signal(void)
{
winwidget winwid = winwidget_get_first_window_of_type(WIN_TYPE_SLIDESHOW);
int i;
int signo = sig_received;
sig_received = 0;

if (winwid) {
if (filelist_len > 1) {
if (signo == SIGUSR1)
slideshow_change_image(winwid, SLIDE_NEXT, 1);
else if (signo == SIGUSR2)
slideshow_change_image(winwid, SLIDE_PREV, 1);
} else {
feh_reload_image(winwid, 0, 0);
}
} else if (opt.multiwindow) {
for (i = window_num - 1; i >= 0; i--)
feh_reload_image(windows[i], 0, 0);
}
}

/* Return 0 to stop iterating, 1 if ok to continue. */
int feh_main_iteration(int block)
{
Expand All @@ -124,6 +146,10 @@ int feh_main_iteration(int block)
if (window_num == 0 || sig_exit != 0)
return(0);

if (sig_received) {
feh_process_signal();
}

if (first) {
/* Only need to set these up the first time */
xfd = ConnectionNumber(disp);
Expand Down Expand Up @@ -156,6 +182,10 @@ int feh_main_iteration(int block)

if (window_num == 0 || sig_exit != 0)
return(0);

if (sig_received) {
feh_process_signal();
}
}
XFlush(disp);

Expand Down Expand Up @@ -249,6 +279,10 @@ int feh_main_iteration(int block)
if (window_num == 0 || sig_exit != 0)
return(0);

if (sig_received) {
feh_process_signal();
}

return(1);
}

Expand Down
22 changes: 2 additions & 20 deletions src/signals.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "options.h"

void feh_handle_signal(int);
volatile int sig_received = 0;
volatile int sig_exit = 0;

void setup_signal_handlers(void)
Expand Down Expand Up @@ -71,9 +72,6 @@ void setup_signal_handlers(void)

void feh_handle_signal(int signo)
{
winwidget winwid;
int i;

switch (signo) {
case SIGALRM:
if (childpid)
Expand All @@ -92,21 +90,5 @@ void feh_handle_signal(int signo)
return;
}

winwid = winwidget_get_first_window_of_type(WIN_TYPE_SLIDESHOW);

if (winwid) {
if (filelist_len > 1) {
if (signo == SIGUSR1)
slideshow_change_image(winwid, SLIDE_NEXT, 1);
else if (signo == SIGUSR2)
slideshow_change_image(winwid, SLIDE_PREV, 1);
} else {
feh_reload_image(winwid, 0, 0);
}
} else if (opt.multiwindow) {
for (i = window_num - 1; i >= 0; i--)
feh_reload_image(windows[i], 0, 0);
}

return;
sig_received = signo;
}
1 change: 1 addition & 0 deletions src/signals.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,5 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

void setup_signal_handlers(void);
extern volatile int sig_exit;
extern volatile int sig_received;
#endif

0 comments on commit c73aab0

Please sign in to comment.