Unverified Commit c73aab03 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

move signal-unsafe functions out of signal handlers

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
parent 4d40380e
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
@@ -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)
{
@@ -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);
@@ -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);

@@ -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);
}

+2 −20
Original line number Diff line number Diff line
@@ -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)
@@ -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)
@@ -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 −0
Original line number Diff line number Diff line
@@ -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