diff --git a/debug/pipe2.c b/debug/pipe2.c index 286bc6c..845487c 100644 --- a/debug/pipe2.c +++ b/debug/pipe2.c @@ -20,6 +20,27 @@ for (j = 0; j < 2; j++) printf("p[%i]: %i\n", j, p[j]); + write(p[1], "TEST 1", MSGSIZE); + printf("r: %i\n", read(p[0], inbuf, MSGSIZE)); + printf("Parent: %s\n", inbuf); + write(p[1], "TEST 2", MSGSIZE); + printf("r: %i\n", read(p[0], inbuf, MSGSIZE)); + printf("Parent: %s\n", inbuf); + printf("r: %i\n", read(p[0], inbuf, MSGSIZE)); + printf("Parent: %s\n", inbuf); + write(p[1], "TEST 3", MSGSIZE); + read(p[0], inbuf, MSGSIZE); + printf("Parent: %s\n", inbuf); +printf("lseek: %i\n", lseek(p[0], 128, SEEK_SET)); + write(p[1], "TEST 4", MSGSIZE); + write(p[1], "TEST 5", MSGSIZE); + read(p[0], inbuf, MSGSIZE); + printf("Parent: %s\n", inbuf); + read(p[0], inbuf, MSGSIZE); + printf("Parent: %s\n", inbuf); + printf("r: %i\n", read(p[0], inbuf, MSGSIZE)); + printf("Parent: %s\n", inbuf); +/* switch (pid = fork()) { case 0: close(p[0]); @@ -34,6 +55,7 @@ printf("Parent: %s\n", inbuf); } } +*/ return(0); } diff --git a/sys/fs/vfs/file.c b/sys/fs/vfs/file.c index f875f9f..f27f5db 100644 --- a/sys/fs/vfs/file.c +++ b/sys/fs/vfs/file.c @@ -51,7 +51,9 @@ if (uap->fd == 0x0) tty_print((char *) uap->buf, _current->term); else { + #ifdef DEBUG_VFS kprintf("uap->size: %i, FD: [0x%X], BUF: [0x%X][%c]\n", uap->nbytes, uap->fd, uap->buf, t[0]); + #endif fwrite(uap->buf, uap->nbytes, 1, uap->fd->fd); } @@ -523,7 +525,6 @@ spinLock(&fdTable_lock); for (tmpFd = fdTable; tmpFd != 0x0; tmpFd = tmpFd->next) { - kprintf("(tFd: 0x%X, tFdN: 0x%X, fd: 0x%X)", tmpFd, tmpFd->next, fd); if (tmpFd == fd) { if (tmpFd->prev) tmpFd->prev->next = tmpFd->next; @@ -533,8 +534,6 @@ if (tmpFd == fdTable) fdTable = tmpFd->next; - kprintf("(NfdT: 0x%X]", fdTable); - systemVitals->openFiles--; spinUnlock(&fdTable_lock); if (tmpFd->buffer != NULL) diff --git a/sys/kernel/vfs_calls.c b/sys/kernel/vfs_calls.c index fe752c1..eb03a5c 100644 --- a/sys/kernel/vfs_calls.c +++ b/sys/kernel/vfs_calls.c @@ -45,7 +45,7 @@ if (error) return (error); - kprintf("sO: 0x%X:%s", args->mode, args->path); + //kprintf("sO: 0x%X:%s", args->mode, args->path); nfp->fd = fopen(args->path, "rb"); @@ -115,6 +115,7 @@ int sys_close(struct thread *td, struct sys_close_args *args) { struct file *fd = 0x0; + struct pipeInfo *pFD = 0x0; getfd(td, &fd, args->fd); @@ -128,10 +129,21 @@ else { switch (fd->fd_type) { case 3: - kprintf("Can't close pipes yet"); + pFD = fd->data; + if (args->fd == pFD->rFD) { + if (pFD->rfdCNT < 2) + fdestroy(td, fd, args->fd); + pFD->rfdCNT--; + } + + if (args->fd == pFD->wFD) { + if (pFD->wfdCNT < 2) + fdestroy(td, fd, args->fd); + pFD->wfdCNT--; + } + break; default: - kprintf("[CLS: %i:0x%X]", args->fd, fd); if (args->fd < 3) td->td_retval[0] = 0; else if (!fclose(fd->fd)) @@ -158,16 +170,24 @@ size_t nbytes; + int rpCNT = 0; + getfd(td, &fd, args->fd); if (args->fd > 3) { switch (fd->fd_type) { case 3: /* XXX - Pipe2 Handling */ pFD = fd->data; - while (pFD->bCNT == 0) + while (pFD->bCNT == 0 && rpCNT < 100) { sched_yield(); + rpCNT++; + } - nbytes = (args->nbyte - (pFD->headPB->nbytes - pFD->headPB->offset) <= 0) ? args->nbyte : (pFD->headPB->nbytes - pFD->headPB->offset); + if (rpCNT >= 100 && pFD->bCNT == 0) { + td->td_retval[0] = 0; + } + else { + nbytes = (args->nbyte - (pFD->headPB->nbytes - pFD->headPB->offset) <= 0) ? args->nbyte : (pFD->headPB->nbytes - pFD->headPB->offset); //kprintf("[unb: %i, nbs: %i, bf: 0x%X]", args->nbyte, nbytes, fd->fd->buffer); //kprintf("PR: [%i]", nbytes); memcpy(args->buf, pFD->headPB->buffer + pFD->headPB->offset, nbytes); @@ -177,11 +197,15 @@ rpFD = pFD->headPB; pFD->headPB = pFD->headPB->next; kfree(rpFD); + pFD->bCNT--; } + td->td_retval[0] = nbytes; +} break; default: + kprintf("[r:0x%X:%i:%i:%s]",fd->fd, args->fd, fd->fd_type, fd->fd->fileName); td->td_retval[0] = fread(args->buf, args->nbyte, 1, fd->fd); } } @@ -313,7 +337,9 @@ pBuf->buffer = kmalloc(uap->nbyte); //kprintf("[unb: %i, nbs: %i, bf: 0x%X]", uap->nbyte, nbytes, fd->fd->buffer); - memcpy(pBuf->buffer, uap->buf, nbytes); + memcpy(pBuf->buffer, uap->buf, uap->nbyte); + + pBuf->nbytes = uap->nbyte; if (pFD->tailPB) pFD->tailPB->next = pBuf; @@ -323,6 +349,8 @@ if (!pFD->headPB) pFD->headPB = pBuf; + pFD->bCNT++; + td->td_retval[0] = nbytes; //kprintf("[PW: %i:%i]", nbytes, fd->fd->offset); break;