for (int i = 0; i < listener_count; i++) {
net_nonblock(listeners[i].sock);
netpoll::add(listeners[i].sock, SOCKTYPE_LISTENER, &listeners[i]);
- netpoll::reg(listeners[i].sock, NETPOLL_IN);
+ netpoll::reg(listeners[i].sock, UV_READABLE);
}
FILE *f = fopen(getdatafile("init.txt"), "rb" FOPEN_CLOEXEC);
while ((ev = netpoll::get(&pfd))) {
switch (pfd.type) {
case SOCKTYPE_LISTENER:
- if (ev & NETPOLL_IN)
+ if (ev & UV_READABLE)
accept_from_sock((struct listener *)pfd.assoc);
break;
case SOCKTYPE_CLIENT: {
struct client_data *cl = (struct client_data *)pfd.assoc;
- int isr = ev & NETPOLL_IN;
- int isw = ev & NETPOLL_OUT;
+ int isr = ev & UV_READABLE;
+ int isw = ev & UV_WRITABLE;
/* NOTE: recvProc can kill the client, so writing should be done first. */
if ((cl->want_read_for_write && isr) || (cl->want_write_for_write && isw))
sendClient(cl, 0, 0);
}
case SOCKTYPE_DYING: {
struct client_data *cl = (struct client_data *)pfd.assoc;
- int isr = ev & NETPOLL_IN;
- int isw = ev & NETPOLL_OUT;
+ int isr = ev & UV_READABLE;
+ int isw = ev & UV_WRITABLE;
if (cl->wbufLen)
if ((cl->want_read_for_write && isr) || (cl->want_write_for_write && isw))
sendClient(cl, 0, 0);
*/
if (!cl->dying) {
if (!cl->want_write_for_read || cl->want_read_for_write)
- nreg |= NETPOLL_IN;
+ nreg |= UV_READABLE;
if (cl->want_write_for_read || cl->want_write_for_write)
- nreg |= NETPOLL_OUT;
+ nreg |= UV_WRITABLE;
} else {
if (cl->want_read_for_write || cl->want_read_for_close)
- nreg |= NETPOLL_IN;
+ nreg |= UV_READABLE;
if (cl->want_write_for_write || cl->want_write_for_close)
- nreg |= NETPOLL_OUT;
+ nreg |= UV_WRITABLE;
}
if (nreg != cl->poll_reg) {
netpoll::reg(cl->FD, nreg);
#include "netpoll.h"
#include "util.h"
-#include <uv.h>
#include <algorithm>
namespace netpoll {
}
lastptr = 0;
}
-static void reg_impl(int i, int ev)
-{
- int events = 0;
- if (ev & NETPOLL_IN)
- events |= UV_READABLE;
- if (ev & NETPOLL_OUT)
- events |= UV_WRITABLE;
- uvpoll[i]->events = events;
-}
void begin(void)
{
for (int i = 0; i < nfds; i++) {
while (!ev) {
if (lastptr == nfds)
return 0;
- int pev = uvpoll[lastptr]->revents;
- if (pev & UV_READABLE)
- ev |= NETPOLL_IN;
- if (pev & UV_WRITABLE)
- ev |= NETPOLL_OUT;
+ ev = uvpoll[lastptr]->revents & (UV_READABLE | UV_WRITABLE);
lastptr++;
}
*out = fds[lastptr-1];
void del_and_close(SOCKET fd)
{
int i = search(fd, false);
- reg_impl(i, 0);
+ uvpoll[i]->events = 0;
del_impl(i);
memmove(fds+i, fds+i+1, sizeof(fds[0])*(nfds-(i+1)));
nfds--;
}
void reg(SOCKET fd, int ev)
{
- reg_impl(search(fd, false), ev);
+ uvpoll[search(fd, false)]->events = ev & (UV_READABLE | UV_WRITABLE);
}
void change_type(SOCKET fd, int type)
{
#ifndef NETPOLL_H_
#define NETPOLL_H_
#include "netsock.h"
+#include <uv.h>
namespace netpoll {
struct net_pollfd {
void *assoc;
void begin(void);
int get(struct net_pollfd *out);
}
-#define NETPOLL_IN 1
-#define NETPOLL_OUT 2
#define SOCKTYPE_LISTENER 0
#define SOCKTYPE_SELFPIPE 1