@@ -1,23 +1,6 @@
-AC_ARG_ENABLE([schedule-sp],
- [ --enable-schedule-sp enable strict priority scheduler],
- [if test x$enableval = xyes; then
- schedule_sp_enabled=yes
- AC_DEFINE([ODP_SCHEDULE_SP], [1],
- [Define to 1 to enable strict priority scheduler])
- fi])
-
-AC_ARG_ENABLE([schedule-iquery],
- [ --enable-schedule-iquery enable interests query (sparse bitmap) scheduler],
- [if test x$enableval = xyes; then
- schedule_iquery_enabled=yes
- AC_DEFINE([ODP_SCHEDULE_IQUERY], [1],
- [Define to 1 to enable interests query scheduler])
- fi])
-
-AC_ARG_ENABLE([schedule_scalable],
- [ --enable-schedule-scalable enable scalable scheduler],
- [if test x$enableval = xyes; then
- schedule_scalable_enabled=yes
- AC_DEFINE([ODP_SCHEDULE_SCALABLE], [1],
- [Define to 1 to enable scalable scheduler])
- fi])
+AC_ARG_ENABLE([scheduler-default],
+ [AS_HELP_STRING([enable-scheduler-default],
+ [Choose default scheduler (default is basic)])],
+ [], [enable_scheduler_default=basic])
+AC_DEFINE_UNQUOTED([ODP_SCHEDULE_DEFAULT], ["$enable_scheduler_default"],
+ [Define to name default scheduler])
@@ -8,6 +8,10 @@
#include <odp_queue_if.h>
#include <odp_internal.h>
+#include <odp_debug_internal.h>
+
+#include <stdlib.h>
+#include <string.h>
extern const queue_api_t queue_scalable_api;
extern const queue_fn_t queue_scalable_fn;
@@ -15,13 +19,8 @@ extern const queue_fn_t queue_scalable_fn;
extern const queue_api_t queue_basic_api;
extern const queue_fn_t queue_basic_fn;
-#ifdef ODP_SCHEDULE_SCALABLE
-const queue_api_t *queue_api = &queue_scalable_api;
-const queue_fn_t *queue_fn = &queue_scalable_fn;
-#else
-const queue_api_t *queue_api = &queue_basic_api;
-const queue_fn_t *queue_fn = &queue_basic_fn;
-#endif
+const queue_api_t *queue_api;
+const queue_fn_t *queue_fn;
odp_queue_t odp_queue_create(const char *name, const odp_queue_param_t *param)
{
@@ -115,6 +114,24 @@ int odp_queue_info(odp_queue_t queue, odp_queue_info_t *info)
int _odp_queue_init_global(void)
{
+ const char *sched = getenv("ODP_SCHEDULER");
+
+ if (sched == NULL || !strcmp(sched, "default"))
+ sched = ODP_SCHEDULE_DEFAULT;
+
+ if (!strcmp(sched, "basic") ||
+ !strcmp(sched, "sp") ||
+ !strcmp(sched, "iquery")) {
+ queue_fn = &queue_basic_fn;
+ queue_api = &queue_basic_api;
+ } else if (!strcmp(sched, "scalable")) {
+ queue_fn = &queue_scalable_fn;
+ queue_api = &queue_scalable_api;
+ } else {
+ ODP_ABORT("Unknown scheduler specified via ODP_SCHEDULER\n");
+ return -1;
+ }
+
return queue_fn->init_global();
}
@@ -8,6 +8,10 @@
#include <odp_schedule_if.h>
#include <odp_internal.h>
+#include <odp_debug_internal.h>
+
+#include <stdlib.h>
+#include <string.h>
extern const schedule_fn_t schedule_sp_fn;
extern const schedule_api_t schedule_sp_api;
@@ -21,19 +25,8 @@ extern const schedule_api_t schedule_iquery_api;
extern const schedule_fn_t schedule_scalable_fn;
extern const schedule_api_t schedule_scalable_api;
-#ifdef ODP_SCHEDULE_SP
-const schedule_fn_t *sched_fn = &schedule_sp_fn;
-const schedule_api_t *sched_api = &schedule_sp_api;
-#elif defined(ODP_SCHEDULE_IQUERY)
-const schedule_fn_t *sched_fn = &schedule_iquery_fn;
-const schedule_api_t *sched_api = &schedule_iquery_api;
-#elif defined(ODP_SCHEDULE_SCALABLE)
-const schedule_fn_t *sched_fn = &schedule_scalable_fn;
-const schedule_api_t *sched_api = &schedule_scalable_api;
-#else
-const schedule_fn_t *sched_fn = &schedule_basic_fn;
-const schedule_api_t *sched_api = &schedule_basic_api;
-#endif
+const schedule_fn_t *sched_fn;
+const schedule_api_t *sched_api;
uint64_t odp_schedule_wait_time(uint64_t ns)
{
@@ -148,6 +141,30 @@ void odp_schedule_order_lock_wait(uint32_t lock_index)
int _odp_schedule_init_global(void)
{
+ const char *sched = getenv("ODP_SCHEDULER");
+
+ if (sched == NULL || !strcmp(sched, "default"))
+ sched = ODP_SCHEDULE_DEFAULT;
+
+ ODP_PRINT("Using scheduler '%s'\n", sched);
+
+ if (!strcmp(sched, "basic")) {
+ sched_fn = &schedule_basic_fn;
+ sched_api = &schedule_basic_api;
+ } else if (!strcmp(sched, "sp")) {
+ sched_fn = &schedule_sp_fn;
+ sched_api = &schedule_sp_api;
+ } else if (!strcmp(sched, "iquery")) {
+ sched_fn = &schedule_iquery_fn;
+ sched_api = &schedule_iquery_api;
+ } else if (!strcmp(sched, "scalable")) {
+ sched_fn = &schedule_scalable_fn;
+ sched_api = &schedule_scalable_api;
+ } else {
+ ODP_ABORT("Unknown scheduler specified via ODP_SCHEDULER\n");
+ return -1;
+ }
+
return sched_fn->init_global();
}