2010-06-23 23 views
5

J'étais sous l'impression que boost :: asio utiliserait une installation epoll par défaut au lieu d'une implémentation sélectionnée, mais après avoir exécuté quelques tests, il semblerait que mon installation utilise select.Boost Asio sous Linux n'utilisant pas Epoll

OS: RHEL 4
Noyau: 2.6
GCC: 3.4.6

J'ai écrit un petit programme de test pour vérifier que la tête réacteur a été utilisé, et il ressemble à son utilisant le réacteur de sélection plutôt que le réacteur 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 

Que pourrais-je faire de mal?

Répondre

4

Votre programme dit "select" pour moi aussi, mais asio utilise epoll_wait(), comme ps -Teo tid,wchan:25,comm rapports.

Que diriez-vous

#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; 
} 

(l'échelle de ifdefs attrapé par /usr/include/boost/asio/serial_port_service.hpp)

+0

Ce code imprimé pour moi "sélectionnez". Après quelques recherches dans epoll_reactor_fwd.hpp et d'autres tests, le LINUX_VERSION_CODE retourne une version de moins de 2.4.45 (qui est nécessaire pour utiliser epoll, apparemment). uname -r renvoie les éléments suivants: uname $ -r 2.6.9-78.0.13.ELsmp Si fou avec le noyau nécessaire dans epoll_reactor_fwd.hpp je peux obtenir votre programme de sortie « epoll ». Est-ce une sorte d'erreur de configuration du serveur? –

+0

En effet semble tellement. Mon système de développement produit LINUX_VERSION_CODE comme 132639 ou KERNEL_VERSION (2,6,31) (et il a été livré avec 2.6.31.5 - c'est un OpenSUSE). Que se passerait-il si vous reconstruisiez boost depuis la source? – Cubbi

+0

Boost.Asio est en-tête seulement, je doute que le boost de reconstruction aidera. –