From 91b4f288f9ea0b3389150da9363e95a7804d81ac Mon Sep 17 00:00:00 2001 From: Olaf Barthel Date: Wed, 5 Apr 2006 08:39:46 +0000 Subject: [PATCH] - The default break signal mask (SIGBREAKF_CTRL_C) is no longer hard-coded. You can override it at link time with a different variable value for __break_signal_mask. This may have to be augmented by an API for changing the value. git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15094 87f5fb63-7c3d-0410-a384-fd976d0f7a62 --- library/GNUmakefile.68k | 3 ++- library/GNUmakefile.os4 | 3 ++- library/changes | 5 ++++ library/include/dos.h | 15 ++++++++++- library/signal_checkabort.c | 4 +-- library/signal_kill.c | 4 +-- library/signal_mask.c | 44 ++++++++++++++++++++++++++++++++ library/smakefile | 3 ++- library/socket_init_exit.c | 4 +-- library/socket_select_signal.c | 18 ++++++------- library/stdio_record_locking.c | 4 +-- library/unistd_time_delay.c | 8 +++--- library/unistd_wildcard_expand.c | 8 +++--- 13 files changed, 94 insertions(+), 29 deletions(-) create mode 100644 library/signal_mask.c diff --git a/library/GNUmakefile.68k b/library/GNUmakefile.68k index bc79c2c..deae8e9 100644 --- a/library/GNUmakefile.68k +++ b/library/GNUmakefile.68k @@ -1,5 +1,5 @@ # -# $Id: GNUmakefile.68k,v 1.83 2006-04-05 08:24:32 obarthel Exp $ +# $Id: GNUmakefile.68k,v 1.84 2006-04-05 08:39:45 obarthel Exp $ # # :ts=8 # @@ -169,6 +169,7 @@ C_LIB = \ signal_checkabort.o \ signal_data.o \ signal_kill.o \ + signal_mask.o \ signal_raise.o \ signal_sigaddset.o \ signal_sigblock.o \ diff --git a/library/GNUmakefile.os4 b/library/GNUmakefile.os4 index a789fc4..f4852e7 100644 --- a/library/GNUmakefile.os4 +++ b/library/GNUmakefile.os4 @@ -1,5 +1,5 @@ # -# $Id: GNUmakefile.os4,v 1.95 2006-04-05 07:53:24 obarthel Exp $ +# $Id: GNUmakefile.os4,v 1.96 2006-04-05 08:39:45 obarthel Exp $ # # :ts=8 # @@ -210,6 +210,7 @@ C_LIB = \ signal_checkabort.o \ signal_data.o \ signal_kill.o \ + signal_mask.o \ signal_raise.o \ signal_sigaddset.o \ signal_sigblock.o \ diff --git a/library/changes b/library/changes index a75acd4..29151d5 100644 --- a/library/changes +++ b/library/changes @@ -1,3 +1,8 @@ +- The default break signal mask (SIGBREAKF_CTRL_C) is no longer + hard-coded. You can override it at link time with a different + variable value for __break_signal_mask. This may have to be + augmented by an API for changing the value. + - Added a wait_select() function which works very much like the bsdsocket.library/WaitSelect() function. diff --git a/library/include/dos.h b/library/include/dos.h index fbdf343..568ffab 100644 --- a/library/include/dos.h +++ b/library/include/dos.h @@ -1,5 +1,5 @@ /* - * $Id: dos.h,v 1.18 2006-01-08 12:06:14 obarthel Exp $ + * $Id: dos.h,v 1.19 2006-04-05 08:39:46 obarthel Exp $ * * :ts=4 * @@ -123,6 +123,19 @@ extern void __check_abort(void); /****************************************************************************/ +/* + * You can override the default break signal mask which is used by + * __check_abort() and other functions. This must be done at link + * time because the break signal checking is set up very early on + * while the program startup code is preparing your code to be run. + * In particular, this affects the socket I/O functionality which + * configures the break signal only once. The default value of the + * __break_signal_mask variable is SIGBREAKF_CTRL_C. + */ +extern ULONG __break_signal_mask; + +/****************************************************************************/ + /* * Call this function to set up the environment information for your * program to access its data. This is typically used in Task or Process diff --git a/library/signal_checkabort.c b/library/signal_checkabort.c index e7cc5ad..45ca57b 100644 --- a/library/signal_checkabort.c +++ b/library/signal_checkabort.c @@ -1,5 +1,5 @@ /* - * $Id: signal_checkabort.c,v 1.3 2006-01-08 12:04:24 obarthel Exp $ + * $Id: signal_checkabort.c,v 1.4 2006-04-05 08:39:45 obarthel Exp $ * * :ts=4 * @@ -44,6 +44,6 @@ void __check_abort(void) { - if(__check_abort_enabled && FLAG_IS_SET(SetSignal(0,SIGBREAKF_CTRL_C),SIGBREAKF_CTRL_C)) + if(__check_abort_enabled && FLAG_IS_SET(SetSignal(0,__break_signal_mask),__break_signal_mask)) raise(SIGINT); } diff --git a/library/signal_kill.c b/library/signal_kill.c index 0936337..2b32ed1 100644 --- a/library/signal_kill.c +++ b/library/signal_kill.c @@ -1,5 +1,5 @@ /* - * $Id: signal_kill.c,v 1.7 2006-01-08 12:04:24 obarthel Exp $ + * $Id: signal_kill.c,v 1.8 2006-04-05 08:39:45 obarthel Exp $ * * :ts=4 * @@ -80,7 +80,7 @@ kill(pid_t pid, int signal_number) SHOWMSG("found the process"); if(signal_number == SIGTERM || signal_number == SIGINT) - Signal((struct Task *)pid,SIGBREAKF_CTRL_C); + Signal((struct Task *)pid,__break_signal_mask); else SHOWMSG("but won't shut it down"); } diff --git a/library/signal_mask.c b/library/signal_mask.c new file mode 100644 index 0000000..8897af3 --- /dev/null +++ b/library/signal_mask.c @@ -0,0 +1,44 @@ +/* + * $Id: signal_mask.c,v 1.1 2006-04-05 08:39:45 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2006 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _STDLIB_HEADERS_H +#include "stdlib_headers.h" +#endif /* _STDLIB_HEADERS_H */ + +#ifndef _SIGNAL_HEADERS_H +#include "signal_headers.h" +#endif /* _SIGNAL_HEADERS_H */ + +/****************************************************************************/ + +ULONG __break_signal_mask = SIGBREAKF_CTRL_C; diff --git a/library/smakefile b/library/smakefile index a278985..45c489b 100644 --- a/library/smakefile +++ b/library/smakefile @@ -1,5 +1,5 @@ # -# $Id: smakefile,v 1.60 2006-04-05 07:53:24 obarthel Exp $ +# $Id: smakefile,v 1.61 2006-04-05 08:39:45 obarthel Exp $ # # :ts=8 # @@ -315,6 +315,7 @@ SIGNAL_OBJ = \ signal_checkabort.o \ signal_data.o \ signal_kill.o \ + signal_mask.o \ signal_raise.o \ signal_sigaddset.o \ signal_sigblock.o \ diff --git a/library/socket_init_exit.c b/library/socket_init_exit.c index ee76ad5..e99bf13 100644 --- a/library/socket_init_exit.c +++ b/library/socket_init_exit.c @@ -1,5 +1,5 @@ /* - * $Id: socket_init_exit.c,v 1.25 2006-01-08 12:04:24 obarthel Exp $ + * $Id: socket_init_exit.c,v 1.26 2006-04-05 08:39:45 obarthel Exp $ * * :ts=4 * @@ -224,7 +224,7 @@ SOCKET_CONSTRUCTOR(socket_init) tags[1].ti_Tag = SBTM_SETVAL(SBTC_BREAKMASK); if(__check_abort_enabled) - tags[1].ti_Data = SIGBREAKF_CTRL_C; + tags[1].ti_Data = __break_signal_mask; else tags[1].ti_Data = 0; diff --git a/library/socket_select_signal.c b/library/socket_select_signal.c index 314b0ad..5177c7b 100644 --- a/library/socket_select_signal.c +++ b/library/socket_select_signal.c @@ -1,5 +1,5 @@ /* - * $Id: socket_select_signal.c,v 1.1 2006-04-05 07:53:24 obarthel Exp $ + * $Id: socket_select_signal.c,v 1.2 2006-04-05 08:39:45 obarthel Exp $ * * :ts=4 * @@ -762,7 +762,7 @@ __select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struc break_mask = signal_mask; if(__check_abort_enabled) - break_mask |= SIGBREAKF_CTRL_C; + break_mask |= __break_signal_mask; /* Check for socket input. */ PROFILE_OFF(); @@ -770,9 +770,9 @@ __select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struc PROFILE_ON(); /* Stop if a break signal arrives. */ - if((result < 0 && __get_errno() == EINTR) || FLAG_IS_SET(break_mask,SIGBREAKF_CTRL_C)) + if((result < 0 && __get_errno() == EINTR) || FLAG_IS_SET(break_mask,__break_signal_mask)) { - SetSignal(SIGBREAKF_CTRL_C,SIGBREAKF_CTRL_C); + SetSignal(__break_signal_mask,__break_signal_mask); __check_abort(); } @@ -919,15 +919,15 @@ __select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struc break_mask = signal_mask; if(__check_abort_enabled) - break_mask |= SIGBREAKF_CTRL_C; + break_mask |= __break_signal_mask; PROFILE_OFF(); result = __WaitSelect(total_socket_fd,socket_read_fds,socket_write_fds,socket_except_fds,timeout,&break_mask); PROFILE_ON(); - if((result < 0 && __get_errno() == EINTR) || FLAG_IS_SET(break_mask,SIGBREAKF_CTRL_C)) + if((result < 0 && __get_errno() == EINTR) || FLAG_IS_SET(break_mask,__break_signal_mask)) { - SetSignal(SIGBREAKF_CTRL_C,SIGBREAKF_CTRL_C); + SetSignal(__break_signal_mask,__break_signal_mask); __check_abort(); } @@ -1065,7 +1065,7 @@ __select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struc standard break signal bit, then we must not clear the break signal. The ^C checking depends upon it to remain set. */ - (*signal_mask_ptr) = signal_mask & SetSignal(0,signal_mask & ~SIGBREAKF_CTRL_C); + (*signal_mask_ptr) = signal_mask & SetSignal(0,signal_mask & ~__break_signal_mask); break; } @@ -1093,7 +1093,7 @@ __select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struc SHOWMSG("no files to worry about"); if(signal_mask != 0) - (*signal_mask_ptr) = signal_mask & SetSignal(0,signal_mask & ~SIGBREAKF_CTRL_C); + (*signal_mask_ptr) = signal_mask & SetSignal(0,signal_mask & ~__break_signal_mask); } } diff --git a/library/stdio_record_locking.c b/library/stdio_record_locking.c index fbb5045..72740eb 100644 --- a/library/stdio_record_locking.c +++ b/library/stdio_record_locking.c @@ -1,5 +1,5 @@ /* - * $Id: stdio_record_locking.c,v 1.15 2006-01-08 12:04:25 obarthel Exp $ + * $Id: stdio_record_locking.c,v 1.16 2006-04-05 08:39:45 obarthel Exp $ * * :ts=4 * @@ -1031,7 +1031,7 @@ __handle_record_locking(int cmd,struct flock * l,struct fd * fd,int * error_ptr) const int rand_max = RAND_MAX / 65536; int num_random_ticks; - if(__check_abort_enabled && (SetSignal(0,0) & SIGBREAKF_CTRL_C) != 0) + if(__check_abort_enabled && (SetSignal(0,0) & __break_signal_mask) != 0) { SHOWMSG("lock polling loop stopped"); diff --git a/library/unistd_time_delay.c b/library/unistd_time_delay.c index d09a372..a59b660 100644 --- a/library/unistd_time_delay.c +++ b/library/unistd_time_delay.c @@ -1,5 +1,5 @@ /* - * $Id: unistd_time_delay.c,v 1.8 2006-04-05 06:43:56 obarthel Exp $ + * $Id: unistd_time_delay.c,v 1.9 2006-04-05 08:39:45 obarthel Exp $ * * :ts=4 * @@ -103,7 +103,7 @@ __time_delay(unsigned long seconds,unsigned long microseconds) SetSignal(0,signals_to_wait_for); if(__check_abort_enabled) - SET_FLAG(signals_to_wait_for,SIGBREAKF_CTRL_C); + SET_FLAG(signals_to_wait_for,__break_signal_mask); PROFILE_OFF(); GetSysTime(&tv); @@ -119,7 +119,7 @@ __time_delay(unsigned long seconds,unsigned long microseconds) signals = Wait(signals_to_wait_for); PROFILE_ON(); - if(FLAG_IS_SET(signals,SIGBREAKF_CTRL_C)) + if(FLAG_IS_SET(signals,__break_signal_mask)) { ULONG seconds_now; @@ -128,7 +128,7 @@ __time_delay(unsigned long seconds,unsigned long microseconds) WaitIO((struct IORequest *)__timer_request); - SetSignal(SIGBREAKF_CTRL_C,SIGBREAKF_CTRL_C); + SetSignal(__break_signal_mask,__break_signal_mask); __check_abort(); /* Now figure out how many seconds have elapsed and diff --git a/library/unistd_wildcard_expand.c b/library/unistd_wildcard_expand.c index 6b9c4dc..1282512 100644 --- a/library/unistd_wildcard_expand.c +++ b/library/unistd_wildcard_expand.c @@ -1,5 +1,5 @@ /* - * $Id: unistd_wildcard_expand.c,v 1.16 2006-01-08 12:04:27 obarthel Exp $ + * $Id: unistd_wildcard_expand.c,v 1.17 2006-04-05 08:39:46 obarthel Exp $ * * :ts=4 * @@ -186,7 +186,7 @@ __wildcard_expand_init(void) { ap = AllocDosObjectTags(DOS_ANCHORPATH, ADO_Strlen, 2 * MAXPATHLEN, - ADO_Mask, (__check_abort_enabled) ? SIGBREAKF_CTRL_C : 0, + ADO_Mask, (__check_abort_enabled) ? __break_signal_mask : 0, TAG_END); if(ap == NULL) @@ -214,7 +214,7 @@ __wildcard_expand_init(void) ap->ap_Strlen = MAXPATHLEN; if(__check_abort_enabled) - ap->ap_BreakBits = SIGBREAKF_CTRL_C; + ap->ap_BreakBits = __break_signal_mask; } #endif /* __amigaos4__ */ @@ -308,7 +308,7 @@ __wildcard_expand_init(void) { __set_process_window(old_window_pointer); - SetSignal(SIGBREAKF_CTRL_C,SIGBREAKF_CTRL_C); + SetSignal(__break_signal_mask,__break_signal_mask); __check_abort(); old_window_pointer = __set_process_window((APTR)-1);