void Yap_init_yapor_workers(void) { CACHE_REGS int proc; #ifdef YAPOR_THREADS return; #endif /* YAPOR_THREADS */ #ifdef YAPOR_COW GLOBAL_master_worker = getpid(); if (GLOBAL_number_workers > 1) { int son; son = fork(); if (son == -1) Yap_Error(SYSTEM_ERROR_FATAL, TermNil, "fork error (Yap_init_yapor_workers)"); if (son > 0) { /* I am the father, I must stay here and wait for my children to all die */ struct sigaction sigact; sigact.sa_handler = SIG_DFL; sigemptyset(&sigact.sa_mask); sigact.sa_flags = SA_RESTART; sigaction(SIGINT, &sigact, NULL); pause(); exit(0); } else GLOBAL_worker_pid(0) = getpid(); } #endif /* YAPOR_COW */ for (proc = 1; proc < GLOBAL_number_workers; proc++) { int son; son = fork(); if (son == -1) Yap_Error(SYSTEM_ERROR_FATAL, TermNil, "fork error (Yap_init_yapor_workers)"); if (son == 0) { /* new worker */ worker_id = proc; Yap_remap_yapor_memory(); LOCAL = REMOTE(worker_id); memcpy(REMOTE(worker_id), REMOTE(0), sizeof(struct worker_local)); InitWorker(worker_id); break; } else GLOBAL_worker_pid(proc) = son; } }
void Yap_unmap_yapor_memory (void) { int i; INFORMATION_MESSAGE("Worker %d exiting...", worker_id); for (i = 0; i < GLOBAL_number_workers; i++) if (i != worker_id && GLOBAL_worker_pid(i) != 0) { if (kill(GLOBAL_worker_pid(i), SIGKILL) != 0) INFORMATION_MESSAGE("Can't kill process %d", GLOBAL_worker_pid(i)); else INFORMATION_MESSAGE("Killing process %d", GLOBAL_worker_pid(i)); } #ifdef YAPOR_COW if (GLOBAL_number_workers > 1) { if (kill(GLOBAL_master_worker, SIGINT) != 0) INFORMATION_MESSAGE("Can't kill process %d", GLOBAL_master_worker); else INFORMATION_MESSAGE("Killing process %d", GLOBAL_master_worker); } #endif /* YAPOR_COW */ #ifdef MMAP_MEMORY_MAPPING_SCHEME if (remove(mapfile_path) == 0) INFORMATION_MESSAGE("Removing mapfile \"%s\"", mapfile_path); else INFORMATION_MESSAGE("Can't remove mapfile \"%s\"", mapfile_path); #elif defined(SHM_MEMORY_MAPPING_SCHEME) #if defined(YAPOR_COPY) || defined(YAPOR_SBA) shm_unmap_memory(MAX_WORKERS); shm_unmap_memory(MAX_WORKERS + 1); for (i = 0; i < GLOBAL_number_workers; i++) shm_unmap_memory(i); #elif defined(YAPOR_COW) shm_unmap_memory(0); #endif /* YAPOR_COPY || YAPOR_SBA || YAPOR_COW */ #endif /* MEMORY_MAPPING_SCHEME */ return; }
void Yap_init_global_optyap_data(int max_table_size, int n_workers, int sch_loop, int delay_load) { int i; /* global data related to memory management */ #ifdef USE_PAGES_MALLOC INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_alloc, void *); INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_void, void *); #endif /* USE_PAGES_MALLOC */ #ifdef TABLING INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_tab_ent, struct table_entry); #if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING) INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_sg_ent, struct subgoal_entry); #endif INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_sg_fr, struct subgoal_frame); INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_dep_fr, struct dependency_frame); INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_sg_node, struct subgoal_trie_node); INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_sg_hash, struct subgoal_trie_hash); INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_ans_node, struct answer_trie_node); INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_ans_hash, struct answer_trie_hash); #if defined(THREADS_FULL_SHARING) INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_ans_ref_node, struct answer_ref_node); #endif INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_gt_node, struct global_trie_node); INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_gt_hash, struct global_trie_hash); #endif /* TABLING */ #ifdef YAPOR INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_or_fr, struct or_frame); INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_qg_sol_fr, struct query_goal_solution_frame); INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_qg_ans_fr, struct query_goal_answer_frame); #ifdef TABLING INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_susp_fr, struct suspension_frame); #endif #ifdef TABLING_INNER_CUTS INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_tg_sol_fr, struct table_subgoal_solution_frame); INIT_GLOBAL_PAGE_ENTRY(GLOBAL_pages_tg_ans_fr, struct table_subgoal_answer_frame); #endif #endif /* YAPOR */ #ifdef YAPOR /* global static data */ GLOBAL_number_workers = n_workers; GLOBAL_worker_pid(0) = getpid(); for (i = 1; i < GLOBAL_number_workers; i++) GLOBAL_worker_pid(i) = 0; GLOBAL_scheduler_loop = sch_loop; GLOBAL_delayed_release_load = delay_load; /* global data related to or-parallelism */ ALLOC_OR_FRAME(GLOBAL_root_or_fr); BITMAP_clear(GLOBAL_bm_present_workers); for (i = 0; i < GLOBAL_number_workers; i++) BITMAP_insert(GLOBAL_bm_present_workers, i); BITMAP_copy(GLOBAL_bm_idle_workers, GLOBAL_bm_present_workers); BITMAP_clear(GLOBAL_bm_root_cp_workers); BITMAP_clear(GLOBAL_bm_invisible_workers); BITMAP_clear(GLOBAL_bm_requestable_workers); BITMAP_copy(GLOBAL_bm_finished_workers, GLOBAL_bm_present_workers); INIT_LOCK(GLOBAL_locks_bm_idle_workers); INIT_LOCK(GLOBAL_locks_bm_root_cp_workers); INIT_LOCK(GLOBAL_locks_bm_invisible_workers); INIT_LOCK(GLOBAL_locks_bm_requestable_workers); INIT_LOCK(GLOBAL_locks_bm_finished_workers); #ifdef TABLING_INNER_CUTS INIT_LOCK(GLOBAL_locks_bm_pruning_workers); #endif /* TABLING_INNER_CUTS */ GLOBAL_locks_who_locked_heap = MAX_WORKERS; INIT_LOCK(GLOBAL_locks_heap_access); INIT_LOCK(GLOBAL_locks_alloc_block); if (GLOBAL_number_workers == 1) GLOBAL_parallel_mode = PARALLEL_MODE_OFF; else GLOBAL_parallel_mode = PARALLEL_MODE_ON; #endif /* YAPOR */ #ifdef TABLING /* global data related to tabling */ GLOBAL_root_gt = NULL; GLOBAL_root_tab_ent = NULL; #ifdef LIMIT_TABLING if (max_table_size) GLOBAL_max_pages = ((max_table_size - 1) * 1024 * 1024 / SHMMAX + 1) * SHMMAX / Yap_page_size; else GLOBAL_max_pages = -1; GLOBAL_first_sg_fr = NULL; GLOBAL_last_sg_fr = NULL; GLOBAL_check_sg_fr = NULL; #endif /* LIMIT_TABLING */ #ifdef YAPOR new_dependency_frame(GLOBAL_root_dep_fr, FALSE, NULL, NULL, NULL, NULL, FALSE, NULL); #endif /* YAPOR */ for (i = 0; i < MAX_TABLE_VARS; i++) { CELL *pt = GLOBAL_table_var_enumerator_addr(i); RESET_VARIABLE(pt); } #ifdef TRIE_LOCK_USING_GLOBAL_ARRAY for (i = 0; i < TRIE_LOCK_BUCKETS; i++) INIT_LOCK(GLOBAL_trie_locks(i)); #endif /* TRIE_LOCK_USING_GLOBAL_ARRAY */ #endif /* TABLING */ return; }