Packages
vix
0.2.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.1
0.33.0
0.32.0
0.31.1
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.1
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.1
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.1
0.10.0
0.9.0
0.8.0
0.7.0
0.6.1
0.6.0
0.5.0
0.4.0
0.3.0
0.2.1
0.2.0
retired
0.1.0
NIF based bindings for libvips
Retired package: Release invalid - Incorrect package files, please use v0.2.1+
Current section
Files
Jump to
Current section
Files
c_src/g_object/g_object.c
#include <glib-object.h>
#include "../utils.h"
#include "g_object.h"
ErlNifResourceType *G_OBJECT_RT;
// Ownership is traferred to beam resource, `obj` must *not* be freed
// by the caller
ERL_NIF_TERM g_object_to_erl_term(ErlNifEnv *env, GObject *obj) {
ERL_NIF_TERM term;
GObjectResource *gobject_r;
gobject_r = enif_alloc_resource(G_OBJECT_RT, sizeof(GObjectResource));
gobject_r->obj = obj;
term = enif_make_resource(env, gobject_r);
enif_release_resource(gobject_r);
return term;
}
ERL_NIF_TERM nif_g_object_type_name(ErlNifEnv *env, int argc,
const ERL_NIF_TERM argv[]) {
assert_argc(argc, 1);
GObject *obj;
if (!erl_term_to_g_object(env, argv[0], &obj))
return make_error(env, "Failed to get GObject");
return enif_make_string(env, G_OBJECT_TYPE_NAME(obj), ERL_NIF_LATIN1);
}
bool erl_term_to_g_object(ErlNifEnv *env, ERL_NIF_TERM term, GObject **obj) {
GObjectResource *gobject_r = NULL;
if (enif_get_resource(env, term, G_OBJECT_RT, (void **)&gobject_r)) {
(*obj) = gobject_r->obj;
return true;
}
return false;
}
static void g_object_dtor(ErlNifEnv *env, void *ptr) {
GObjectResource *gobject_r = (GObjectResource *)ptr;
g_object_unref(gobject_r->obj);
debug("GObjectResource dtor");
}
int nif_g_object_init(ErlNifEnv *env) {
G_OBJECT_RT = enif_open_resource_type(
env, NULL, "g_object_resource", (ErlNifResourceDtor *)g_object_dtor,
ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER, NULL);
if (!G_OBJECT_RT) {
error("Failed to open gobject_resource");
return 1;
}
return 0;
}