extern int main(void) { cl_thread_settings_t* thread_p = NULL; cl_thread_settings_t* dummy_thread_p = NULL; int count = 0; /* setup thread list */ cl_thread_list_setup(&thread_list,"thread list"); /* setup first thread */ cl_thread_list_create_thread(thread_list, &dummy_thread_p,NULL, "1st thread", 1, my_thread, NULL, NULL, CL_TT_USER1); /* setup second thread */ cl_thread_list_create_thread(thread_list, &dummy_thread_p, NULL, "2nd thread", 2, my_thread, NULL, NULL, CL_TT_USER1); thread_p = cl_thread_list_get_thread_by_id(thread_list, 1); printf("first thread (%s) has id: %d\n", thread_p->thread_name, thread_p->thread_id); thread_p = cl_thread_list_get_thread_by_name(thread_list, "2nd thread"); printf("second thread (%s) has id: %d\n" , thread_p->thread_name, thread_p->thread_id); while (count++ < 10) { int id; printf("we have %ld threads.\n", cl_raw_list_get_elem_count(thread_list)); thread_p = cl_thread_list_get_first_thread(thread_list); id = thread_p->thread_id; printf("-----------> delete thread %d ...\n", id); cl_thread_list_delete_thread_by_id(thread_list, id); printf("<----------- delete thread %d done\n", id); printf("-----------> add thread ...\n"); cl_thread_list_create_thread(thread_list, &dummy_thread_p, NULL,"new thread", id, my_thread, NULL, NULL, CL_TT_USER1); printf("<----------- add thread done\n"); } /* delete all threads */ while ( (thread_p=cl_thread_list_get_first_thread(thread_list)) != NULL ) { int id = thread_p->thread_id; printf("-----------> delete thread %d ...\n",id ); cl_thread_list_delete_thread(thread_list, thread_p); printf("<----------- delete thread %d done\n",id ); } cl_thread_list_cleanup(&thread_list); printf("main done\n"); return 0; }
void sge_signaler_terminate(void) { cl_thread_settings_t* thread = NULL; DENTER(TOP_LAYER, "sge_signaler_terminate"); thread = cl_thread_list_get_first_thread(Main_Control.signal_thread_pool); if (thread != NULL) { DPRINTF(("getting canceled\n")); cl_thread_list_delete_thread(Main_Control.signal_thread_pool, thread); } DRETURN_VOID; }
void sge_event_master_terminate(void) { cl_thread_settings_t* thread = NULL; DENTER(TOP_LAYER, "sge_event_master_terminate"); thread = cl_thread_list_get_first_thread(Main_Control.event_master_thread_pool); while (thread != NULL) { DPRINTF((SFN" gets canceled\n", thread->thread_name)); cl_thread_list_delete_thread(Main_Control.event_master_thread_pool, thread); thread = cl_thread_list_get_first_thread(Main_Control.event_master_thread_pool); } DPRINTF(("all "SFN" threads terminated\n", threadnames[DELIVERER_THREAD])); DRETURN_VOID; }
void sge_worker_terminate(sge_gdi_ctx_class_t *ctx) { bool do_final_spooling; DENTER(TOP_LAYER, "sge_worker_terminate"); sge_tq_wakeup_waiting(Master_Task_Queue); /* * trigger pthread_cancel for each thread so that further * shutdown process will be faster */ { cl_thread_list_elem_t *thr = NULL; cl_thread_list_elem_t *thr_nxt = NULL; thr_nxt = cl_thread_list_get_first_elem(Main_Control.worker_thread_pool); while ((thr = thr_nxt) != NULL) { thr_nxt = cl_thread_list_get_next_elem(thr); cl_thread_shutdown(thr->thread_config); } } /* * Shutdown/delete the threads and wait for termination */ { cl_thread_settings_t *thread = NULL; thread = cl_thread_list_get_first_thread(Main_Control.worker_thread_pool); while (thread != NULL) { DPRINTF(("gets canceled\n")); cl_thread_list_delete_thread(Main_Control.worker_thread_pool, thread); thread = cl_thread_list_get_first_thread(Main_Control.worker_thread_pool); } DPRINTF(("all "SFN" threads terminated\n", threadnames[WORKER_THREAD])); } do_final_spooling = sge_qmaster_do_final_spooling(); /* shutdown and remove JSV instances */ jsv_list_remove_all(); reporting_shutdown(ctx, NULL, do_final_spooling); DPRINTF(("accounting and reporting module has been shutdown\n")); /* * final spooling is only done if the shutdown of the current instance * of this master process is not triggered due to the fact that * shadowed started another instance which is currently running ... * * ... in that case we would overwrite data which might have already * changed in the second instance of the master */ if (do_final_spooling == true) { sge_store_job_number(ctx, NULL, NULL); sge_store_ar_id(ctx, NULL, NULL); DPRINTF(("job/ar counter made persistent\n")); sge_job_spool(ctx); /* store qmaster jobs to database */ sge_userprj_spool(ctx); /* spool the latest usage */ DPRINTF(("final job and user/project spooling has been triggered\n")); } sge_shutdown_persistence(NULL); DPRINTF(("persistence module has been shutdown\n")); DRETURN_VOID; }