Requirements: ---------------------------------------------------------------------- * Linux 2.6.x * GHC 6.5 * libaio --- the Linux Asynchonrous I/O Library. * libipq --- the iptables development library (iptables-dev in Debian) If you wish to try the web server, make sure that the HTML files are on one of these file systems: ext2, ext3, jfs, xfs. Otherwise, AIO may not work. Files and directories: ---------------------------------------------------------------------- IOLib/ : Low-level asynchronous I/O library Chunk.hs : A type-safe representation of memory buffers AIO.hs : FFI wrappers for the Linux AIO library Epoll.hs : FFI wrappers for the Linux epoll interface NBIO.hs : FFI wrappers for some non-blocking socket primitives PacketIO.hs : FFI wrappers for sending/receiving IP packets. TCP.hs : A proof-of-concept, purely functional TCP stack. ThreadLib/ : The application-level thread library Thread.hs : CPS Monad and system calls. Workers.hs : Some standard and reusable event loops for constructing application-level schedulers. A default scheduler implementation is also provided. FileIO.hs : Synchronous disk library, implemented using Linux AIO SockIO.hs : Synchronous socket library, implemented using standard non-blocking sockets with epoll. TCPSockIO.hs : Synchronous socket library, implemented using the user-level, customized TCP stack. Mutex.hs : A simple mutex library. WebClient/ : An HTTP load generator application WebServer/ : A web server application. It can be linked with either SockIO or TCPSockIO. Compile and run: ---------------------------------------------------------------------- First, make sure that libaio is installed on your system and you are using a development snapshot GHC 6.5. Then, run the shell script "rebuild.sh" to compile all the sources. This should create three executable files: WebServer/Server.bin WebServer/Server_tcp.bin WebClient/LoadGen.bin Run them. They are self-documented. To use Server_tcp.bin, you should first run "make setup" in the WebServer/ directory to setup iptables. Read the Makefile for more information. Programming with threads ---------------------------------------------------------------------- Just use Server.hs and LoadGen.hs as templates to start. Programming with events ---------------------------------------------------------------------- The scheduler is part of your application. You can use some standard event loops predefined in Workers.hs, or you can write your own. FAQ: ---------------------------------------------------------------------- Q: How to use another event source like *poll/*IO/kqueue/whatever? A: First, wrap up the C function calls using FFI. AIO.hs and mod_aio.c is a good demo to start with. Then, add system calls and write your own event loops :-) Q: How to add system calls? A: The current setup is not quite modular yet---you will have to add a line in Thread.hs for each system call you would like to add. In the future, it is possible to make the Trace interface user-pluggable by adding an extra level of indirection. Q: How to write my own event loops? A: As a demo, LoadGen.hs has a customized event loop. It does not do anything fancy, though. Q: How is the TCP stack? A: The current implementation is purely functional and it is quite slow. It is roughly 3x-8x slower than the linux kernel TCP stack. It only implemented server sockets---active TCP connections are not implemented yet.