summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsinanmohd <sinan@sinanmohd.com>2024-07-25 12:51:33 +0530
committersinanmohd <sinan@sinanmohd.com>2024-07-25 12:55:29 +0530
commitc4583708c643b741eb6d4c64a9f9092f7da9546f (patch)
treeb9bfeb750f69957dc3875c91a47588efdd6ccc1c /src
parent2800f12b040c7ce6da24bc7a99aa04b0ffb76fab (diff)
solver_sjf: init
Diffstat (limited to 'src')
-rw-r--r--src/evanix.c5
-rw-r--r--src/meson.build1
-rw-r--r--src/solver_sjf.c37
3 files changed, 42 insertions, 1 deletions
diff --git a/src/evanix.c b/src/evanix.c
index 197beed..608345d 100644
--- a/src/evanix.c
+++ b/src/evanix.c
@@ -8,6 +8,7 @@
#include "queue.h"
#include "solver_conformity.h"
#include "solver_highs.h"
+#include "solver_sjf.h"
#include "util.h"
static const char usage[] =
@@ -24,7 +25,7 @@ static const char usage[] =
" -p, --pipelined <bool> Use evanix build pipeline.\n"
" -l, --check_cache-status <bool> Perform cache locality check.\n"
" -c, --close-unused-fd <bool> Close stderr on exec.\n"
- " -k, --solver conformity|highs Solver to use.\n"
+ " -k, --solver sjf|conformity|highs Solver to use.\n"
"\n";
struct evanix_opts_t evanix_opts = {
@@ -174,6 +175,8 @@ int opts_read(struct evanix_opts_t *opts, char **expr, int argc, char *argv[])
opts->solver = solver_conformity;
} else if (!strcmp(optarg, "highs")) {
opts->solver = solver_highs;
+ } else if (!strcmp(optarg, "sjf")) {
+ opts->solver = solver_sjf;
} else {
fprintf(stderr,
"option -%c has an invalid solver "
diff --git a/src/meson.build b/src/meson.build
index 53ba531..d6cfb00 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -10,6 +10,7 @@ e = executable(
'jobid.c',
'solver_conformity.c',
'solver_highs.c',
+ 'solver_sjf.c',
],
include_directories: evanix_inc,
diff --git a/src/solver_sjf.c b/src/solver_sjf.c
new file mode 100644
index 0000000..34d85ec
--- /dev/null
+++ b/src/solver_sjf.c
@@ -0,0 +1,37 @@
+#include <queue.h>
+#include <errno.h>
+
+#include "evanix.h"
+#include "jobs.h"
+#include "solver_sjf.h"
+
+int solver_sjf(struct job **job, struct job_clist *q, int32_t resources)
+{
+ struct job *j;
+ int cost_cur;
+
+ struct job *selected = NULL;
+ int cost_min = -1;
+
+ CIRCLEQ_FOREACH (j, q, clist) {
+ if (j->stale)
+ continue;
+
+ cost_cur = job_cost_recursive(j);
+ if (cost_cur > resources) {
+ job_stale_set(j);
+ if (evanix_opts.solver_report) {
+ printf("❌ refusing to build %s, cost: %d\n",
+ j->drv_path, job_cost_recursive(j));
+ }
+ }
+
+ if (cost_min < 0 || cost_min > cost_cur) {
+ selected = j;
+ cost_min = cost_cur;
+ }
+ }
+
+ *job = selected;
+ return (cost_min < 0) ? -ESRCH : cost_min;
+}