]> rtime.felk.cvut.cz Git - frescor/frsh.git/blobdiff - resources/cpu_aquosa/mngr/frm_aqcpu.c
forb: executable resources and fcb changed into dynamic libs
[frescor/frsh.git] / resources / cpu_aquosa / mngr / frm_aqcpu.c
index c4d857947ad5407db7e9cbef653ba135618b8812..51c32d7817d6eaeeaf6ec80e83ffee63759a09a9 100644 (file)
 #include <forb.h>
 #include <error.h>
 #include <errno.h>
+#include <getopt.h>
 #include <fres_sa_scenario.h>
 #include <stdbool.h>
 #include <ul_log.h>
+#include <ul_logreg.h>
 #include <stdio.h>
 
 UL_LOG_CUST(ulogd_frm_aqcpu);
-ul_log_domain_t ulogd_fra_fwp = {UL_LOGL_DEB, "frm_aqcpu"};
+ul_log_domain_t ulogd_frm_aqcpu = {UL_LOGL_DEB, "frm_aqcpu"};
 
-static int aqcpu_dummy_admtest(struct fres_sa_scenario *scenario, void *priv, 
-                               bool *schedulable)
+static int aqcpu_admtest(struct fres_sa_scenario *scenario, void *priv, 
+                        bool *schedulable)
 {
        struct fres_sa_contract *c;
+       long int period, budget;
+       long int sum_utilization = 0;
 
-       fres_sa_scenario_for_each_contract(scenario, c) {
+       fres_sa_scenario_for_each_no_cancel_contract(scenario, c) {
                fres_block_basic *basic;
                char id[40];
                fres_contract_id_to_string(id, &c->contract->id, sizeof(id));
                basic = fres_contract_get_basic(c->contract);
 
+               period = fosa_rel_time_to_msec(basic->period);
+               budget = fosa_rel_time_to_msec(basic->budget);
+
                ul_logdeb("processing : id=%s, period=%ld ms, budget=%ld ms\n",
-                      id,
-                      fosa_rel_time_to_msec(basic->period),
-                      fosa_rel_time_to_msec(basic->budget));
+                      id, period, budget);
 
+               sum_utilization+= budget*100/period;
+       }
+       *schedulable = sum_utilization <= 88; // 100;
+       if (*schedulable) {
+               scenario->utilization = sum_utilization;
        }
-       *schedulable = scenario->num_contracts <= 3;
-       printf("=> %s\n", schedulable?"schedulable":"not schedulable");
+       ul_logmsg("=> %s\n", *schedulable?"schedulable":"not schedulable");
                
        return 0;
 }
 
-static const struct fres_res_manager frm = {
+static struct fres_res_manager frm = {
        .res_type = FRSH_RT_PROCESSOR,
-       .res_id = 0,
-       .admission_test = aqcpu_dummy_admtest,
+       .res_id = FRSH_CPU_ID_DEFAULT,
+       .admission_test = aqcpu_admtest,
+       .name = "AQuoSA",
        .priv = NULL
 };
 
-int main(int argc, char *argv[])
+static struct option long_opts[] = {
+    { "loglevel", 1, 0, 'l' },
+    { 0, 0, 0, 0}
+};
+
+static void
+usage(void)
+{
+       printf("usage: frm_aqcpu [ options ]\n");
+       printf("  -l, --loglevel <number>|<domain>=<number>,...\n");
+}
+
+int forb_main(forb_orb orb, int argc, char *argv[])
 {
-       forb_orb orb;
        int ret;
+       forb_init_attr_t attr = { .orb_id = "org.frescor.frm.aqcpu" };
+       int  opt;
+       bool opt_daemon = false;
+       char *opt_pidfile = NULL;
+
+       ul_logreg_domain(&ulogd_frm_aqcpu);
 
-       orb = forb_init(&argc, &argv, "frm_aqcpu");
-       if (!orb) error(1, errno, "forb_init");
+       while ((opt = getopt_long(argc, argv, "hl:", &long_opts[0], NULL)) != EOF) {
+               switch (opt) {
+                       case 'l':
+                               ul_log_domain_arg2levels(optarg);
+                               break;
+                       case 'h':
+                       /*default:*/
+                               usage();
+                               exit(opt == 'h' ? 0 : 1);
+               }
+       }
        
+
+       frm.res_id = frsh_get_local_cpu_id();
        ret = frm_register_and_run(orb, &frm);
 
        if (ret != 0) {