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