diff --git a/doxygen/external-renderer.dox b/doxygen/external-renderer.dox index 5059e79..ef0333e 100644 --- a/doxygen/external-renderer.dox +++ b/doxygen/external-renderer.dox @@ -22,5 +22,6 @@ * @ref EXTERNAL_LIBRARY_RENDER_FUNCTION | int EXTERNAL_LIBRARY_RENDER_FUNCTION(struct gds_cell *toplevel, GList *layer_info_list, const char *output_file_name, double scale) | Render cell to output file * @ref EXTERNAL_LIBRARY_INIT_FUNCTION | int EXTERNAL_LIBRARY_INIT_FUNCTION(const char *option_string, const char *version_string) | Init function. Executed before rendering. This is given the command line parameters specified for the external renderer and the version string of the currently running gds-render program. * @ref EXTERNAL_LIBRARY_FORK_REQUEST | int EXTERNAL_LIBRARY_FORK_REQUEST; | The pure presence of this integer results in the execution inside a subprocess of hte whole shared object's code + * @ref EXTERNAL_LIBRARY_FINALIZE_FUNCTION | int EXTERNAL_LIBRARY_FINALIZE_FUNCTION(void) | Called after rendering * */ diff --git a/include/gds-render/output-renderers/external-renderer-interfaces.h b/include/gds-render/output-renderers/external-renderer-interfaces.h index 509d029..97cdc81 100644 --- a/include/gds-render/output-renderers/external-renderer-interfaces.h +++ b/include/gds-render/output-renderers/external-renderer-interfaces.h @@ -32,6 +32,15 @@ */ #define EXTERNAL_LIBRARY_INIT_FUNCTION exported_init +/** + * @brief Function name expected to be found in external library for finalizing. + * + * @code + * int EXTERNAL_LIBRARY_FINALIZE_FUNCTION(void); + * @endcode + */ +#define EXTERNAL_LIBRARY_FINALIZE_FUNCTION exported_finalize + /** * @brief Global integer specified by an external renderer to signal, that the init and render functions shall be executed in a subprocess * diff --git a/output-renderers/external-renderer.c b/output-renderers/external-renderer.c index f79edb8..413c3c6 100644 --- a/output-renderers/external-renderer.c +++ b/output-renderers/external-renderer.c @@ -66,6 +66,7 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList * { int (*so_render_func)(struct gds_cell *, GList *, const char *, double) = NULL; int (*so_init_func)(const char *, const char *) = NULL; + int (*so_finalize_func)(void) = NULL; void *so_handle = NULL; char *error_msg; int forking_req; @@ -93,7 +94,7 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList * so_render_func = (int (*)(struct gds_cell *, GList *, const char *, double)) dlsym(so_handle, xstr(EXTERNAL_LIBRARY_RENDER_FUNCTION)); error_msg = dlerror(); - if (error_msg != NULL) { + if (error_msg) { fprintf(stderr, "Rendering function not found in library:\n%s\n", error_msg); goto ret_close_so_handle; } @@ -101,11 +102,19 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList * /* Load the init function */ so_init_func = (int (*)(const char *, const char *))dlsym(so_handle, xstr(EXTERNAL_LIBRARY_INIT_FUNCTION)); error_msg = dlerror(); - if (error_msg != NULL) { + if (error_msg) { fprintf(stderr, "Rendering function not found in library:\n%s\n", error_msg); goto ret_close_so_handle; } + /* Load the finalize function */ + so_finalize_func = (int (*)(void))dlsym(so_handle, xstr(EXTERNAL_LIBRARY_FINALIZE_FUNCTION)); + error_msg = dlerror(); + if (error_msg) { + fprintf(stderr, "Finalize function not found in library:\n%s\n", error_msg); + goto ret_close_so_handle; + } + /* Check if forking is requested */ if (dlsym(so_handle, xstr(EXTERNAL_LIBRARY_FORK_REQUEST))) forking_req = 1; @@ -127,6 +136,9 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList * if (!ret) ret = so_render_func(toplevel_cell, layer_info_list, output_file, scale); + /* Finalize the external renderer */ + ret |= so_finalize_func(); + /* If we are in a separate process, terminate here */ if (forking_req) exit(ret); diff --git a/plugins/plugin-example/src/plugin-main.c b/plugins/plugin-example/src/plugin-main.c index 829daea..2cabe62 100644 --- a/plugins/plugin-example/src/plugin-main.c +++ b/plugins/plugin-example/src/plugin-main.c @@ -17,3 +17,8 @@ int FUNC_DECL(EXTERNAL_LIBRARY_INIT_FUNCTION)(const char *params, const char *ve printf("Init with params: %s\ngds-render version: %s\n", params, version); return 0; } + +int FUNC_DECL(EXTERNAL_LIBRARY_FINALIZE_FUNCTION)(void) +{ + return 0; +} diff --git a/plugins/python-renderer/src/plugin-main.c b/plugins/python-renderer/src/plugin-main.c index 829daea..bdbe1bf 100644 --- a/plugins/python-renderer/src/plugin-main.c +++ b/plugins/python-renderer/src/plugin-main.c @@ -1,5 +1,7 @@ #include #include +#include + #include #include @@ -14,6 +16,11 @@ int FUNC_DECL(EXTERNAL_LIBRARY_RENDER_FUNCTION)(struct gds_cell *toplevel, GList int FUNC_DECL(EXTERNAL_LIBRARY_INIT_FUNCTION)(const char *params, const char *version) { + PyObject *p_module_name; + printf("Init with params: %s\ngds-render version: %s\n", params, version); + + Py_Initialize(); + return 0; }