2010-06-23 12 views
5

Ho avuto l'impressione che boost :: asio usasse una configurazione epoll di default invece di un'implementazione selezionata, ma dopo aver eseguito alcuni test sembra che il mio setup stia usando select.Boost Asio su Linux non utilizza Epoll

OS: RHEL 4
Kernel: 2.6
GCC: 3.4.6

ho scritto un piccolo programma di test per verificare che un colpo di testa del reattore veniva usato, e sembra che la sua utilizzando il reattore di selezione piuttosto che il reattore epoll.

#include <boost/asio.hpp> 

#include <string> 
#include <iostream> 

std::string output; 

#if defined(BOOST_ASIO_EPOLL_REACTOR_HPP) 

int main(void) 
{ 
    std::cout << "you have epoll enabled." << std::endl; 
} 

#elif defined(BOOST_ASIO_DETAIL_SELECT_REACTOR_HPP) 

int main(void) 
{ 
    std::cout << "you have select enabled." << std::endl; 
} 

#else 

int main(void) 
{ 
    std::cout << "this shit is confusing." << std::endl; 
} 


#endif 

Cosa potrei fare di sbagliato?

risposta

4

Il tuo programma dice "seleziona" anche per me, ma asio sta usando epoll_wait(), come rapporti ps -Teo tid,wchan:25,comm.

Come su

#include <iostream> 
#include <string> 
#include <boost/asio.hpp> 
int main() 
{ 
std::string output; 
#if defined(BOOST_ASIO_HAS_IOCP) 
    output = "iocp" ; 
#elif defined(BOOST_ASIO_HAS_EPOLL) 
    output = "epoll" ; 
#elif defined(BOOST_ASIO_HAS_KQUEUE) 
    output = "kqueue" ; 
#elif defined(BOOST_ASIO_HAS_DEV_POLL) 
    output = "/dev/poll" ; 
#else 
    output = "select" ; 
#endif 
    std::cout << output << std::endl; 
} 

(la scala di ifdefs afferrò da /usr/include/boost/asio/serial_port_service.hpp)

+0

Questo codice stampato "selezionare" per me. Dopo alcuni scavi in ​​epoll_reactor_fwd.hpp e altri test, il LINUX_VERSION_CODE restituisce una versione inferiore a quella di 2.4.45 (che è richiesta per usare epoll, apparentemente). uname -r restituisce il seguente: $ uname -r 2.6.9-78.0.13.ELsmp Se sciocco con il kernel richiesta in epoll_reactor_fwd.hpp posso ottenere il vostro programma per l'uscita "epoll". Si tratta di una sorta di errore di configurazione del server? –

+0

Sembra proprio così. Il mio sistema di sviluppo emette LINUX_VERSION_CODE come 132639 o KERNEL_VERSION (2,6,31) (ed è stato spedito con 2.6.31.5 - è un OpenSUSE). Cosa succederebbe se ricostruissi boost dalla sorgente? – Cubbi

+0

Boost.Asio è solo l'intestazione, dubito che la ricostruzione aiuterà. –