Skip to content

Commit 46c7e87

Browse files
committed
Add resources for each type
1 parent 945848f commit 46c7e87

File tree

2 files changed

+68
-57
lines changed

2 files changed

+68
-57
lines changed

native/libp2p_nif/libp2p.c

Lines changed: 62 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44

55
#define ERL_FUNCTION(FUNCTION_NAME) static ERL_NIF_TERM FUNCTION_NAME(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
66

7-
#define ERL_FUNCTION_GETTER(NAME, GETTER) \
8-
ERL_FUNCTION(NAME) \
9-
{ \
10-
uintptr_t _handle = get_handle_from_term(env, argv[0]); \
11-
IF_ERROR(_handle == 0, "invalid first argument"); \
12-
uintptr_t _res = GETTER(_handle); \
13-
return get_handle_result(env, _res); \
7+
#define ERL_FUNCTION_GETTER(NAME, RECV_TYPE, ATTR_TYPE, GETTER) \
8+
ERL_FUNCTION(NAME) \
9+
{ \
10+
uintptr_t _handle = get_handle_from_term(env, RECV_TYPE, argv[0]); \
11+
IF_ERROR(_handle == 0, "invalid first argument"); \
12+
uintptr_t _res = GETTER(_handle); \
13+
return get_handle_result(env, ATTR_TYPE, _res); \
1414
}
1515

1616
#define IF_ERROR(COND, MSG) \
@@ -19,11 +19,11 @@
1919
return make_error_msg(env, (MSG)); \
2020
}
2121

