Squashed 'third_party/rawrtc/re/' content from commit f3163ce8b

Change-Id: I6a235e6ac0f03269d951026f9d195da05c40fdab
git-subtree-dir: third_party/rawrtc/re
git-subtree-split: f3163ce8b526a13b35ef71ce4dd6f43585064d8a
diff --git a/src/main/method.c b/src/main/method.c
new file mode 100644
index 0000000..d4fc1fb
--- /dev/null
+++ b/src/main/method.c
@@ -0,0 +1,102 @@
+/**
+ * @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;
+}