/****** spool/spool_free_context() ************************************** * NAME * spool_free_context() -- free resources of a spooling context * * SYNOPSIS * lListElem* * spool_free_context(lList **answer_list, lListElem *context) * * FUNCTION * Performs a shutdown of the spooling context and releases * all allocated resources. * * INPUTS * lList **answer_list - to return error messages * lListElem *context - the context to free * * RESULT * lListElem* - NULL * * EXAMPLE * lListElem *context; * ... * context = spool_free_context(answer_list, context); * * SEE ALSO * spool/--Spooling * spool/spool_create_context() * spool/spool_shutdown_context() *******************************************************************************/ lListElem * spool_free_context(lList **answer_list, lListElem *context) { DENTER(TOP_LAYER, "spool_free_context"); PROF_START_MEASUREMENT(SGE_PROF_SPOOLING); if (context == NULL) { answer_list_add_sprintf(answer_list, STATUS_EUNKNOWN, ANSWER_QUALITY_ERROR, MSG_SPOOL_NOVALIDCONTEXT_S, SGE_FUNC); } else { spool_shutdown_context(answer_list, context); lFreeElem(&context); } PROF_STOP_MEASUREMENT(SGE_PROF_SPOOLING); DRETURN(context); }
int main(int argc, char *argv[]) { const char *url; int i, threads; pthread_t *t; int *args; lList *answer_list = NULL; lListElem *spooling_context; DENTER_MAIN(TOP_LAYER, "test_berkeleydb_mt"); /* parse commandline parameters */ if (argc < 3) { ERROR((SGE_EVENT, "usage: test_berkeleydb_mt <url> <threads> [<delay>]\n")); ERROR((SGE_EVENT, " <url> = path or host:database\n")); ERROR((SGE_EVENT, " <threads> = number of threads\n")); ERROR((SGE_EVENT, " <delay> = delay after writing [ms]\n")); SGE_EXIT(NULL, 1); } url = argv[1]; threads = atoi(argv[2]); if (argc > 3) { delay = atoi(argv[3]); } /* allocate memory for pthreads and arguments */ t = (pthread_t *)malloc(threads * sizeof(pthread_t)); args = (int *)malloc(threads * sizeof(int)); DPRINTF(("writing to database %s from %d threads\n", url, threads)); /* initialize spooling */ spooling_context = spool_create_dynamic_context(&answer_list, NULL, url, NULL); answer_list_output(&answer_list); if (spooling_context == NULL) { SGE_EXIT(NULL, EXIT_FAILURE); } spool_set_default_context(spooling_context); if (!spool_startup_context(&answer_list, spooling_context, true)) { answer_list_output(&answer_list); SGE_EXIT(NULL, EXIT_FAILURE); } answer_list_output(&answer_list); /* let n threads to parallel spooling */ for (i = 0; i < threads; i++) { args[i] = i + 1; pthread_create(&(t[i]), NULL, work, (void*)(&args[i])); } /* also work in current thread */ work((void *)0); /* wait for termination of all threads */ for (i = 0; i < threads; i++) { pthread_join(t[i], NULL); } /* shutdown spooling */ spool_shutdown_context(&answer_list, spooling_context); answer_list_output(&answer_list); sge_free(&t); DEXIT; return EXIT_SUCCESS; }