#include "erl_nif.h" #include #include #include static int load(ErlNifEnv* env, void** priv, ERL_NIF_TERM load_info) { return 0; } static int reload(ErlNifEnv* env, void** priv, ERL_NIF_TERM load_info) { return 0; } static int upgrade(ErlNifEnv* env, void** priv, void** old_priv, ERL_NIF_TERM load_info) { return 0; } static void unload(ErlNifEnv* env, void* priv) { return; } // Function to generate binary // Right now we are only constructing one binary and returns that. static ERL_NIF_TERM generate_binary(ErlNifEnv* env, int argc, const ERL_NIF_TERM *argv) { ErlNifPid to_pid; ErlNifBinary bin; int SIZE, i; //ErlNifEnv *env = enif_alloc_env(); enif_get_int(env, argv[0], &SIZE); fprintf(stderr, "Value of argv[0]: %d\n", SIZE); enif_get_local_pid(env, argv[1], &to_pid); // Allocate memory for the binary enif_alloc_binary(SIZE, &bin); srand( (unsigned int) time(NULL)); fprintf(stderr, "SIZE = %d\n", SIZE); // This is just random data right now. We might want to generate something more useful for(i = 0; i < SIZE; i++) { fprintf(stderr, "Iteration %d\n", i); bin.data[i] = (i % 26) + 'a'; } // Create a enviroment ErlNifEnv *tmp_env = enif_alloc_env(); // Make a NIF_TERM out of our binary ERL_NIF_TERM msg = enif_make_binary(tmp_env, &bin); // We send a message to the PID we have in the argumentlist if(enif_send(NULL, &to_pid, tmp_env, msg)) { fprintf(stderr, "Sent message"); } else { fprintf(stderr, "Could not send message"); } return enif_make_string(env, "Hello world", ERL_NIF_LATIN1); } static ERL_NIF_TERM generate_buffer(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { ErlNifTid thread; ErlNifThreadOpts *thread_opts; thread_opts = enif_thread_opts_create("thread_opts"); int size, buffers_per_batch; ErlNifPid pid; // Extract the arguments if (!enif_get_int(env, argv[0], &size)) { fprintf(stderr, "Argument 1 not an int: %d\n", size); return enif_make_badarg(env); } if (!enif_get_int(env, argv[2], &buffers_per_batch)) { fprintf(stderr, "Argument 3 not an int: %d\n", buffers_per_batch); return enif_make_badarg(env); } if (!enif_get_local_pid(env, argv[1], &pid)) { fprintf(stderr, "Argument 2 not a pid\n"); return enif_make_badarg(env); } ERL_NIF_TERM *arguments = (ERL_NIF_TERM *)malloc(sizeof(ERL_NIF_TERM)*5); arguments[0] = enif_make_int(env, size); arguments[1] = enif_make_pid(env, &pid); arguments[2] = enif_make_int(env, buffers_per_batch); enif_thread_create("data_generation", &thread, (void *)generate_binary, &arguments, NULL); return enif_make_string(env, "Hello World",ERL_NIF_LATIN1); } static ErlNifFunc mynif_funcs[] = { {"generate_binary", 3, generate_binary}, {"generate_buffer", 3, generate_buffer} }; ERL_NIF_INIT(ctr_in_fg_nif,mynif_funcs,NULL,NULL,NULL,NULL);