static void client_free (Client *client) { delete (peer); close (client->fd); main_context_free (client->context); connection_destroy (client->connection); g_free (client); } static void on_connection_event (connection) { Client *client = lac_connection_get_data (client); switch (event) { case READ: read_the_stuff(); process_it(); break; case ERROR: connection_close(); break; case CLOSED: client_free (); break; } process_stuff (); connection_write_stuff (); } static void on_connection (LacListener *listener, int fd, LacAddress *peer, gpointer data) { Server *server = lac_listener_get_data (listener); Client *client = g_new (Client, 1); client->peer = peer; client->fd = fd; client->context = context_new (server->executor, server->poll, client); client->connection = connection_new (fd, on_connection_event); } Server * server_new (int port) { server->poll = epll_new(); server->executor = executor_new (); server->port = port; create_listener (port, on_connection, server); return server; }