/* * 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; }
int msg_thr_create(slurmd_job_t *job) { int fd; eio_obj_t *eio_obj; pthread_attr_t attr; int rc = SLURM_SUCCESS, retries = 0; errno = 0; fd = _domain_socket_create(conf->spooldir, conf->node_name, job->jobid, job->stepid); if (fd == -1) return SLURM_ERROR; fd_set_nonblocking(fd); eio_obj = eio_obj_create(fd, &msg_socket_ops, (void *)job); job->msg_handle = eio_handle_create(); eio_new_initial_obj(job->msg_handle, eio_obj); slurm_attr_init(&attr); while (pthread_create(&job->msgid, &attr, &_msg_thr_internal, (void *)job)) { error("msg_thr_create: pthread_create error %m"); if (++retries > MAX_RETRIES) { error("msg_thr_create: Can't create pthread"); rc = SLURM_ERROR; break; } usleep(10); /* sleep and again */ } slurm_attr_destroy(&attr); return rc; }