epoll,kqueue support

Adam D. Ruppe destructionator at gmail.com
Fri Oct 4 07:30:39 PDT 2013


You can call the functions with extern(C).

There's also bindings to libraries that handle both, but I've 
never used them:
http://code.dlang.org/packages/libev


Here's how to do epoll without a library:

// calling epoll directly

version(linux) {
	extern(C):

	alias int c_int;

	alias uint uint32_t;
	alias ulong uint64_t;

	union epoll_data {
		void    *ptr;
		int      fd;
		uint32_t u32;
		uint64_t u64;
	}

	struct epoll_event {
		uint32_t   events;    /* Epoll events */
		epoll_data data;      /* User data variable */
	}

	enum EPOLL_CTL_ADD = 1;
	enum EPOLL_CTL_DEL = 2;
	enum EPOLL_CTL_MOD = 3;


	import std.conv : octal;
	enum {
		EPOLL_CLOEXEC = octal!"2000000",
		EPOLL_NONBLOCK = octal!"4000"
	}

	enum EPOLL_EVENTS {
		EPOLLIN = 0x001,
		EPOLLPRI = 0x002,
		EPOLLOUT = 0x004,
		EPOLLRDNORM = 0x040,
		EPOLLRDBAND = 0x080,
		EPOLLWRNORM = 0x100,
		EPOLLWRBAND = 0x200,
		EPOLLMSG = 0x400,
		EPOLLERR = 0x008,
		EPOLLHUP = 0x010,
		EPOLLRDHUP = 0x2000,
		EPOLLONESHOT = (1 << 30),
		EPOLLET = (1 << 31)
	}

	int epoll_create1(int flags);
	int epoll_ctl(int epfd, int op, int fd, epoll_event* event);
	int epoll_wait(int epfd, epoll_event* events, int maxevents, int 
timeout);

	import core.sys.posix.sys.time;
}



Then you use epoll_create(), etc., just like you would in C. 
kqueue would be similar, though I've never done that in D.


More information about the Digitalmars-d mailing list