facil.io

Your powerful network backend in C, with HTTP and Websocket support

View the Project on GitHub

defer - An event scheduling library in C.

defer is a simple thread pool and fork library that defaults to POSIX threads (and could be easily ported to any thread system).

It uses a combination of micro-sleep and spin-locks for load-balancing across threads, making it more performant then the conditional variable approach as well as more portable.

Unlike most thread pool libraries, defer allows for two pointers to be passed to each task, allowing greater versatility and optimizations. For example, facil.io uses this approach to perform interactions between objects without requiring any additional allocations (which is very important for large object collections).

The library is conveniently documented inside it’s defer.h file.

defer can run in a single thread mode, without using a thread pool:

#include "defer.h"
#include <stdio.h>
// an example task
void say_hi(void * arg1, void * arg2) {
  (void)arg2;
  printf("%s\n", (char * )arg1);
}

// an example usage
int main(void) {
  defer(say_hi, "Hello There!", NULL);
  printf("Running all scheduled tasks...\n");
  defer_perform();
  printf("Done.\n");
}

Or using a thread pool:

#include "defer.h"
#include <stdint.h>
#include <stdio.h>
// an example task
void say_hi(void * arg1, void * arg2) {
  printf("%s (%lu)\n", (char * )arg1, (uintptr_t)arg2);
}

// an example usage
int main(void) {
  for (uintptr_t i = 0; i < 64; i++) {
    defer(say_hi, "Hello There!", (void *)i);
  }
  printf("Starting thread pool...\n");
  pool_pt pool = defer_pool_start(8);
  printf("Signaling thread pool to finish...\n");
  defer_pool_stop(pool);
  printf("... Waiting for thread pool to finish.\n");
  defer_pool_wait(pool);
  printf("Done.\n");
}

Or even using a fork with a thread pool and waiting for a SIGINT to finish… just replace defer_pool_start with defer_perform_in_fork!