- if(s1->num_reg != s2->num_reg){
- XBT_DEBUG("Different num_reg (s1 = %d, s2 = %d)", s1->num_reg, s2->num_reg);
- return 1;
- }
-
- int i;
- int errors = 0;
-
- for(i=0 ; i< s1->num_reg ; i++){
-
- if(s1->regions[i]->type != s2->regions[i]->type){
- if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
- XBT_DEBUG("Different type of region");
- errors++;
- }else{
- return 1;
- }
- }
-
- switch(s1->regions[i]->type){
- case 0:
- if(s1->regions[i]->size != s2->regions[i]->size){
- if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
- XBT_DEBUG("Different size of heap (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
- errors++;
- }else{
- return 1;
- }
- }
- if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
- if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
- XBT_DEBUG("Different start addr of heap (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
- errors++;
- }else{
- return 1;
- }
- }
- if(mmalloc_compare_heap(s1->regions[i]->data, s2->regions[i]->data)){
- if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
- XBT_DEBUG("Different heap (mmalloc_compare)");
- errors++;
- }else{
- return 1;
- }
- }
- break;
- case 1 :
- if(s1->regions[i]->size != s2->regions[i]->size){
- if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
- XBT_DEBUG("Different size of libsimgrid (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
- errors++;
- }else{
- return 1;
- }
- }
- if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
- if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
- XBT_DEBUG("Different start addr of libsimgrid (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
- errors++;
- }else{
- return 1;
- }
- }
- if(memcmp(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
- if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
- XBT_DEBUG("Different memcmp for data in libsimgrid");
- errors++;
- }else{
- return 1;
- }
- }
- break;
- /*case 2:
- if(s1->regions[i]->size != s2->regions[i]->size){
- if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
- XBT_DEBUG("Different size of program (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
- errors++;
- }else{
- return 1;
- }
- }
- if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
- if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
- XBT_DEBUG("Different start addr of program (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
- errors++;
- }else{
- return 1;
- }
- }
- if(memcmp(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
- if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
- XBT_DEBUG("Different memcmp for data in program");
- errors++;
- }else{
- return 1;
- }
- }
- break;*/
- case 3:
- if(s1->regions[i]->size != s2->regions[i]->size){
- if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
- XBT_DEBUG("Different size of stack (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
- errors++;
- }else{
- return 1;
- }
- }
- if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
- if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
- XBT_DEBUG("Different start addr of stack (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
- errors++;
- }else{
- return 1;
- }
- }
- if(memcmp(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
- if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
- XBT_DEBUG("Different memcmp for data in stack");
- errors++;
- }else{
- return 1;
- }
- }
- break;
- default:
- break;
+ if(setrlimit(RLIMIT_CORE, &core_limit) < 0)
+ fprintf(stderr, "setrlimit: %s\nWarning: core dumps may be truncated or non-existant\n", strerror(errno));
+
+ int status;
+ switch(fork()){
+ case 0:
+ // We are the child process -- run the actual program
+ xbt_abort();
+ break;
+
+ case -1:
+ // An error occurred, shouldn't happen
+ perror("fork");
+ return -1;
+
+ default:
+ // We are the parent process -- wait for the child process to exit
+ if(wait(&status) < 0)
+ perror("wait");
+ if(WIFSIGNALED(status) && WCOREDUMP(status)){
+ char *core_name = malloc(20);
+ sprintf(core_name,"core_%d", pair);
+ rename("core", core_name);
+ free(core_name);