blob: d4fc1fba9f06614e70b862e88bba13fe75e163ca [file] [log] [blame]
/**
* @file method.c Polling methods
*
* Copyright (C) 2010 Creytiv.com
*/
#include <re_types.h>
#include <re_fmt.h>
#include <re_mbuf.h>
#include <re_main.h>
#include "main.h"
static const char str_poll[] = "poll"; /**< POSIX.1-2001 poll */
static const char str_select[] = "select"; /**< POSIX.1-2001 select */
static const char str_epoll[] = "epoll"; /**< Linux epoll */
static const char str_kqueue[] = "kqueue";
/**
* Choose the best async I/O polling method
*
* @return Polling method
*/
enum poll_method poll_method_best(void)
{
enum poll_method m = METHOD_NULL;
#ifdef HAVE_EPOLL
/* Supported from Linux 2.5.66 */
if (METHOD_NULL == m) {
if (epoll_check())
m = METHOD_EPOLL;
}
#endif
#ifdef HAVE_KQUEUE
if (METHOD_NULL == m) {
m = METHOD_KQUEUE;
}
#endif
#ifdef HAVE_POLL
if (METHOD_NULL == m) {
m = METHOD_POLL;
}
#endif
#ifdef HAVE_SELECT
if (METHOD_NULL == m) {
m = METHOD_SELECT;
}
#endif
return m;
}
/**
* Get the name of the polling method
*
* @param method Polling method
*
* @return Polling name string
*/
const char *poll_method_name(enum poll_method method)
{
switch (method) {
case METHOD_POLL: return str_poll;
case METHOD_SELECT: return str_select;
case METHOD_EPOLL: return str_epoll;
case METHOD_KQUEUE: return str_kqueue;
default: return "???";
}
}
/**
* Get the polling method type from a string
*
* @param method Returned polling method
* @param name Polling method name string
*
* @return 0 if success, otherwise errorcode
*/
int poll_method_type(enum poll_method *method, const struct pl *name)
{
if (!method || !name)
return EINVAL;
if (0 == pl_strcasecmp(name, str_poll))
*method = METHOD_POLL;
else if (0 == pl_strcasecmp(name, str_select))
*method = METHOD_SELECT;
else if (0 == pl_strcasecmp(name, str_epoll))
*method = METHOD_EPOLL;
else if (0 == pl_strcasecmp(name, str_kqueue))
*method = METHOD_KQUEUE;
else
return ENOENT;
return 0;
}