]> rtime.felk.cvut.cz Git - frescor/frsh.git/blob - resources/dummy/frm_dummy.c
Merge branch 'master' of rtime.felk.cvut.cz:/var/git/frescor/frsh_forb.git
[frescor/frsh.git] / resources / dummy / frm_dummy.c
1 #include <frm_generic.h>
2 #include <forb.h>
3 #include <error.h>
4 #include <errno.h>
5 #include <fres_sa_scenario.h>
6 #include <stdbool.h>
7 #include <ul_log.h>
8 #include "res_dummy.h"
9 #include <stdio.h>
10
11 struct dummy_data {
12         int some_data;
13 };
14
15 int admission_test(struct fres_sa_scenario *scenario, void *priv, bool *schedulable)
16 {
17         struct dummy_data *data = priv;
18         struct fres_sa_contract *c;
19         int ret;
20
21         printf("Admission test:\n");
22         data->some_data++;
23
24         fres_sa_scenario_for_each_contract(scenario, c) {
25                 fres_block_basic *basic;
26                 fres_block_dummy_sched *dummy_sched;
27                 char id[40];
28                 fres_contract_id_to_string(id, &c->id, sizeof(id));
29                 basic = fres_contract_get_basic(c->contract);
30
31                 if (c->contract == c->new) {
32                         /* Add data for scheduler to the new contracts */
33                         dummy_sched = malloc(sizeof(*dummy_sched));
34                         if (!dummy_sched) return -1;
35                         dummy_sched->priority = 100 - fosa_rel_time_to_msec(basic->budget);
36                         ret = fres_contract_add_block(c->contract, FRES_BLOCK_DUMMY_SCHED, dummy_sched);
37                         if (ret) {
38                                 fprintf(stderr, "Cannpt add dummy_sched block\n");
39                                 return -1;
40                         }
41                 } else {
42                         dummy_sched = fres_contract_get_block(c->contract, FRES_BLOCK_DUMMY_SCHED);
43                         if (!dummy_sched) {
44                                 fprintf(stderr, "Dummy_sched is not present\n");
45                                 return -1;
46                         }
47                 }
48
49                 printf("  %s contract: id=%s, period=%ld ms, budget=%ld ms, priority=%d\n",
50                        c->contract == c->new ? "new" : "old", id,
51                        fosa_rel_time_to_msec(basic->period),
52                        fosa_rel_time_to_msec(basic->budget), dummy_sched->priority);
53
54
55         }
56         *schedulable = scenario->num_contracts <= 3;
57         printf("=> %s\n", *schedulable?"schedulable":"not schedulable");
58                 
59         return 0;
60 }
61
62 struct dummy_data dummy_data;
63
64 static const struct fres_res_manager frm = {
65         .res_type = DUMMY_RESOURCE_TYPE,
66         .res_id = DUMMY_RESOURCE_ID,
67         .admission_test = admission_test,
68         .priv = &dummy_data
69 };
70
71
72 int main(int argc, char *argv[])
73 {
74         forb_orb orb;
75         int ret;
76
77         orb = forb_init(&argc, &argv, "frm_dummy");
78         if (!orb) error(1, errno, "forb_init");
79
80         /* Register fres_block_dummy_sched to contract handling
81          * functions */
82         fres_block_register_dummy();
83
84         ret = frm_register_and_run(orb, &frm);
85
86         if (ret != 0) {
87                 error(1, errno, "frm_generic_run failed");
88         }
89         
90         return 0;
91 }