Skip to content

Commit

Permalink
Removed indirection in nif resource
Browse files Browse the repository at this point in the history
  • Loading branch information
ian-plosker committed Feb 14, 2012
1 parent faf7989 commit b22414b
Showing 1 changed file with 14 additions and 20 deletions.
34 changes: 14 additions & 20 deletions c_src/stm_erl.c
Expand Up @@ -20,10 +20,6 @@ typedef struct {
unsigned int size;
} stm_erl_var;

typedef struct {
stm_erl_var *var;
} stm_erl_handle;

ERL_NIF_TERM stm_erl_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
stm_init();
return enif_make_atom(env, "ok");
Expand Down Expand Up @@ -51,45 +47,43 @@ ERL_NIF_TERM stm_erl_commit(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
}

ERL_NIF_TERM stm_erl_new_var(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
stm_erl_handle* handle = (stm_erl_handle*)enif_alloc_resource(stm_erl_RESOURCE,
sizeof(stm_erl_handle));

handle->var = enif_alloc(sizeof(stm_erl_var));
stm_erl_var* var = (stm_erl_var*)enif_alloc_resource(stm_erl_RESOURCE,
sizeof(stm_erl_var));

long value;
if (enif_get_int64(env, argv[0], &value)) {

handle->var->field = enif_alloc(sizeof(int64_t));
handle->var->type = INT;
handle->var->size = sizeof(int);
var->field = enif_alloc(sizeof(int64_t));
var->type = INT;
var->size = sizeof(int);

stm_store_long(handle->var->field, value);
stm_store_long(var->field, value);
}
else
return enif_make_badarg(env);

ERL_NIF_TERM result = enif_make_resource(env, handle);
enif_release_resource(handle);
ERL_NIF_TERM result = enif_make_resource(env, var);
enif_release_resource(var);

return enif_make_tuple2(env, enif_make_atom(env, "ok"), result);
}

ERL_NIF_TERM stm_erl_load_var(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
stm_erl_handle* handle;
if (!enif_get_resource(env, argv[0], stm_erl_RESOURCE, (void**)&handle))
stm_erl_var* var;
if (!enif_get_resource(env, argv[0], stm_erl_RESOURCE, (void**)&var))
return enif_make_badarg(env);
long value = stm_load_long(handle->var->field);
long value = stm_load_long(var->field);
return enif_make_int64(env, value);
}

ERL_NIF_TERM stm_erl_store_var(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
stm_erl_handle* handle;
stm_erl_var* var;
long value;
if (!enif_get_resource(env, argv[1], stm_erl_RESOURCE, (void**)&handle) ||
if (!enif_get_resource(env, argv[1], stm_erl_RESOURCE, (void**)&var) ||
!enif_get_int64(env, argv[0], &value))
return enif_make_badarg(env);

stm_store_long(handle->var->field, value);
stm_store_long(var->field, value);

return enif_make_atom(env, "ok");
}
Expand Down

0 comments on commit b22414b

Please sign in to comment.