hopefully fix the infinite loop in gatling
parent
193dfba16b
commit
c60c2425ce
@ -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