1
1
#include "main.h"
2
2
#include "utils.h"
3
+ #include <stdbool.h>
3
4
#include <erl_nif.h>
4
5
5
6
#define ERL_FUNCTION (FUNCTION_NAME ) static ERL_NIF_TERM FUNCTION_NAME(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
31
32
#FUNCTION_NAME, ARITY, FUNCTION_NAME \
32
33
}
33
34
34
- const uint64_t PID_LENGTH = 1024 ;
35
35
const uint64_t BUFFER_SIZE = 4096 ;
36
36
37
37
/*************/
@@ -46,22 +46,24 @@ ErlNifResourceType *Multiaddr_arr;
46
46
ErlNifResourceType * Stream ;
47
47
48
48
// Resource type helpers
49
- void handle_cleanup (ErlNifEnv * env , void * arg )
49
+ void handle_cleanup (ErlNifEnv * env , void * obj )
50
50
{
51
- uintptr_t handle = ( uintptr_t ) arg ;
52
- DeleteHandle (handle );
51
+ uintptr_t * handle = obj ;
52
+ DeleteHandle (* handle );
53
53
}
54
54
55
+ #define OPEN_RESOURCE_TYPE (NAME ) ((NAME) = enif_open_resource_type(env, NULL, (#NAME), handle_cleanup, flags, NULL))
56
+
55
57
static int open_resource_types (ErlNifEnv * env , ErlNifResourceFlags flags )
56
58
{
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 ;
59
+ int failed = false ;
60
+ failed | = NULL == OPEN_RESOURCE_TYPE (Option );
61
+ failed | = NULL == OPEN_RESOURCE_TYPE (Host );
62
+ failed | = NULL == OPEN_RESOURCE_TYPE (Peerstore );
63
+ failed | = NULL == OPEN_RESOURCE_TYPE (peer_ID );
64
+ failed | = NULL == OPEN_RESOURCE_TYPE (Multiaddr_arr );
65
+ failed | = NULL == OPEN_RESOURCE_TYPE (Stream );
66
+ return failed ;
65
67
}
66
68
67
69
static int load (ErlNifEnv * env , void * * priv_data , ERL_NIF_TERM load_info )
@@ -111,6 +113,8 @@ static ERL_NIF_TERM get_handle_result(ErlNifEnv *env, ErlNifResourceType *type,
111
113
IF_ERROR (obj == NULL , "couldn't create resource" );
112
114
* obj = handle ;
113
115
ERL_NIF_TERM term = enif_make_resource (env , obj );
116
+ // NOTE: we need to release our reference, so it can be GC'd
117
+ enif_release_resource (obj );
114
118
return make_ok_tuple2 (env , term );
115
119
}
116
120
0 commit comments