Flexible I/O Tester development
 help / color / mirror / Atom feed
* [PATCH 1/2] Introduce get_ioengine for external engines
@ 2014-02-12 19:13 Daniel Gollub
  2014-02-12 19:13 ` [PATCH 2/2] engines/null: allow build as external C++ ioengine Daniel Gollub
  2014-02-13  4:12 ` [PATCH 1/2] Introduce get_ioengine for external engines Jens Axboe
  0 siblings, 2 replies; 5+ messages in thread
From: Daniel Gollub @ 2014-02-12 19:13 UTC (permalink / raw)
  To: fio; +Cc: Daniel Gollub

This makes life easier for plugins written in C++
since they do not need to deal with struct initilization issues
with the ioengine_ops symbol.

With g++ a non-static ioengine_ops in global scope like this:

struct ioengine_ops ioengine = {
        .name           = "null",
        .version        = FIO_IOOPS_VERSION,
        .queue          = fio_null_queue,
        .commit         = fio_null_commit,
};

Results in:

cpp_null2.cc: At global scope:
cpp_null2.cc:112:1: error: C99 designator ‘name’ outside aggregate initializer
cpp_null2.cc:112:1: sorry, unimplemented: non-trivial designated initializers not supported
cpp_null2.cc:112:1: sorry, unimplemented: non-trivial designated initializers not supported
cpp_null2.cc:112:1: sorry, unimplemented: non-trivial designated initializers not supported
cpp_null2.cc:112:1: sorry, unimplemented: non-trivial designated initializers not supported
$

Example get_iongine() symbol usage:

---8<---
extern "C" {
void get_ioengine(struct ioengine_ops **ioengine_ptr) {
        struct ioengine_ops *ioengine;
        *ioengine_ptr = (struct ioengine_ops *) malloc(sizeof(struct ioengine_ops));
        ioengine = *ioengine_ptr;

        strcpy(ioengine->name, "cpp_null");
        ioengine->version        = FIO_IOOPS_VERSION;
        ioengine->queue          = fio_null_queue;
        ioengine->commit         = fio_null_commit;
        ioengine->getevents      = fio_null_getevents;
        ioengine->event          = fio_null_event;
        ioengine->init           = fio_null_init;
        ioengine->cleanup        = fio_null_cleanup;
        ioengine->open_file      = fio_null_open;
        ioengine->flags          = FIO_DISKLESSIO;
}
}
--->8---

Signed-off-by: Daniel Gollub <d.gollub@telekom.de>
---
 ioengines.c |   14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/ioengines.c b/ioengines.c
index d71e372..c080da3 100644
--- a/ioengines.c
+++ b/ioengines.c
@@ -90,6 +90,7 @@ static struct ioengine_ops *dlopen_ioengine(struct thread_data *td,
 {
 	struct ioengine_ops *ops;
 	void *dlhandle;
+	typedef void (*get_ioengine_t)(struct ioengine_ops **);
 
 	dprint(FD_IO, "dload engine %s\n", engine_lib);
 
@@ -107,6 +108,19 @@ static struct ioengine_ops *dlopen_ioengine(struct thread_data *td,
 	ops = dlsym(dlhandle, engine_lib);
 	if (!ops)
 		ops = dlsym(dlhandle, "ioengine");
+
+	/*
+	 * For some external engines (like C++ ones) it is not that trivial
+	 * to provide a non-static ionengine structure that we can reference.
+	 * Instead we call a method which allocates the required ioengine
+	 * structure.
+	 */
+	if (!ops) {
+		get_ioengine_t get_ioengine = dlsym(dlhandle, "get_ioengine");
+		if (get_ioengine)
+			get_ioengine(&ops);
+	}
+
 	if (!ops) {
 		td_vmsg(td, -1, dlerror(), "dlsym");
 		dlclose(dlhandle);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-02-13  6:25 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-02-12 19:13 [PATCH 1/2] Introduce get_ioengine for external engines Daniel Gollub
2014-02-12 19:13 ` [PATCH 2/2] engines/null: allow build as external C++ ioengine Daniel Gollub
2014-02-13  4:13   ` Jens Axboe
2014-02-13  6:25     ` Daniel Gollub
2014-02-13  4:12 ` [PATCH 1/2] Introduce get_ioengine for external engines Jens Axboe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox