Example #1
0
int LshttpdMain::startChild(ChildProc *pProc)
{
    if (!pProc->m_pBlackBoard)
    {
        pProc->m_pBlackBoard = allocateBlackBoard();
        if (!pProc->m_pBlackBoard)
            return LS_FAIL;
    }
    pProc->m_iProcNo = getFirstAvailSlot();
    if (pProc->m_iProcNo > HttpServerConfig::getInstance().getChildren())
        return LS_FAIL;
    preFork();
    pProc->m_pid = fork();
    if (pProc->m_pid == -1)
    {
        forkError(errno);
        return LS_FAIL;
    }
    if (pProc->m_pid == 0)
    {
        //child process
        cpu_set_t       cpu_affinity;

        if (GlobalServerSessionHooks->isEnabled(LSI_HKPT_WORKER_POSTFORK))
            GlobalServerSessionHooks->runCallbackNoParam(LSI_HKPT_WORKER_POSTFORK,
                    NULL);

        PCUtil::getAffinityMask(s_iCpuCount, pProc->m_iProcNo - 1, 1,
                                &cpu_affinity);
        PCUtil::setCpuAffinity(&cpu_affinity);
        m_pServer->setBlackBoard(pProc->m_pBlackBoard);
        m_pServer->setProcNo(pProc->m_iProcNo);
        //setAffinity( 0, pProc->m_iProcNo);  //TEST: need uncomment and debug
        releaseExcept(pProc);
        m_pServer->reinitMultiplexer();
        m_pServer->enableAioLogging();
        if ((HttpServerConfig::getInstance().getUseSendfile() == 2)
            && (m_pServer->initAioSendFile() != 0))
            return LS_FAIL;
        close(m_fdAdmin);
        snprintf(argv0, 80, "openlitespeed (lshttpd - #%02d)", pProc->m_iProcNo);
        return 0;
    }

    if (GlobalServerSessionHooks->isEnabled(LSI_HKPT_MAIN_POSTFORK))
        GlobalServerSessionHooks->runCallbackNoParam(LSI_HKPT_MAIN_POSTFORK, NULL);
    postFork(pProc->m_pid);
    m_childrenList.push(pProc);
    pProc->m_iState = CP_RUNNING;
    setChildSlot(pProc->m_iProcNo, 1);

    ++m_curChildren;
    return pProc->m_pid;
}
int LshttpdMain::allocatePidTracker()
{
    char *pBuf = allocateBlackBoard();
    if (pBuf == MAP_FAILED)
    {
        LOG_ERR_CODE((errno));
        return LS_FAIL;

    }
    m_pServer->setBlackBoard(pBuf);
    return 0;
}
int LshttpdMain::startChild( ChildProc * pProc )
{
    if ( !pProc->m_pBlackBoard )
    {
        pProc->m_pBlackBoard = allocateBlackBoard();
        if ( !pProc->m_pBlackBoard )
            return -1;
    }
    pProc->m_iProcNo = getFirstAvailSlot();
    if ( pProc->m_iProcNo > HttpGlobals::s_children )
        return -1;
    preFork();
    pProc->m_pid = fork();
    if ( pProc->m_pid == -1 )
    {
        forkError( errno );
        return -1;
    }
    if ( pProc->m_pid == 0 )
    {   //child process
        cpu_set_t       cpu_affinity;
        
        if ( LsiApiHooks::getServerHooks()->isEnabled( LSI_HKPT_WORKER_POSTFORK) )
            LsiApiHooks::getServerHooks()->runCallbackNoParam(LSI_HKPT_WORKER_POSTFORK, NULL);

        PCUtil::getAffinityMask( s_iCpuCount, pProc->m_iProcNo-1, 1, &cpu_affinity );
        PCUtil::setCpuAffinity( &cpu_affinity );
        m_pServer->setBlackBoard( pProc->m_pBlackBoard );
        m_pServer->setProcNo( pProc->m_iProcNo );
        //setAffinity( 0, pProc->m_iProcNo);  //FIXME: need uncomment and debug
        releaseExcept( pProc );
        m_pServer->reinitMultiplexer();
        close( m_fdAdmin );
        snprintf( argv0, 80, "openlitespeed (lshttpd - #%02d)", pProc->m_iProcNo );
        return 0;
    }
    
    if ( LsiApiHooks::getServerHooks()->isEnabled( LSI_HKPT_MAIN_POSTFORK) )
        LsiApiHooks::getServerHooks()->runCallbackNoParam(LSI_HKPT_MAIN_POSTFORK, NULL);
    postFork( pProc->m_pid );
    m_childrenList.push( pProc );
    pProc->m_iState = CP_RUNNING;
    setChildSlot( pProc->m_iProcNo, 1 );
    
    ++m_curChildren;
    return pProc->m_pid;
}