FreeBSD Bugzilla – Attachment 8260 Details for
Bug 17366
sendfile() has no pthreads wrapper
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
sendfile.diff
sendfile.diff (text/plain; charset=us-ascii), 5.49 KB, created by
Jason Evans
on 2000-03-25 00:43:08 UTC
(
hide
)
Description:
sendfile.diff
Filename:
MIME Type:
Creator:
Jason Evans
Created:
2000-03-25 00:43:08 UTC
Size:
5.49 KB
patch
obsolete
>Index: Makefile >=================================================================== >RCS file: /home/ncvs/src/lib/libc_r/Makefile,v >retrieving revision 1.24 >diff -u -r1.24 Makefile >--- Makefile 2000/01/27 23:06:56 1.24 >+++ Makefile 2000/03/25 00:39:35 >@@ -31,7 +31,7 @@ > flock.o fpathconf.o fstat.o fstatfs.o fsync.o getdirentries.o \ > getlogin.o getpeername.o getsockname.o getsockopt.o ioctl.o listen.o \ > msync.o nanosleep.o nfssvc.o open.o poll.o read.o readv.o recvfrom.o \ >- recvmsg.o sched_yield.o select.o sendmsg.o sendto.o \ >+ recvmsg.o sched_yield.o select.o sendfile.o sendmsg.o sendto.o \ > setsockopt.o shutdown.o sigaction.o sigaltstack.o \ > signanosleep.o sigpending.o sigprocmask.o sigreturn.o sigsetmask.o \ > sigsuspend.o socket.o \ >Index: uthread/Makefile.inc >=================================================================== >RCS file: /home/ncvs/src/lib/libc_r/uthread/Makefile.inc,v >retrieving revision 1.23 >diff -u -r1.23 Makefile.inc >--- uthread/Makefile.inc 2000/01/27 23:06:57 1.23 >+++ uthread/Makefile.inc 2000/03/25 00:39:36 >@@ -92,6 +92,7 @@ > uthread_select.c \ > uthread_self.c \ > uthread_sem.c \ >+ uthread_sendfile.c \ > uthread_sendmsg.c \ > uthread_sendto.c \ > uthread_seterrno.c \ >--- /dev/null Fri Mar 24 16:10:23 2000 >+++ uthread/uthread_sendfile.c Fri Mar 24 16:37:43 2000 >@@ -0,0 +1,149 @@ >+/* >+ * Copyright (C) 2000 Jason Evans <jasone@canonware.com>. >+ * All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice(s), this list of conditions and the following disclaimer as >+ * the first lines of this file unmodified other than the possible >+ * addition of one or more copyright notices. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice(s), this list of conditions and the following disclaimer in >+ * the documentation and/or other materials provided with the >+ * distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY >+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE >+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE >+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR >+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, >+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE >+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, >+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ * >+ * $FreeBSD$ >+ */ >+ >+#include <sys/fcntl.h> >+#include <sys/types.h> >+#include <sys/socket.h> >+#include <sys/uio.h> >+#include <errno.h> >+#ifdef _THREAD_SAFE >+#include <pthread.h> >+#include "pthread_private.h" >+ >+int >+sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, >+ off_t *sbytes, int flags) >+{ >+ int ret, type, blocking; >+ ssize_t wvret, num = 0; >+ off_t n, nwritten = 0; >+ >+ /* Write the headers if any. */ >+ if ((hdtr != NULL) && (hdtr->headers != NULL)) { >+ if (wvret = writev(s, hdtr->headers, hdtr->hdr_cnt) == -1) { >+ ret = -1; >+ goto ERROR; >+ } else >+ nwritten += wvret; >+ } >+ >+ /* Lock the descriptors. */ >+ if ((ret = _FD_LOCK(fd, FD_READ, NULL)) != 0) { >+ goto ERROR; >+ } >+ if ((ret = _FD_LOCK(s, FD_WRITE, NULL)) != 0) { >+ goto ERROR_1; >+ } >+ >+ /* Check the descriptor access modes. */ >+ type = _thread_fd_table[fd]->flags & O_ACCMODE; >+ if (type != O_RDONLY && type != O_RDWR) { >+ /* File is not open for read. */ >+ errno = EBADF; >+ goto ERROR_2; >+ } >+ type = _thread_fd_table[s]->flags & O_ACCMODE; >+ if (type != O_WRONLY && type != O_RDWR) { >+ /* File is not open for write. */ >+ errno = EBADF; >+ goto ERROR_2; >+ } >+ >+ /* Check if file operations are to block */ >+ blocking = ((_thread_fd_table[s]->flags & O_NONBLOCK) == 0); >+ >+ /* >+ * Loop while no error occurs and until the expected number of bytes are >+ * written. >+ */ >+ for (;;) { >+ /* Perform a non-blocking sendfile syscall. */ >+ ret = _thread_sys_sendfile(fd, s, offset + num, nbytes - num, >+ NULL, &n, flags); >+ >+ if (ret == 0) { >+ /* Writing completed. */ >+ num += n; >+ break; >+ } else if ((blocking) && (ret == -1) && (errno == EAGAIN)) { >+ /* >+ * Some bytes were written but there are still more to >+ * write. >+ */ >+ >+ /* Update the count of bytes written. */ >+ num += n; >+ >+ _thread_run->data.fd.fd = fd; >+ _thread_kern_set_timeout(NULL); >+ >+ /* Reset the interrupted operation flag: */ >+ _thread_run->interrupted = 0; >+ >+ _thread_kern_sched_state(PS_FDW_WAIT, __FILE__, >+ __LINE__); >+ >+ if (_thread_run->interrupted) { >+ /* Interrupted by a signal. Return an error. */ >+ ret = -1; >+ break; >+ } >+ } else { >+ /* Error. */ >+ break; >+ } >+ } >+ >+ ERROR_2: >+ _FD_UNLOCK(s, FD_WRITE); >+ ERROR_1: >+ _FD_UNLOCK(fd, FD_READ); >+ ERROR: >+ if (ret == 0) { >+ /* Write the trailers, if any. */ >+ if ((hdtr != NULL) && (hdtr->trailers != NULL)) { >+ if (wvret = writev(s, hdtr->trailers, hdtr->trl_cnt) >+ == -1) >+ ret = -1; >+ else >+ nwritten += wvret; >+ } >+ } >+ if (sbytes != NULL) { >+ /* >+ * Number of bytes written in headers/trailers, plus in the main >+ * sendfile() loop. >+ */ >+ *sbytes = nwritten + num; >+ } >+ return ret; >+} >+#endif
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 17366
: 8260