the last part of the snapshot bug is the following:
we snapshot the user threads stack... when we get a seg fault,
the signal handler is using the same write protected stack...
obviously this is going to cause problems. luckily there is support
for a special stack for the signal handler. this checkin switches
the signal handler to run on a different stack than the program stack.
#endif
void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots, unsigned int nummemoryregions, unsigned int numheappages, MyFuncPtr entryPoint){
#if USE_CHECKPOINTING
#endif
void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots, unsigned int nummemoryregions, unsigned int numheappages, MyFuncPtr entryPoint){
#if USE_CHECKPOINTING
+ /* Setup a stack for our signal handler.... */
+ stack_t ss;
+ ss.ss_sp = MYMALLOC(SIGSTACKSIZE);
+ ss.ss_size = SIGSTACKSIZE;
+ ss.ss_flags = 0;
+ sigaltstack(&ss, NULL);
+
- sa.sa_flags = SA_SIGINFO | SA_NODEFER | SA_RESTART;
+ sa.sa_flags = SA_SIGINFO | SA_NODEFER | SA_RESTART | SA_ONSTACK;
sigemptyset( &sa.sa_mask );
sa.sa_sigaction = HandlePF;
if( sigaction( SIGSEGV, &sa, NULL ) == -1 ){
sigemptyset( &sa.sa_mask );
sa.sa_sigaction = HandlePF;
if( sigaction( SIGSEGV, &sa, NULL ) == -1 ){
#define _SNAPSHOT_H
#define PAGESIZE 4096
#define USE_CHECKPOINTING 1
#define _SNAPSHOT_H
#define PAGESIZE 4096
#define USE_CHECKPOINTING 1
+/* Size of signal stack */
+#define SIGSTACKSIZE 16384
typedef unsigned int snapshot_id;
typedef unsigned int snapshot_id;