From ca9f26089df29fec5995ed4f19a06c29f7f4b12e Mon Sep 17 00:00:00 2001 From: Samo Penic <samo.penic@gmail.com> Date: Thu, 28 Feb 2019 18:55:40 +0000 Subject: [PATCH] Plugin chains to speed up running of plugins, part 1. --- src/main.c | 26 +++++++++--- src/plugins.c | 34 ++++++++++++++++ src/plugins.h | 1 src/tape | 2 src/vesicle.c | 2 + src/general.h | 14 +++++++ 6 files changed, 70 insertions(+), 9 deletions(-) diff --git a/src/general.h b/src/general.h index d7c1ec7..db3182e 100644 --- a/src/general.h +++ b/src/general.h @@ -331,9 +331,23 @@ void *libhandle; } ts_plugin; +struct ts_plugin_chain { + ts_plugin *plugin; + struct ts_plugin_chain *next; +}; +typedef struct ts_plugin_chain ts_plugin_chain; + +typedef struct { + ts_plugin_chain *at_start; + ts_plugin_chain *after_vesicle_init; + ts_plugin_chain *cleanup; +} ts_plugin_chains; + + typedef struct { ts_uint n; ts_plugin **plugin; + ts_plugin_chains *chain; } ts_plugin_list; /* end plugins */ diff --git a/src/main.c b/src/main.c index b972854..d820471 100644 --- a/src/main.c +++ b/src/main.c @@ -34,7 +34,8 @@ *plugins=plugin0; plugins[1]=plugin1; ts_plugin_list *plist=init_plugin_list(plugins,2); - ts_fprintf(stdout, "TRISURF in PRVI PLUGIN %s\n", plist->plugin[0]->details->name); + //printf("%s", plist->chain->at_start->next->plugin->filename); + //ts_fprintf(stdout, "TRISURF in PRVI PLUGIN %s\n", plist->plugin[0]->details->name); ts_vesicle *vesicle; ts_tape *tape; ts_uint start_iteration=0; @@ -51,9 +52,10 @@ ts_fprintf(stdout,"Starting program...\n\n"); /* Entry point for plugin function at_start() */ - int i; - for(i=0; i<plist->n; i++){ - plist->plugin[i]->function->at_start(argv, argc); + ts_plugin_chain *ptr=plist->chain->at_start; + while(ptr!=NULL){ + ptr->plugin->function->at_start(argv,argc); + ptr=ptr->next; } if(command_line_args.dump_from_vtk[0]!=0){ @@ -138,13 +140,23 @@ vesicle->plist=plist; /* Entry point for plugin after_vesicle_init() function */ - for(i=0; i<plist->n; i++){ - vesicle = plist->plugin[i]->function->after_vesicle_init(vesicle); + ptr=plist->chain->after_vesicle_init; + while(ptr!=NULL){ + ptr->plugin->function->after_vesicle_init(vesicle); + ptr=ptr->next; } - + run_simulation(vesicle, tape->mcsweeps, tape->inititer, tape->iterations, start_iteration); write_master_xml_file(command_line_args.output_fullfilename); write_dout_fcompat_file(vesicle,"dout"); +/* Entry point for plugin cleanup() function */ + ptr=plist->chain->cleanup; + while(ptr!=NULL){ + ptr->plugin->function->cleanup(); + ptr=ptr->next; + } + + vesicle_free(vesicle); tape_free(tape); return 0; //program finished perfectly ok. We return 0. diff --git a/src/plugins.c b/src/plugins.c index 9464a6b..84983aa 100644 --- a/src/plugins.c +++ b/src/plugins.c @@ -103,6 +103,10 @@ fatal("Exiting",235); } ts_plugin_details* (*get_plugin_details)(void) = dlsym(plugin->libhandle, "init"); + if(get_plugin_details==NULL){ + ts_fprintf(stderr,"Plugin %s invalid. No init() function.\n", filename); + fatal("Exiting", 235); + } plugin->details = get_plugin_details(); plugin->function = (ts_plugin_function *)calloc(1,sizeof(ts_plugin_function)); @@ -121,12 +125,39 @@ } +ts_plugin_chain *plugin_to_chain(ts_plugin_chain *chain, ts_plugin *plugin){ + ts_plugin_chain *retchain; + if(chain!=NULL){ + retchain=chain; + while(chain->next!=NULL){ + chain=chain->next; + } + chain->next=(ts_plugin_chain *)calloc(1,sizeof(ts_plugin_chain)); + chain->next->plugin=plugin; + return retchain; + } else { + chain=(ts_plugin_chain *)calloc(1,sizeof(ts_plugin_chain)); + chain->plugin=plugin; + return chain; + } +} + + ts_plugin_list *init_plugin_list(ts_char **plugin_filenames, ts_uint number_of_plugins){ ts_plugin_list *plist=(ts_plugin_list *)calloc(1, sizeof(ts_plugin_list)); plist->plugin=(ts_plugin **)calloc(number_of_plugins, sizeof(ts_plugin *)); + plist->chain=(ts_plugin_chains *)calloc(1, sizeof(ts_plugin_chains)); for(int i=0;i<number_of_plugins;i++){ plist->plugin[i]=init_plugin(plugin_filenames[i]); + if(plist->plugin[i]->function->cleanup!=NULL){ + plist->chain->cleanup=plugin_to_chain(plist->chain->cleanup, plist->plugin[i]); + } + if(plist->plugin[i]->function->at_start!=NULL){ + plist->chain->at_start=plugin_to_chain(plist->chain->at_start, plist->plugin[i]); + } + } + //printf("%s", plist->chain->at_start->next->plugin->filename); plist->n=number_of_plugins; return plist; } @@ -140,9 +171,10 @@ free(plugin); } -void free_plugin_list(ts_plugin_list *plist){ +void plugin_list_free(ts_plugin_list *plist){ for(int i=0;i<plist->n;i++){ free_plugin(plist->plugin[i]); } + free(plist->chain); free(plist); } diff --git a/src/plugins.h b/src/plugins.h index 161f215..6ddce62 100644 --- a/src/plugins.h +++ b/src/plugins.h @@ -3,4 +3,5 @@ #include "general.h" ts_plugin *init_plugin(ts_char *filename); ts_plugin_list *init_plugin_list(ts_char **plugin_filenames, ts_uint number_of_filenames); +void plugin_list_free(ts_plugin_list *plist); #endif diff --git a/src/tape b/src/tape index 8a735db..42e22ea 100644 --- a/src/tape +++ b/src/tape @@ -14,7 +14,7 @@ # (pswitch=1: calc. p*dV energy contribution) pswitch = 1 # pressure difference: p_inside - p_outside (in units kT/l_min^3): -pressure=-100.0 +pressure=-10.0 #Constant volume constraint (0 disable constant volume, 1 enable wiht additional vertex move, 2 enable with epsvol) constvolswitch=0 diff --git a/src/vesicle.c b/src/vesicle.c index fe4c4b1..99e21f9 100644 --- a/src/vesicle.c +++ b/src/vesicle.c @@ -9,6 +9,7 @@ #include "poly.h" #include "sh.h" #include "shcomplex.h" +#include "plugins.h" ts_vesicle *init_vesicle(ts_uint N, ts_uint ncmax1, ts_uint ncmax2, ts_uint ncmax3, ts_double stepsize){ @@ -40,6 +41,7 @@ poly_list_free(vesicle->poly_list); poly_list_free(vesicle->filament_list); complex_sph_free(vesicle->sphHarmonics); + plugin_list_free(vesicle->plist); free(vesicle); return TS_SUCCESS; } -- Gitblit v1.9.3