static void cleanup(void) { if (mqd != -1) { remove_mqueue(mqd); } if (rc != -1) { remove_mqueue(rc); } remove_pipe(father_to_child); remove_pipe(child_to_father); }
/* * steps F_STEP_XX : called from main * steps C_STEP_XX : called from child_fn */ static void cleanup_resources(int step, mqd_t mqd) { switch (step) { case C_STEP_1: close(father_to_child[0]); /* fall through */ case C_STEP_0: mq_close(mqd); break; case F_STEP_3: remove_mqueue(mqd); close(father_to_child[1]); break; case F_STEP_2: ltp_syscall(__NR_mq_notify, mqd, NULL); /* fall through */ case F_STEP_1: remove_mqueue(mqd); /* fall through */ case F_STEP_0: remove_pipe(father_to_child); break; default: tst_resm(TWARN, "Unknown code - no resource removed."); break; } }
Datum dbms_pipe_remove_pipe (PG_FUNCTION_ARGS) { text *pipe_name = PG_GETARG_TEXT_P(0); float8 endtime; int cycle = 0; int timeout = 10; WATCH_PRE(timeout, endtime, cycle); if (ora_lock_shmem(SHMEMMSGSZ, MAX_PIPES,MAX_EVENTS,MAX_LOCKS,false)) { remove_pipe(pipe_name, false); LWLockRelease(shmem_lockid); PG_RETURN_VOID(); } WATCH_POST(timeout, endtime, cycle); LOCK_ERROR(); PG_RETURN_VOID(); }
static void *run_reader(void *rdv) { struct sb_reader *rd = rdv; const int ofd = get_stream_fd(rd->stream); while ( 1 ) { int r, i; struct timeval tv; fd_set fds; int fdmax; /* Exit when: * - No fhs left open to read from * AND - Main thread says "done" */ if ( (rd->n_read == 0) && rd->done ) break; tv.tv_sec = 1; tv.tv_usec = 0; FD_ZERO(&fds); fdmax = 0; pthread_mutex_lock(&rd->lock); for ( i=0; i<rd->n_read; i++ ) { int fd; fd = rd->fds[i]; FD_SET(fd, &fds); if ( fd > fdmax ) fdmax = fd; } pthread_mutex_unlock(&rd->lock); r = select(fdmax+1, &fds, NULL, NULL, &tv); if ( r == -1 ) { if ( errno != EINTR ) { ERROR("select() failed: %s\n", strerror(errno)); } /* Otherwise no big deal */ continue; } pthread_mutex_lock(&rd->lock); for ( i=0; i<rd->n_read; i++ ) { if ( !FD_ISSET(rd->fds[i], &fds) ) { continue; } /* If the chunk cannot be read, assume the connection * is broken and that the process will die soon. */ if ( pump_chunk(rd->fhs[i], ofd) ) { /* remove_pipe() assumes that the caller is * holding rd->lock ! */ remove_pipe(rd, i); } } pthread_mutex_unlock(&rd->lock); } return NULL; }