Return {error, enonmem} in OOM situations

This commit is contained in:
Carlos Martín Nieto
2013-05-02 11:37:35 +02:00
parent 0aa11d8532
commit ef7d2d5490
11 changed files with 56 additions and 39 deletions

View File

@@ -73,6 +73,9 @@ static int load(ErlNifEnv *env, void **priv, ERL_NIF_TERM load_info)
atoms.timesort = enif_make_atom(env, "sort_time");
atoms.reversesort = enif_make_atom(env, "sort_reverse");
atoms.iterover = enif_make_atom(env, "iterover");
/* Errors */
atoms.enomem = enif_make_atom(env, "enomem");
atoms.eunknown = enif_make_atom(env, "eunknown");
return 0;
}
@@ -92,24 +95,34 @@ geef_error(ErlNifEnv *env)
{
const git_error *error;
ErlNifBinary bin;
const char *message;
size_t len;
error = giterr_last();
if (error && error->message)
message = error->message;
else
message = "No message specified";
len = strlen(message);
if (!error)
return enif_make_tuple2(env, atoms.error, atoms.eunknown);
if (error->klass == GITERR_NOMEMORY)
return geef_oom(env);
if (!error->message)
return enif_make_tuple2(env, atoms.error, atoms.eunknown);
len = strlen(error->message);
if (!enif_alloc_binary(len, &bin))
return atoms.error;
return geef_oom(env);
memcpy(bin.data, message, len);
memcpy(bin.data, error->message, len);
return enif_make_tuple2(env, atoms.error, enif_make_binary(env, &bin));
}
ERL_NIF_TERM
geef_oom(ErlNifEnv *env)
{
return enif_make_tuple2(env, atoms.error, atoms.enomem);
}
static ErlNifFunc geef_funcs[] =
{
{"repository_init", 2, geef_repository_init},