1818#include "fdb.h"
1919
2020#include "atoms.h"
21+ #include "metrics.h"
2122#include "resources.h"
2223#include "util.h"
2324
@@ -95,6 +96,8 @@ erlfdb_future_cb(FDBFuture* fdb_future, void* data)
9596
9697 enif_release_resource (future );
9798
99+ erlfdb_future_fired ();
100+
98101 return ;
99102}
100103
@@ -159,6 +162,8 @@ erlfdb_create_future(ErlNifEnv* env, FDBFuture* future, ErlFDBFutureType ftype)
159162 // thread has a reference. If its 1 then only
160163 // Erlang has a reference.
161164
165+ erlfdb_future_created ();
166+
162167 return T3 (env , ATOM_erlfdb_future , ref , ret );
163168}
164169
@@ -173,6 +178,8 @@ erlfdb_future_get_void(ErlNifEnv* env, ErlFDBFuture* f)
173178 return erlfdb_erlang_error (env , err );
174179 }
175180
181+ erlfdb_future_read ();
182+
176183 return ATOM_ok ;
177184}
178185
@@ -191,6 +198,8 @@ erlfdb_future_get_int64(ErlNifEnv* env, ErlFDBFuture* f)
191198
192199 nif_res = fdb_res ;
193200
201+ erlfdb_future_read ();
202+
194203 return enif_make_int64 (env , nif_res );
195204}
196205
@@ -212,6 +221,8 @@ erlfdb_future_get_key(ErlNifEnv* env, ErlFDBFuture* f)
212221 buf = enif_make_new_binary (env , len , & ret );
213222 memcpy (buf , key , len );
214223
224+ erlfdb_future_read ();
225+
215226 return ret ;
216227}
217228
@@ -238,6 +249,8 @@ erlfdb_future_get_value(ErlNifEnv* env, ErlFDBFuture* f)
238249 buf = enif_make_new_binary (env , len , & ret );
239250 memcpy (buf , val , len );
240251
252+ erlfdb_future_read ();
253+
241254 return ret ;
242255}
243256
@@ -266,6 +279,8 @@ erlfdb_future_get_string_array(ErlNifEnv* env, ErlFDBFuture* f)
266279 ret = enif_make_list_cell (env , bin , ret );
267280 }
268281
282+ erlfdb_future_read ();
283+
269284 return ret ;
270285}
271286
@@ -298,6 +313,8 @@ erlfdb_future_get_keyvalue_array(ErlNifEnv* env, ErlFDBFuture* f)
298313 ret = enif_make_list_cell (env , T2 (env , key , val ), ret );
299314 }
300315
316+ erlfdb_future_read ();
317+
301318 if (more ) {
302319 return T3 (env , ret , enif_make_int (env , count ), ATOM_true );
303320 } else {
@@ -2145,6 +2162,23 @@ erlfdb_error_predicate(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
21452162 }
21462163}
21472164
2165+ static ERL_NIF_TERM
2166+ erlfdb_get_metrics (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
2167+ {
2168+ ERL_NIF_TERM metrics [4 ];
2169+
2170+ ERL_NIF_TERM created = enif_make_uint64 (env , erlfdb_num_futures_created ());
2171+ ERL_NIF_TERM destroyed = enif_make_uint64 (env , erlfdb_num_futures_destroyed ());
2172+ ERL_NIF_TERM fired = enif_make_uint64 (env , erlfdb_num_futures_fired ());
2173+ ERL_NIF_TERM read = enif_make_uint64 (env , erlfdb_num_futures_read ());
2174+
2175+ metrics [0 ] = T2 (env , ATOM_futures_created , created );
2176+ metrics [1 ] = T2 (env , ATOM_futures_destroyed , destroyed );
2177+ metrics [2 ] = T2 (env , ATOM_futures_fired , fired );
2178+ metrics [3 ] = T2 (env , ATOM_futures_read , read );
2179+
2180+ return enif_make_list_from_array (env , metrics , 4 );
2181+ }
21482182
21492183#define NIF_FUNC (name , arity ) {#name, arity, name}
21502184static ErlNifFunc funcs [] =
@@ -2192,7 +2226,9 @@ static ErlNifFunc funcs[] =
21922226 NIF_FUNC (erlfdb_transaction_get_writes_allowed , 1 ),
21932227
21942228 NIF_FUNC (erlfdb_get_error , 1 ),
2195- NIF_FUNC (erlfdb_error_predicate , 2 )
2229+ NIF_FUNC (erlfdb_error_predicate , 2 ),
2230+
2231+ NIF_FUNC (erlfdb_get_metrics , 0 )
21962232};
21972233#undef NIF_FUNC
21982234
0 commit comments