1 /**
2  * @file method.c  Polling methods
3  *
4  * Copyright (C) 2010 Creytiv.com
5  */
6 #include <re_types.h>
7 #include <re_fmt.h>
8 #include <re_mbuf.h>
9 #include <re_main.h>
10 #include "main.h"
11 
12 
13 static const char str_poll[]   = "poll";     /**< POSIX.1-2001 poll       */
14 static const char str_select[] = "select";   /**< POSIX.1-2001 select     */
15 static const char str_epoll[]  = "epoll";    /**< Linux epoll             */
16 static const char str_kqueue[] = "kqueue";
17 
18 
19 /**
20  * Choose the best async I/O polling method
21  *
22  * @return Polling method
23  */
24 enum poll_method poll_method_best(void)
25 {
26 	enum poll_method m = METHOD_NULL;
27 
28 #ifdef HAVE_EPOLL
29 	/* Supported from Linux 2.5.66 */
30 	if (METHOD_NULL == m) {
31 		if (epoll_check())
32 			m = METHOD_EPOLL;
33 	}
34 #endif
35 
36 #ifdef HAVE_KQUEUE
37 	if (METHOD_NULL == m) {
38 		m = METHOD_KQUEUE;
39 	}
40 #endif
41 
42 #ifdef HAVE_POLL
43 	if (METHOD_NULL == m) {
44 		m = METHOD_POLL;
45 	}
46 #endif
47 #ifdef HAVE_SELECT
48 	if (METHOD_NULL == m) {
49 		m = METHOD_SELECT;
50 	}
51 #endif
52 
53 	return m;
54 }
55 
56 
57 /**
58  * Get the name of the polling method
59  *
60  * @param method Polling method
61  *
62  * @return Polling name string
63  */
64 const char *poll_method_name(enum poll_method method)
65 {
66 	switch (method) {
67 
68 	case METHOD_POLL:      return str_poll;
69 	case METHOD_SELECT:    return str_select;
70 	case METHOD_EPOLL:     return str_epoll;
71 	case METHOD_KQUEUE:    return str_kqueue;
72 	default:               return "???";
73 	}
74 }
75 
76 
77 /**
78  * Get the polling method type from a string
79  *
80  * @param method Returned polling method
81  * @param name   Polling method name string
82  *
83  * @return 0 if success, otherwise errorcode
84  */
85 int poll_method_type(enum poll_method *method, const struct pl *name)
86 {
87 	if (!method || !name)
88 		return EINVAL;
89 
90 	if (0 == pl_strcasecmp(name, str_poll))
91 		*method = METHOD_POLL;
92 	else if (0 == pl_strcasecmp(name, str_select))
93 		*method = METHOD_SELECT;
94 	else if (0 == pl_strcasecmp(name, str_epoll))
95 		*method = METHOD_EPOLL;
96 	else if (0 == pl_strcasecmp(name, str_kqueue))
97 		*method = METHOD_KQUEUE;
98 	else
99 		return ENOENT;
100 
101 	return 0;
102 }
103