22-
#define GET_HANDLE(TERM, NAME) \
23-
({ \
24-
uintptr_t _handle = get_handle_from_term(env, (TERM)); \
25-
IF_ERROR(_handle == 0, "invalid " NAME); \
26-
_handle; \
22+
#define GET_HANDLE(TERM, TYPE) \
23+
({ \
24+
uintptr_t _handle = get_handle_from_term(env, (TYPE), (TERM)); \
25+
IF_ERROR(_handle == 0, "invalid " #TYPE); \
26+
_handle; \
2727
})
2828

2929
#define NIF_ENTRY(FUNCTION_NAME, ARITY) \
@@ -38,38 +38,52 @@ const uint64_t BUFFER_SIZE = 4096;
3838
/* NIF Setup */
3939
/*************/
4040

41-
ErlNifResourceType *Option_type;
41+
ErlNifResourceType *Option;
42+
ErlNifResourceType *Host;
43+
ErlNifResourceType *Peerstore;
44+
ErlNifResourceType *peer_ID;
45+
ErlNifResourceType *Multiaddr_arr;
46+
ErlNifResourceType *Stream;
4247

4348
// Resource type helpers
44-
void Option_type_cleanup(ErlNifEnv *env, void *arg)
49+
void handle_cleanup(ErlNifEnv *env, void *arg)
4550
{
4651
uintptr_t handle = (uintptr_t)arg;
4752
DeleteHandle(handle);
4853
}
4954

55+
static int open_resource_types(ErlNifEnv *env, ErlNifResourceFlags flags)
56+
{
57+
int ok = 0;
58+
ok &= NULL == (Option = enif_open_resource_type(env, NULL, "Option_type", handle_cleanup, flags, NULL));
59+
ok &= NULL == (Host = enif_open_resource_type(env, NULL, "Host_type", handle_cleanup, flags, NULL));
60+
ok &= NULL == (Peerstore = enif_open_resource_type(env, NULL, "Peerstore_type", handle_cleanup, flags, NULL));
61+
ok &= NULL == (peer_ID = enif_open_resource_type(env, NULL, "peer_ID_type", handle_cleanup, flags, NULL));
62+
ok &= NULL == (Multiaddr_arr = enif_open_resource_type(env, NULL, "Multiaddr_arr_type", handle_cleanup, flags, NULL));
63+
ok &= NULL == (Stream = enif_open_resource_type(env, NULL, "Stream_type", handle_cleanup, flags, NULL));
64+
return ok ? 1 : 0;
65+
}
66+
5067
static int load(ErlNifEnv *env, void **priv_data, ERL_NIF_TERM load_info)
5168
{
52-
ErlNifResourceFlags flags = ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER;
53-
Option_type = enif_open_resource_type(env, NULL, "Option_type", Option_type_cleanup, flags, NULL);
54-
return Option_type == NULL ? 1 : 0;
69+
return open_resource_types(env, ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER);
5570
}
5671

5772
static int upgrade(ErlNifEnv *env, void **priv_data, void **old_priv_data,
5873
ERL_NIF_TERM load_info)
5974
{
60-
ErlNifResourceFlags flags = ERL_NIF_RT_TAKEOVER;
61-
Option_type = enif_open_resource_type(env, NULL, "Option_type", Option_type_cleanup, flags, NULL);
62-
return Option_type == NULL ? 1 : 0;
75+
return open_resource_types(env, ERL_NIF_RT_TAKEOVER);
6376
}
6477

6578
/***********/
6679
/* Helpers */
6780
/***********/
6881

69-
static uintptr_t get_handle_from_term(ErlNifEnv *env, ERL_NIF_TERM term)
82+
static uintptr_t get_handle_from_term(ErlNifEnv *env, ErlNifResourceType *type, ERL_NIF_TERM term)
7083
{
71-
uintptr_t handle;
72-
return enif_get_uint64(env, term, &handle) ? handle : 0;
84+
uintptr_t *obj;
85+
int result = enif_get_resource(env, term, type, (void **)&obj);
86+
return (!result || obj == NULL) ? 0 : *obj;
7387
}
7488

7589
static ERL_NIF_TERM _make_error_msg(ErlNifEnv *env, uint len, const char *msg)
@@ -90,10 +104,14 @@ static ERL_NIF_TERM make_ok_tuple2(ErlNifEnv *env, ERL_NIF_TERM term)
90104
return enif_make_tuple2(env, enif_make_atom(env, "ok"), term);
91105
}
92106

93-
static ERL_NIF_TERM get_handle_result(ErlNifEnv *env, uintptr_t handle)
107+
static ERL_NIF_TERM get_handle_result(ErlNifEnv *env, ErlNifResourceType *type, uintptr_t handle)
94108
{
95109
IF_ERROR(handle == 0, "invalid handle returned");
96-
return make_ok_tuple2(env, enif_make_uint64(env, handle));
110+
uintptr_t *obj = enif_alloc_resource(type, sizeof(uintptr_t));
111+
IF_ERROR(obj == NULL, "couldn't create resource");
112+
*obj = handle;
113+
ERL_NIF_TERM term = enif_make_resource(env, obj);
114+
return make_ok_tuple2(env, term);
97115
}
98116

99117
/*********/
@@ -108,12 +126,7 @@ ERL_FUNCTION(listen_addr_strings)
108126

109127
uintptr_t handle = ListenAddrStrings(listen_addr);
110128

111-
IF_ERROR(handle == 0, "invalid handle returned");
112-
uintptr_t *obj = enif_alloc_resource(Option_type, sizeof(uintptr_t));
113-
IF_ERROR(obj == NULL, "couldn't create resource");
114-
*obj = handle;
115-
ERL_NIF_TERM term = enif_make_resource(env, obj);
116-
return make_ok_tuple2(env, term);
129+
return get_handle_result(env, Option, handle);
117130
}
118131

119132
/****************/
@@ -130,26 +143,24 @@ ERL_FUNCTION(host_new)
130143
while (!enif_is_empty_list(env, tail) && i < MAX_OPTIONS)
131144
{
132145
enif_get_list_cell(env, tail, &head, &tail);
133-
uintptr_t *obj;
134-
enif_get_resource(env, head, Option_type, (void **)&obj);
135-
IF_ERROR(obj == NULL, "invalid option");
136-
options[i++] = *obj;
146+
uintptr_t handle = GET_HANDLE(head, Option);
147+
options[i++] = handle;
137148
}
138149
GoSlice go_options = {options, i, MAX_OPTIONS};
139150
uintptr_t result = HostNew(go_options);
140-
return get_handle_result(env, result);
151+
return get_handle_result(env, Host, result);
141152
}
142153

143154
ERL_FUNCTION(host_close)
144155
{
145-
uintptr_t host = GET_HANDLE(argv[0], "host");
156+
uintptr_t host = GET_HANDLE(argv[0], Host);
146157
HostClose(host);
147158
return enif_make_atom(env, "ok");
148159
}
149160

