Either I need to make the callbacks get deferred in a base with no events (doable), or I need to make it okay to call launch_read from inside the callback for read (tricky).
svn:r1277
evthread_win32.c \
evthread_pthread.c \
whatsnew-2.0.txt \
+ bufferevent_async.c \
WIN32-Code/config.h \
WIN32-Code/win32.c \
WIN32-Code/tree.h \
if BUILD_WIN32
SYS_LIBS = -lws2_32
-SYS_SRC = WIN32-Code/win32.c evthread_win32.c buffer_iocp.c event_iocp.c
+SYS_SRC = WIN32-Code/win32.c evthread_win32.c buffer_iocp.c event_iocp.c \
+ bufferevent_async.c
SYS_INCLUDES = -IWIN32-Code
else
struct evbuffer_chain *chain = buf_o->first_pinned;
EVBUFFER_LOCK(evbuf, EVTHREAD_WRITE);
+ buf->read_in_progress = 0;
evbuffer_unfreeze(evbuf, 0);
if (chain == evbuf->previous_to_last) {
pin_release(eo, EVBUFFER_MEM_PINNED_R);
- buf->read_in_progress = 0;
_evbuffer_decref_and_unlock(evbuf);
}
struct evbuffer *evbuf = &buf->buffer;
EVBUFFER_LOCK(evbuf, EVTHREAD_WRITE);
+ buf->write_in_progress = 0;
evbuffer_unfreeze(evbuf, 1);
evbuffer_drain(evbuf, nBytes);
pin_release(eo,EVBUFFER_MEM_PINNED_W);
- buf->write_in_progress = 0;
_evbuffer_decref_and_unlock(evbuf);
}
if (!evbuffer_get_length(b->bev.bev.output))
return;
- /* XXXX doesn't respect low-water mark very well. */
+ /* XXXX doesn't respect low-water mark very well. */
if (evbuffer_launch_write(b->bev.bev.output, -1)) {
assert(0);/* XXX act sensibly. */
} else {
{
size_t cur_size;
size_t read_high;
+ size_t at_most;
/* Don't read if there is a read in progress, or we do not
* want to read. */
if (b->read_in_progress || !(b->bev.bev.enabled&EV_READ))
/* Don't read if we're full */
cur_size = evbuffer_get_length(b->bev.bev.input);
read_high = b->bev.bev.wm_read.high;
- if (cur_size >= read_high)
- return;
+ if (read_high) {
+ if (cur_size >= read_high)
+ return;
+ at_most = read_high - cur_size;
+ } else {
+ at_most = 16384; /* FIXME totally magic. */
+ }
- if (evbuffer_launch_read(b->bev.bev.input, read_high-cur_size)) {
+ if (evbuffer_launch_read(b->bev.bev.input, at_most)) {
assert(0);
} else {
b->read_in_progress = 1;
#endif
#include "event-config.h"
+#include <sys/queue.h>
+#include "event2/event_struct.h"
#include "minheap-internal.h"
#include "evsignal-internal.h"
#include "mm-internal.h"
#include "iocp-internal.h"
#include "log-internal.h"
#include "mm-internal.h"
+#include "event-internal.h"
#define NOTIFICATION_KEY ((ULONG_PTR)-1)
return (r==0) ? -1 : 0;
}
-struct event_iocp *
+struct event_iocp_port *
event_base_get_iocp(struct event_base *base)
{
#ifdef WIN32
struct event_overlapped *o,
uintptr_t key, ev_uint32_t n_bytes);
+struct event_base;
struct event_iocp_port *event_base_get_iocp(struct event_base *base);
#ifdef __cplusplus
for (i=0;i<10;++i)
evbuffer_add(wbuf, junk, sizeof(junk));
- tt_assert(!evbuffer_launch_read(rbuf, 2048));
+ tt_assert(!evbuffer_get_length(rbuf));
tt_assert(!evbuffer_launch_write(wbuf, 512));
+ tt_assert(!evbuffer_launch_read(rbuf, 2048));
#ifdef WIN32
/* FIXME this is stupid. */
Sleep(1000);
#endif
+ tt_int_op(evbuffer_get_length(rbuf),==,512);
+
+
/* FIXME Actually test some stuff here. */
end:
#endif
bea1 = bufferevent_async_new(data->base, data->pair[0],
- BEV_OPT_DEFER_CALLBACKS);
+ 0); /* We'd defer callbacks, but that would need a base. */
bea2 = bufferevent_async_new(data->base, data->pair[1],
- BEV_OPT_DEFER_CALLBACKS);
+ 0);
tt_assert(bea1);
tt_assert(bea2);
#endif
n = bufferevent_read(bea2, buf, sizeof(buf)-1);
buf[n]='\0';
- tt_assert(!strcmp(buf, "Hello world"));
+ tt_str_op(buf, ==, "Hello world");
end:
/* FIXME: free stuff. */;