X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=profile.c;h=506462eb85373d795f745b0a4e479bd9a1937f1e;hp=92e19026f2e0f0abe6a6d0402a691efc7ad1eee4;hb=d72be5454c8c;hpb=f5b6bb85364fcb8b2ac8d922ca65afd9dfabc9bb diff --git a/profile.c b/profile.c index 92e19026..506462eb 100644 --- a/profile.c +++ b/profile.c @@ -6,13 +6,11 @@ static FLIST_HEAD(profile_list); -int load_profile(const char *profile) +struct profile_ops *find_profile(const char *profile) { - struct profile_ops *ops; + struct profile_ops *ops = NULL; struct flist_head *n; - dprint(FD_PROFILE, "loading profile '%s'\n", profile); - flist_for_each(n, &profile_list) { ops = flist_entry(n, struct profile_ops, list); if (!strcmp(profile, ops->name)) @@ -21,6 +19,16 @@ int load_profile(const char *profile) ops = NULL; } + return ops; +} + +int load_profile(const char *profile) +{ + struct profile_ops *ops; + + dprint(FD_PROFILE, "loading profile '%s'\n", profile); + + ops = find_profile(profile); if (ops) { ops->prep_cmd(); add_job_opts(ops->cmdline); @@ -73,3 +81,38 @@ void unregister_profile(struct profile_ops *ops) invalidate_profile_options(ops->name); del_opt_posval("profile", ops->name); } + +void profile_add_hooks(struct thread_data *td) +{ + struct profile_ops *ops; + + if (!exec_profile) + return; + + ops = find_profile(exec_profile); + if (!ops) + return; + + if (ops->io_ops) { + td->prof_io_ops = *ops->io_ops; + td->flags |= TD_F_PROFILE_OPS; + } +} + +int profile_td_init(struct thread_data *td) +{ + struct prof_io_ops *ops = &td->prof_io_ops; + + if (ops->td_init) + return ops->td_init(td); + + return 0; +} + +void profile_td_exit(struct thread_data *td) +{ + struct prof_io_ops *ops = &td->prof_io_ops; + + if (ops->td_exit) + ops->td_exit(td); +}