From 5dccc85bdc3836239c2a8124541074366defb573 Mon Sep 17 00:00:00 2001 From: Brian Demsky Date: Thu, 24 May 2012 13:32:55 -0700 Subject: [PATCH] wow, this is a nasty bug... 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. --- snapshot.cc | 9 ++++++++- snapshot.h | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/snapshot.cc b/snapshot.cc index 20980015..7105d2c6 100644 --- a/snapshot.cc +++ b/snapshot.cc @@ -134,8 +134,15 @@ extern "C" { #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); + struct sigaction sa; - 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 ){ diff --git a/snapshot.h b/snapshot.h index 4625c5d5..819ea0a4 100644 --- a/snapshot.h +++ b/snapshot.h @@ -2,6 +2,8 @@ #define _SNAPSHOT_H #define PAGESIZE 4096 #define USE_CHECKPOINTING 1 +/* Size of signal stack */ +#define SIGSTACKSIZE 16384 typedef unsigned int snapshot_id; -- 2.34.1