packages feed

foreign-0.1.0.0: test/cbits/ffi.c

#include <HsFFI.h>
#include <Rts.h>

#include <pthread.h>

HsInt sum_first_unsafe(StgArrBytes** bufs, HsInt len) {
  HsInt res = 0;
  for (HsInt ix = 0; ix < len; ix++) {
    res = res + ((HsInt*)(bufs[ix]->payload))[0];
  }
  return res;
}

HsInt sum_first_safe(HsInt** bufs, HsInt len) {
  HsInt res = 0;
  for (HsInt ix = 0; ix < len; ix++) {
    res = res + bufs[ix][0];
  }
  return res;
}

typedef struct sum_first_callback_args {
  HsInt** bufs;
  HsInt len;
  HsStablePtr mvar;
  HsInt cap;
  HsInt* value_out;
} sum_first_callback_args;

void* sum_first_callback(void* args_) {
  sum_first_callback_args* args = (sum_first_callback_args*)args_;

  HsInt res = 0;
  for (HsInt ix = 0; ix < args->len; ix++) {
    res = res + args->bufs[ix][0];
  }
  *(args->value_out) = res;
  hs_try_putmvar(args->cap, args->mvar);
}

void async_sum_first(HsInt** bufs, HsInt len, HsStablePtr mvar, HsInt cap,
                     HsInt* value_out) {
  sum_first_callback_args* args = malloc(sizeof(sum_first_callback_args));
  args->bufs = bufs;
  args->len = len;
  args->mvar = mvar;
  args->cap = cap;
  args->value_out = value_out;

  pthread_t p;
  pthread_create(&p, NULL, sum_first_callback, (void*)args);
}