Shachar Shemesh





Permalink Reply

Hello everybody, I am very happy to announce that Mecca version 0.0.1 (sorry, no more zeros than that) is now officially available. You can get the source code at https:// github.com/ weka-io/mecca . The API documentation is at https:// weka-io. github.com/ mecca/docs . Mecca is a run-time support library for fibers management, as well as a few useful containers and libraries. At this point in time, a getting started tutorial is still not available. Instead, I will post this small program for an echo server. It should give you a hint what APIs to check out with the documentation, so you can expand your search: import core.sys.posix.sys.socket; import std.algorithm : move; import std.functional : toDelegate; import mecca.log; import mecca.reactor; import mecca.reactor.io.fd; import mecca.reactor.io.signals; enum EchoerPort = 31337; int main() { theReactor.setup(); reactorSignal. registe rHandler( OSSignal. SIGTERM, toDelegate(&termHandler)); reactorSignal. registe rHandler( OSSignal. SIGINT, toDelegate(&termHandler)); theReactor. spawnFiber! listener(); return theReactor.start(); } void termHandler(ref const(signalfd_siginfo) siginfo) { // Signal handler, but any non-yielding operation is safe to call from here. theReactor.stop(); } void listener() { auto listenSocket = ConnectedSocket.listen( SockAddrIPv4.any( EchoerPort ) ); listenSocket.setSockOpt( SOL_SOCKET, SO_REUSEADDR, 1 ); while( true ) { SockAddr clientAddress; auto clientSocket = listenSocket. accept( clientA ddress); // The next line's toString is the only reason we can't annotate // listener as @nogc. INFO!"Received new connection from %s"(clientAddress.toString()); theReactor. spawnFiber! echoClient( move(clientSocket) ); } } void echoClient(ConnectedSocket sock) @nogc { ssize_t dataLength; do { char[4096] buffer; dataLength = sock.read(buffer); sock.write( buffer[0. .dataLength]); } while( dataLength>0 ); }