150161
ERL_FUNCTION(host_set_stream_handler)
151162
{
152-
uintptr_t host = GET_HANDLE(argv[0], "host");
163+
uintptr_t host = GET_HANDLE(argv[0], Host);
153164

154165
ErlNifBinary bin;
155166
IF_ERROR(!enif_inspect_binary(env, argv[1], &bin), "invalid protocol ID");
@@ -167,30 +178,30 @@ ERL_FUNCTION(host_set_stream_handler)
167178

168179
ERL_FUNCTION(host_new_stream)
169180
{
170-
uintptr_t host = GET_HANDLE(argv[0], "host");
171-
uintptr_t id = GET_HANDLE(argv[1], "peer id");
181+
uintptr_t host = GET_HANDLE(argv[0], Host);
182+
uintptr_t id = GET_HANDLE(argv[1], peer_ID);
172183

173184
ErlNifBinary bin;
174185
IF_ERROR(!enif_inspect_binary(env, argv[2], &bin), "invalid protocol ID");
175186
GoString proto_id = {(const char *)bin.data, bin.size};
176187

177-
int result = NewStream(host, id, proto_id);
178-
return get_handle_result(env, result);
188+
uintptr_t result = NewStream(host, id, proto_id);
189+
return get_handle_result(env, Stream, result);
179190
}
180191

181-
ERL_FUNCTION_GETTER(host_peerstore, Peerstore)
182-
ERL_FUNCTION_GETTER(host_id, ID)
183-
ERL_FUNCTION_GETTER(host_addrs, Addrs)
192+
ERL_FUNCTION_GETTER(host_peerstore, Host, Peerstore, HostPeerstore)
193+
ERL_FUNCTION_GETTER(host_id, Host, peer_ID, HostID)
194+
ERL_FUNCTION_GETTER(host_addrs, Host, Multiaddr_arr, HostAddrs)
184195

185196
/*********************/
186197
/* Peerstore methods */
187198
/*********************/
188199

189200
ERL_FUNCTION(peerstore_add_addrs)
190201
{
191-
uintptr_t ps = GET_HANDLE(argv[0], "peerstore");
192-
uintptr_t id = GET_HANDLE(argv[1], "peer id");
193-
uintptr_t addrs = GET_HANDLE(argv[2], "addrs");
202+
uintptr_t ps = GET_HANDLE(argv[0], Peerstore);
203+
uintptr_t id = GET_HANDLE(argv[1], peer_ID);
204+
uintptr_t addrs = GET_HANDLE(argv[2], Multiaddr_arr);
194205
u_long ttl;
195206
IF_ERROR(!enif_get_uint64(env, argv[3], &ttl), "invalid TTL");
196207

@@ -204,7 +215,7 @@ ERL_FUNCTION(peerstore_add_addrs)
204215

205216
ERL_FUNCTION(stream_read)
206217
{
207-
uintptr_t stream = GET_HANDLE(argv[0], "stream");
218+
uintptr_t stream = GET_HANDLE(argv[0], Stream);
208219

209220
char buffer[BUFFER_SIZE];
210221
GoSlice go_buffer = {buffer, BUFFER_SIZE, BUFFER_SIZE};
@@ -221,7 +232,7 @@ ERL_FUNCTION(stream_read)
221232

222233
ERL_FUNCTION(stream_write)
223234
{
224-
uintptr_t stream = GET_HANDLE(argv[0], "stream");
235+
uintptr_t stream = GET_HANDLE(argv[0], Stream);
225236

226237
ErlNifBinary bin;
227238
IF_ERROR(!enif_inspect_binary(env, argv[1], &bin), "invalid data");
@@ -235,7 +246,7 @@ ERL_FUNCTION(stream_write)
235246

236247
ERL_FUNCTION(stream_close)
237248
{
238-
uintptr_t stream = GET_HANDLE(argv[0], "stream");
249+
uintptr_t stream = GET_HANDLE(argv[0], Stream);
239250
StreamClose(stream);
240251
return enif_make_atom(env, "ok");
241252
}

native/libp2p_nif/main.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,18 +110,18 @@ func (h C.uintptr_t) NewStream(pid C.uintptr_t, protoId string) C.uintptr_t {
110110
return C.uintptr_t(cgo.NewHandle(stream))
111111
}
112112

113-
//export Peerstore
114-
func (h C.uintptr_t) Peerstore() C.uintptr_t {
113+
//export HostPeerstore
114+
func (h C.uintptr_t) HostPeerstore() C.uintptr_t {
115115
return callGetter(h, host.Host.Peerstore)
116116
}
117117

118-
//export ID
119-
func (h C.uintptr_t) ID() C.uintptr_t {
118+
//export HostID
119+
func (h C.uintptr_t) HostID() C.uintptr_t {
120120
return callGetter(h, host.Host.ID)
121121
}
122122

123-
//export Addrs
124-
func (h C.uintptr_t) Addrs() C.uintptr_t {
123+
//export HostAddrs
124+
func (h C.uintptr_t) HostAddrs() C.uintptr_t {
125125
return callGetter(h, host.Host.Addrs)
126126
}
127127

0 commit comments

Comments
 (0)