mirror of /home/gitosis/repositories/libowfat.git

11 changed files with 132 additions and 6 deletions
@ -0,0 +1,62 @@
|
||||
#include "io_internal.h" |
||||
#include <iarray.h> |
||||
#include <fmt.h> |
||||
#include <time.h> |
||||
|
||||
unsigned int io_debugstring(int64 s,char* buf,unsigned int bufsize) { |
||||
struct timeval tv; |
||||
unsigned int i; |
||||
io_entry* e; |
||||
gettimeofday(&tv,NULL); |
||||
e=iarray_get(&io_fds,s); |
||||
if (!e) return 0; |
||||
if (bufsize<100) return 0; |
||||
i=fmt_str(buf,"first_readable "); |
||||
i+=fmt_long(buf+i,first_readable); |
||||
i+=fmt_str(buf+i,", first_writeable "); |
||||
i+=fmt_long(buf+i,first_writeable); |
||||
#ifdef HAVE_SIGIO |
||||
i+=fmt_str(buf+i,", alt_firstread "); |
||||
i+=fmt_long(buf+i,alt_firstread); |
||||
i+=fmt_str(buf+i,", alt_firstwrite "); |
||||
i+=fmt_long(buf+i,alt_firstwrite); |
||||
#endif |
||||
i+=fmt_str(buf+i,"\n"); |
||||
|
||||
i+=fmt_str(buf+i,"fd # "); |
||||
i+=fmt_ulong(buf+i,s); |
||||
i+=fmt_str(buf+i,": "); |
||||
if (bufsize-i<100) return 0; |
||||
i+=fmt_str(buf+i,"timeout "); |
||||
i+=fmt_long(buf+i,e->timeout.sec.x-4611686018427387914ULL-tv.tv_sec); |
||||
i+=fmt_str(buf+i,"."); |
||||
i+=fmt_ulong(buf+i,e->timeout.nano); |
||||
i+=fmt_str(buf+i," "); |
||||
if (bufsize-i<100) return 0; |
||||
if (e->wantread) i+=fmt_str(buf+i,"wr "); |
||||
if (e->wantwrite) i+=fmt_str(buf+i,"ww "); |
||||
if (e->canread) i+=fmt_str(buf+i,"cr "); |
||||
if (e->canwrite) i+=fmt_str(buf+i,"cw "); |
||||
if (e->nonblock) i+=fmt_str(buf+i,"nb "); |
||||
if (!e->inuse) i+=fmt_str(buf+i,"!inuse "); |
||||
if (e->kernelwantread) i+=fmt_str(buf+i,"kwr "); |
||||
if (e->kernelwantwrite) i+=fmt_str(buf+i,"kww "); |
||||
if (e->epolladded) i+=fmt_str(buf+i,"ea "); |
||||
if (e->mmapped) { |
||||
i+=fmt_str(buf+i,"mmap("); |
||||
i+=fmt_xlong(buf+i,(unsigned long)e->mmapped); |
||||
i+=fmt_str(buf+i,","); |
||||
i+=fmt_xlong(buf+i,(unsigned long)e->maplen); |
||||
i+=fmt_str(buf+i,"@"); |
||||
i+=fmt_xlonglong(buf+i,(unsigned long)e->mapofs); |
||||
} |
||||
if (bufsize-i<100) return 0; |
||||
i+=fmt_str(buf+i,"next_read "); |
||||
i+=fmt_long(buf+i,e->next_read); |
||||
i+=fmt_str(buf+i," next_write "); |
||||
i+=fmt_long(buf+i,e->next_write); |
||||
i+=fmt_str(buf+i," cookie "); |
||||
i+=fmt_xlonglong(buf+i,(unsigned long)e->cookie); |
||||
buf[i]=0; |
||||
return i; |
||||
} |
@ -0,0 +1,40 @@
|
||||
.TH io_fd_flags 3 |
||||
.SH NAME |
||||
io_fd_flags \- prepare descriptor for io_wait |
||||
.SH SYNTAX |
||||
.B #include <io.h> |
||||
|
||||
int \fBio_fd\fP(int64 fd); |
||||
|
||||
#ifdef HAVE_IO_FD_FLAGS |
||||
|
||||
int \fBio_fd_flags\fP(int64 fd); |
||||
.SH DESCRIPTION |
||||
io_fd_flags behaves just like io_fd, but certain flags can be |
||||
bitwise-ORed to it to alter its behavior: |
||||
|
||||
.RS 0 |
||||
.IP IO_FD_CANWRITE |
||||
tell io_fd that the descriptor is writable. This is useful so |
||||
io_wantwrite can queue the descriptor immediately and there is no need |
||||
to query the operating system event reporting mechanism. |
||||
.IP IO_FD_BLOCK |
||||
tell io_fd that the descriptor is blocking. |
||||
.IP IO_FD_NONBLOCK |
||||
tell io_fd that the descriptor is non-blocking. |
||||
.RE |
||||
|
||||
Normally, io_fd calls fcntl to ask the operating system whether the |
||||
descriptor is blocking or not. The frameworks needs to know because it |
||||
alters how io_tryread and io_trywrite handle the socket. Never pass |
||||
both IO_FD_BLOCK and IO_FD_NONBLOCK at the same time. |
||||
|
||||
Newly connected stream sockets are always writable if the connection is |
||||
established, so it is usually safe to pass IO_FD_CANWRITE. The main |
||||
exception case where IO_FD_CANWRITE should not be passed is on a |
||||
non-blocking socket where a connect() is pending. Then you need to poll |
||||
for writability to get notified when the connection is established. |
||||
.SH "RETURN VALUE" |
||||
io_fd_flags returns 1 on success, 0 on error. |
||||
.SH "SEE ALSO" |
||||
io_fd(3), io_fd_canwrite(3) |
@ -0,0 +1,8 @@
|
||||
#include "io_internal.h" |
||||
|
||||
int io_timedout(int64 d) { |
||||
tai6464 now; |
||||
io_entry* e=iarray_get(&io_fds,d); |
||||
taia_now(&now); |
||||
return (e && e->timeout.sec.x && taia_less(&e->timeout,&now)); |
||||
} |
Loading…
Reference in new issue