Lines Matching defs:cpipe

223 static void pipeclose(struct pipe *cpipe);
224 static void pipe_free_kmem(struct pipe *cpipe);
226 static int pipespace(struct pipe *cpipe, int size);
229 static void pipeselwakeup(struct pipe *cpipe, struct pipe *spipe);
230 static __inline int pipeio_lock(struct pipe *cpipe, int catch);
231 static __inline void pipeio_unlock(struct pipe *cpipe);
234 extern void evpipefree(struct pipe *cpipe);
259 static void pipe_garbage_collect(struct pipe *cpipe);
486 pipe_stat(struct pipe *cpipe, void *ub, int isstat64)
496 if (cpipe == NULL)
498 PIPE_LOCK(cpipe);
501 error = mac_pipe_check_stat(kauth_cred_get(), cpipe);
503 PIPE_UNLOCK(cpipe);
507 if (cpipe->pipe_buffer.buffer == 0) {
509 if (cpipe->pipe_peer) {
511 pipe_size = MAX_PIPESIZE(cpipe->pipe_peer);
512 pipe_count = cpipe->pipe_peer->pipe_buffer.cnt;
517 pipe_size = MAX_PIPESIZE(cpipe);
518 pipe_count = cpipe->pipe_buffer.cnt;
539 sb64->st_atimespec.tv_sec = cpipe->st_atimespec.tv_sec;
540 sb64->st_atimespec.tv_nsec = cpipe->st_atimespec.tv_nsec;
542 sb64->st_mtimespec.tv_sec = cpipe->st_mtimespec.tv_sec;
543 sb64->st_mtimespec.tv_nsec = cpipe->st_mtimespec.tv_nsec;
545 sb64->st_ctimespec.tv_sec = cpipe->st_ctimespec.tv_sec;
546 sb64->st_ctimespec.tv_nsec = cpipe->st_ctimespec.tv_nsec;
553 sb64->st_ino = (ino64_t)VM_KERNEL_ADDRPERM((uintptr_t)cpipe);
566 sb->st_atimespec.tv_sec = cpipe->st_atimespec.tv_sec;
567 sb->st_atimespec.tv_nsec = cpipe->st_atimespec.tv_nsec;
569 sb->st_mtimespec.tv_sec = cpipe->st_mtimespec.tv_sec;
570 sb->st_mtimespec.tv_nsec = cpipe->st_mtimespec.tv_nsec;
572 sb->st_ctimespec.tv_sec = cpipe->st_ctimespec.tv_sec;
573 sb->st_ctimespec.tv_nsec = cpipe->st_ctimespec.tv_nsec;
580 sb->st_ino = (ino_t)VM_KERNEL_ADDRPERM((uintptr_t)cpipe);
582 PIPE_UNLOCK(cpipe);
603 pipespace(struct pipe *cpipe, int size)
614 pipe_free_kmem(cpipe);
615 cpipe->pipe_buffer.buffer = (caddr_t)buffer;
616 cpipe->pipe_buffer.size = size;
617 cpipe->pipe_buffer.in = 0;
618 cpipe->pipe_buffer.out = 0;
619 cpipe->pipe_buffer.cnt = 0;
622 OSAddAtomic(cpipe->pipe_buffer.size, &amountpipekva);
633 struct pipe *cpipe;
634 cpipe = (struct pipe *)zalloc(pipe_zone);
636 if ((*cpipep = cpipe) == NULL)
643 bzero(cpipe, sizeof *cpipe);
646 pipe_touch(cpipe, PIPE_ATIME | PIPE_MTIME | PIPE_CTIME);
655 pipeio_lock(struct pipe *cpipe, int catch)
658 while (cpipe->pipe_state & PIPE_LOCKFL) {
659 cpipe->pipe_state |= PIPE_LWANT;
660 error = msleep(cpipe, PIPE_MTX(cpipe), catch ? (PRIBIO | PCATCH) : PRIBIO,
665 cpipe->pipe_state |= PIPE_LOCKFL;
673 pipeio_unlock(struct pipe *cpipe)
675 cpipe->pipe_state &= ~PIPE_LOCKFL;
676 if (cpipe->pipe_state & PIPE_LWANT) {
677 cpipe->pipe_state &= ~PIPE_LWANT;
678 wakeup(cpipe);
686 pipeselwakeup(struct pipe *cpipe, struct pipe *spipe)
688 if (cpipe->pipe_state & PIPE_SEL) {
689 cpipe->pipe_state &= ~PIPE_SEL;
690 selwakeup(&cpipe->pipe_sel);
692 if (cpipe->pipe_state & PIPE_KNOTE)
693 KNOTE(&cpipe->pipe_sel.si_note, 1);
695 postpipeevent(cpipe, EV_RWBYTES);
1242 struct pipe *cpipe;
1245 cpipe = (struct pipe *)fg->fg_data;
1248 if (cpipe)
1249 pipeclose(cpipe);
1255 pipe_free_kmem(struct pipe *cpipe)
1257 if (cpipe->pipe_buffer.buffer != NULL) {
1258 OSAddAtomic(-(cpipe->pipe_buffer.size), &amountpipekva);
1260 kfree((void *)cpipe->pipe_buffer.buffer,
1261 cpipe->pipe_buffer.size);
1262 cpipe->pipe_buffer.buffer = NULL;
1263 cpipe->pipe_buffer.size = 0;
1271 pipeclose(struct pipe *cpipe)
1275 if (cpipe == NULL)
1278 if (PIPE_MTX(cpipe) != NULL)
1279 PIPE_LOCK(cpipe);
1286 cpipe->pipe_state &= ~PIPE_DRAIN;
1287 cpipe->pipe_state |= PIPE_EOF;
1288 pipeselwakeup(cpipe, cpipe);
1290 while (cpipe->pipe_busy) {
1291 cpipe->pipe_state |= PIPE_WANT;
1293 wakeup(cpipe);
1294 msleep(cpipe, PIPE_MTX(cpipe), PRIBIO, "pipecl", 0);
1301 if (cpipe->pipe_label != NULL && cpipe->pipe_peer == NULL)
1302 mac_pipe_label_destroy(cpipe);
1308 if ((ppipe = cpipe->pipe_peer) != NULL) {
1316 if (cpipe->pipe_state & PIPE_KNOTE)
1323 evpipefree(cpipe);
1328 if (PIPE_MTX(cpipe) != NULL) {
1334 PIPE_UNLOCK(cpipe);
1340 PIPE_UNLOCK(cpipe);
1341 lck_mtx_free(PIPE_MTX(cpipe), pipe_mtx_grp);
1344 pipe_free_kmem(cpipe);
1345 if (cpipe->pipe_state & PIPE_WSELECT) {
1346 pipe_garbage_collect(cpipe);
1348 zfree(pipe_zone, cpipe);
1358 struct pipe *cpipe;
1360 cpipe = (struct pipe *)kn->kn_fp->f_data;
1362 PIPE_LOCK(cpipe);
1369 if (mac_pipe_check_kqfilter(vfs_context_ucred(ctx), kn, cpipe) != 0) {
1370 PIPE_UNLOCK(cpipe);
1383 if (cpipe->pipe_peer == NULL) {
1387 PIPE_UNLOCK(cpipe);
1390 if (cpipe->pipe_peer)
1391 cpipe = cpipe->pipe_peer;
1394 PIPE_UNLOCK(cpipe);
1398 if (KNOTE_ATTACH(&cpipe->pipe_sel.si_note, kn))
1399 cpipe->pipe_state |= PIPE_KNOTE;
1401 PIPE_UNLOCK(cpipe);
1408 struct pipe *cpipe = (struct pipe *)kn->kn_fp->f_data;
1410 PIPE_LOCK(cpipe);
1413 if (cpipe->pipe_peer == NULL) {
1414 PIPE_UNLOCK(cpipe);
1417 cpipe = cpipe->pipe_peer;
1419 if (cpipe->pipe_state & PIPE_KNOTE) {
1420 if (KNOTE_DETACH(&cpipe->pipe_sel.si_note, kn))
1421 cpipe->pipe_state &= ~PIPE_KNOTE;
1423 PIPE_UNLOCK(cpipe);
1509 fill_pipeinfo(struct pipe * cpipe, struct pipe_info * pinfo)
1519 if (cpipe == NULL)
1521 PIPE_LOCK(cpipe);
1524 error = mac_pipe_check_stat(kauth_cred_get(), cpipe);
1526 PIPE_UNLOCK(cpipe);
1530 if (cpipe->pipe_buffer.buffer == 0) {
1534 if (cpipe->pipe_peer) {
1538 pipe_size = MAX_PIPESIZE(cpipe->pipe_peer);
1539 pipe_count = cpipe->pipe_peer->pipe_buffer.cnt;
1544 pipe_size = MAX_PIPESIZE(cpipe);
1545 pipe_count = cpipe->pipe_buffer.cnt;
1582 pinfo->pipe_handle = (uint64_t)VM_KERNEL_ADDRPERM((uintptr_t)cpipe);
1583 pinfo->pipe_peerhandle = (uint64_t)VM_KERNEL_ADDRPERM((uintptr_t)(cpipe->pipe_peer));
1584 pinfo->pipe_status = cpipe->pipe_state;
1586 PIPE_UNLOCK(cpipe);
1597 struct pipe *ppipe, *cpipe = (struct pipe *)(fp->f_fglob->fg_data);
1599 if (cpipe) {
1600 PIPE_LOCK(cpipe);
1601 cpipe->pipe_state |= PIPE_DRAIN;
1602 cpipe->pipe_state &= ~(PIPE_WANTR | PIPE_WANTW);
1603 wakeup(cpipe);
1606 if ((ppipe = cpipe->pipe_peer)) {
1612 PIPE_UNLOCK(cpipe);
1633 pipe_garbage_collect(struct pipe *cpipe)
1657 if (cpipe) {
1658 cpipe->pipe_state = PIPE_DEAD;
1670 cpipe);
1675 pgp->pg_pipe = cpipe;