Allow the adding of 'posval' for dynamic options like 'profile'
[fio.git] / profile.c
... / ...
CommitLineData
1#include "fio.h"
2#include "profile.h"
3#include "debug.h"
4#include "flist.h"
5#include "options.h"
6
7static FLIST_HEAD(profile_list);
8
9int load_profile(const char *profile)
10{
11 struct profile_ops *ops;
12 struct flist_head *n;
13
14 dprint(FD_PROFILE, "loading profile '%s'\n", profile);
15
16 flist_for_each(n, &profile_list) {
17 ops = flist_entry(n, struct profile_ops, list);
18 if (!strcmp(profile, ops->name))
19 break;
20
21 ops = NULL;
22 }
23
24 if (ops) {
25 ops->prep_cmd();
26 add_job_opts(ops->cmdline);
27 return 0;
28 }
29
30 log_err("fio: profile '%s' not found\n", profile);
31 return 1;
32}
33
34static int add_profile_options(struct profile_ops *ops)
35{
36 struct fio_option *o;
37
38 if (!ops->options)
39 return 0;
40
41 o = ops->options;
42 while (o->name) {
43 o->prof_name = ops->name;
44 if (add_option(o))
45 return 1;
46 o++;
47 }
48
49 return 0;
50}
51
52int register_profile(struct profile_ops *ops)
53{
54 int ret;
55
56 dprint(FD_PROFILE, "register profile '%s'\n", ops->name);
57
58 ret = add_profile_options(ops);
59 if (!ret) {
60 flist_add_tail(&ops->list, &profile_list);
61 add_opt_posval("profile", ops->name, ops->desc);
62 return 0;
63 }
64
65 invalidate_profile_options(ops->name);
66 return ret;
67}
68
69void unregister_profile(struct profile_ops *ops)
70{
71 dprint(FD_PROFILE, "unregister profile '%s'\n", ops->name);
72 flist_del(&ops->list);
73 invalidate_profile_options(ops->name);
74 del_opt_posval("profile", ops->name);
75}