extern void stepd_step_rec_destroy(stepd_step_rec_t *job) { uint16_t multi_prog = 0; int i; _array_free(&job->env); _array_free(&job->argv); if (job->flags & LAUNCH_MULTI_PROG) multi_prog = 1; for (i = 0; i < job->node_tasks; i++) _task_info_destroy(job->task[i], multi_prog); eio_handle_destroy(job->eio); FREE_NULL_LIST(job->sruns); FREE_NULL_LIST(job->clients); FREE_NULL_LIST(job->stdout_eio_objs); FREE_NULL_LIST(job->stderr_eio_objs); FREE_NULL_LIST(job->free_incoming); FREE_NULL_LIST(job->free_outgoing); FREE_NULL_LIST(job->outgoing_cache); xfree(job->envtp); xfree(job->node_name); mpmd_free(job); xfree(job->task_prolog); xfree(job->task_epilog); xfree(job->job_alloc_cores); xfree(job->step_alloc_cores); xfree(job->task_cnts); xfree(job->user_name); xfree(job); }
/* * main loop of agent thread */ static void * _agent(void * unused) { eio_handle_t *pmi2_handle; eio_obj_t *tree_listen_obj, *task_obj; int i; pmi2_handle = eio_handle_create(); //fd_set_nonblocking(tree_sock); tree_listen_obj = eio_obj_create(tree_sock, &tree_listen_ops, (void *)(-1)); eio_new_initial_obj(pmi2_handle, tree_listen_obj); /* for stepd, add the sockets to tasks */ if (in_stepd()) { for (i = 0; i < job_info.ltasks; i ++) { task_obj = eio_obj_create(STEPD_PMI_SOCK(i), &task_ops, (void*)(long)(i)); eio_new_initial_obj(pmi2_handle, task_obj); } initialized = xmalloc(job_info.ltasks * sizeof(int)); finalized = xmalloc(job_info.ltasks * sizeof(int)); } eio_handle_mainloop(pmi2_handle); debug("mpi/pmi2: agent thread exit"); eio_handle_destroy(pmi2_handle); return NULL; }
eio_handle_t *eio_handle_create(uint16_t shutdown_wait) { eio_handle_t *eio = xmalloc(sizeof(*eio)); if (pipe(eio->fds) < 0) { error ("eio_create: pipe: %m"); eio_handle_destroy(eio); return (NULL); } fd_set_nonblocking(eio->fds[0]); fd_set_close_on_exec(eio->fds[0]); fd_set_close_on_exec(eio->fds[1]); xassert(eio->magic = EIO_MAGIC); eio->obj_list = list_create(eio_obj_destroy); eio->new_objs = list_create(eio_obj_destroy); slurm_mutex_init(&eio->shutdown_mutex); eio->shutdown_wait = DEFAULT_EIO_SHUTDOWN_WAIT; if (shutdown_wait > 0) eio->shutdown_wait = shutdown_wait; return eio; }
eio_handle_t *eio_handle_create(void) { eio_handle_t *eio = xmalloc(sizeof(*eio)); if (pipe(eio->fds) < 0) { error ("eio_create: pipe: %m"); eio_handle_destroy(eio); return (NULL); } fd_set_nonblocking(eio->fds[0]); fd_set_close_on_exec(eio->fds[0]); fd_set_close_on_exec(eio->fds[1]); xassert(eio->magic = EIO_MAGIC); eio->obj_list = list_create(eio_obj_destroy); eio->new_objs = list_create(eio_obj_destroy); return eio; }