int startRouting (int column, int row, int screen) { #ifdef SIGUSR1 int started = 0; stopRouting(); switch (routingProcess = fork()) { case 0: { /* child: cursor routing subprocess */ int result = ROUTING_ERROR; if (!ROUTING_INTERVAL) { int niceness = nice(ROUTING_NICENESS); if (niceness == -1) { logSystemError("nice"); } } if (constructRoutingScreen()) { result = doRouting(column, row, screen); /* terminate child process */ destructRoutingScreen(); /* close second thread of screen reading */ } _exit(result); /* terminate child process */ } case -1: /* error: fork() failed */ logSystemError("fork"); routingProcess = NOT_ROUTING; break; default: /* parent: continue while cursor is being routed */ { static int first = 1; if (first) { first = 0; onProgramExit(exitRouting, "routing"); } } started = 1; break; } return started; #else /* SIGUSR1 */ routingStatus = doRouting(column, row, screen); return 1; #endif /* SIGUSR1 */ }
static void exitRouting (void) { stopRouting(); }
static void exitCursorRouting (void *data) { stopRouting(); }