Ticket #2435: execution_monitor.ipp.patch

File execution_monitor.ipp.patch, 6.1 KB (added by pisymbol@…, 14 years ago)

Patch against current trunk to fix this issue on FreeBSD

  • execution_monitor.ipp

    old new  
    148148#   define BOOST_TEST_USE_ALT_STACK
    149149#  endif
    150150
     151#  if defined(__FreeBSD__)
     152#    if __FreeBSD_version <= 70000
     153#       define BOOST_SKIP_SIGNAL_TESTS
     154#       define BOOST_TEST_IGNORE_NON_ZERO_CHILD_CODE
     155#    endif
     156#  endif
     157
    151158#  if defined(SIGPOLL) && !defined(__CYGWIN__)                              && \
    152159      !(defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__))  && \
    153160      !defined(__NetBSD__)                                                  && \
     
    155162#    define BOOST_TEST_CATCH_SIGPOLL
    156163#  endif
    157164
     165#ifdef BOOST_SKIP_SIGNAL_TESTS
     166#  define BOOST_SKIP_SIGILL_TESTS
     167#  define BOOST_SKIP_SIGFPE_TESTS
     168#  define BOOST_SKIP_SIGSEGV_TESTS
     169#  define BOOST_SKIP_SIGBUS_TESTS
     170#  define BOOST_SKIP_SIGCHLD_TESTS
     171#  define BOOST_SKIP_SIGPOLL_TESTS
     172#endif
     173
    158174#  ifdef BOOST_TEST_USE_ALT_STACK
    159175#    define BOOST_TEST_ALT_STACK_SIZE SIGSTKSZ
    160176#  endif
     
    290306    switch( m_sig_info->si_signo ) {
    291307    case SIGILL:
    292308        switch( m_sig_info->si_code ) {
     309#ifndef BOOST_SKIP_SIGILL_TESTS
    293310        case ILL_ILLOPC:
    294311            report_error( execution_exception::system_fatal_error,
    295312                          "signal: illegal opcode; address of failing instruction: 0x%08lx",
     
    329346            report_error( execution_exception::system_fatal_error,
    330347                          "signal: internal stack error; address of failing instruction: 0x%08lx",
    331348                          m_sig_info->si_addr );
    332             break;
    333         }
    334         break;
     349            break;
     350#endif /* BOOST_SKIP_SIGILL_TESTS */
     351        default:
     352            report_error( execution_exception::system_fatal_error,
     353                    "signal: SIGILL (llegal instruction; address of failing instruction: 0x%08lx)",
     354                    m_sig_info->si_addr );
     355            break;
     356        }
    335357
    336358    case SIGFPE:
    337         switch( m_sig_info->si_code ) {
     359        switch( m_sig_info->si_code ) {
     360#ifndef BOOST_SKIP_SIGFPE_TESTS
    338361        case FPE_INTDIV:
    339362            report_error( execution_exception::system_error,
    340363                          "signal: integer divide by zero; address of failing instruction: 0x%08lx",
     
    375398                          "signal: subscript out of range; address of failing instruction: 0x%08lx",
    376399                          m_sig_info->si_addr );
    377400            break;
     401#endif /* BOOST_SKIP_SIGFPE_TESTS */
     402        default:
     403            report_error( execution_exception::system_error,
     404                    "signal: SIGFPE (errnoneous arithmetic operations; address of failing instruction: 0x%08lx)",
     405                          m_sig_info->si_addr );
     406            break;
    378407        }
    379         break;
    380408
    381409    case SIGSEGV:
    382410        switch( m_sig_info->si_code ) {
     411#ifndef BOOST_SKIP_SIGSEGV_TESTS
    383412        case SEGV_MAPERR:
    384413            report_error( execution_exception::system_fatal_error,
    385414                          "memory access violation at address: 0x%08lx: no mapping at fault address",
     
    390419                          "memory access violation at address: 0x%08lx: invalid permissions",
    391420                          m_sig_info->si_addr );
    392421            break;
     422#endif /* BOOST_SKIP_SIGSEGV_TESTS */
     423        default:
     424            report_error( execution_exception::system_fatal_error,
     425                          "signal: SIGSEGV (memory access violation at address: 0x%08lx: invalid permissions)",
     426                          m_sig_info->si_addr );
     427            break;
    393428        }
    394         break;
    395429
    396430    case SIGBUS:
    397431        switch( m_sig_info->si_code ) {
     432#ifndef BOOST_SKIP_SIGBUS_TESTS
    398433        case BUS_ADRALN:
    399434            report_error( execution_exception::system_fatal_error,
    400435                          "memory access violation at address: 0x%08lx: invalid address alignment",
     
    410445                          "memory access violation at address: 0x%08lx: object specific hardware error",
    411446                          m_sig_info->si_addr );
    412447            break;
    413         }
    414         break;
     448#endif /* BOOST_SKIP_SIGBUS_TESTS */
     449        default:
     450            report_error( execution_exception::system_fatal_error,
     451                    "signal: SIGBUS (memory access violation at address: 0x%08lx: object specific hardware error)",
     452                    m_sig_info->si_addr );
     453            break;
     454        }
    415455
    416456    case SIGCHLD:
    417457        switch( m_sig_info->si_code ) {
     458#ifndef BOOST_SKIP_SIGCHLD_TESTS
    418459        case CLD_EXITED:
    419460            report_error( execution_exception::system_error,
    420461                          "child has exited; pid: %d; uid: %d; exit value: %d",
     
    445486                          "stopped child had continued; pid: %d; uid: %d; exit value: %d",
    446487                          (int)m_sig_info->si_pid, (int)m_sig_info->si_uid, (int)m_sig_info->si_status );
    447488            break;
    448         }
    449         break;
     489#endif /* BOOST_SKIP_SIGCHLD_TESTS */
     490        default:
     491            report_error( execution_exception::system_error,
     492                    "signal: SIGSEGV (child process has terminated; pid: %d; uid: %d; exit value: %d)",
     493                    (int)m_sig_info->si_pid, (int)m_sig_info->si_uid, (int)m_sig_info->si_status );
     494            break;
     495        }
    450496
    451497#if defined(BOOST_TEST_CATCH_SIGPOLL)
    452498
    453499    case SIGPOLL:
    454500        switch( m_sig_info->si_code ) {
     501#ifndef BOOST_SKIP_SIGPOLL_TESTS
    455502        case POLL_IN:
    456503            report_error( execution_exception::system_error,
    457504                          "data input available; band event %d",
     
    484531                          (int)m_sig_info->si_band );
    485532            break;
    486533#endif
     534#endif /* BOOST_SKIP_SIGPOLL_TESTS */
     535        default:
     536            report_error( execution_exception::system_error,
     537                    "signal: SIGPOLL (asynchronous I/O event occured; band event %d)",
     538                          (int)m_sig_info->si_band );
     539            break;
    487540        }
    488         break;
    489541
    490 #endif
     542#endif /* BOOST_TEST_CATCH_SIGPOLL */
    491543
    492544    case SIGABRT:
    493545        report_error( execution_exception::system_error,
     
    695747
    696748static bool ignore_sigchild( siginfo_t* info )
    697749{
    698     return info->si_signo == SIGCHLD && info->si_code == CLD_EXITED
     750    return info->si_signo == SIGCHLD
    699751#ifdef BOOST_TEST_IGNORE_NON_ZERO_CHILD_CODE
    700752            ;
    701753#else
    702             && (int)info->si_status == 0;
     754            && info->si_code == CLD_EXITED && (int)info->si_status == 0;
    703755#endif
    704756}
    705757