Announcing Mecca

Shachar Shemesh shachar at weka.io
Fri May 4 05:23:51 UTC 2018


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.registerHandler(OSSignal.SIGTERM, 
toDelegate(&termHandler));
     reactorSignal.registerHandler(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(clientAddress);

         // 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 );
}


More information about the Digitalmars-d-announce mailing list