aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--erts/emulator/test/nif_SUITE.erl13
-rw-r--r--erts/emulator/test/nif_SUITE_data/nif_SUITE.c27
2 files changed, 35 insertions, 5 deletions
diff --git a/erts/emulator/test/nif_SUITE.erl b/erts/emulator/test/nif_SUITE.erl
index 2401ff708c..c2429c3405 100644
--- a/erts/emulator/test/nif_SUITE.erl
+++ b/erts/emulator/test/nif_SUITE.erl
@@ -444,7 +444,7 @@ select(Config) when is_list(Config) ->
ensure_lib_loaded(Config),
Ref = make_ref(),
- {R,W} = pipe_nif(),
+ {{R, R_ptr}, {W, W_ptr}} = pipe_nif(),
ok = write_nif(W, <<"hej">>),
<<"hej">> = read_nif(R, 3),
@@ -472,6 +472,7 @@ select(Config) when is_list(Config) ->
eagain = read_nif(R, 1),
0 = select_nif(W,?ERL_NIF_SELECT_STOP,W,Ref),
timer:sleep(10),
+ {1, {W_ptr,_}} = last_fd_stop_call(),
true = is_closed_nif(W),
[] = flush(),
0 = select_nif(R,?ERL_NIF_SELECT_READ,R,Ref),
@@ -480,6 +481,7 @@ select(Config) when is_list(Config) ->
0 = select_nif(R,?ERL_NIF_SELECT_STOP,R,Ref),
timer:sleep(10),
+ {1, {R_ptr,_}} = last_fd_stop_call(),
true = is_closed_nif(R),
select_2(Config).
@@ -490,7 +492,7 @@ select_2(Config) ->
Ref1 = make_ref(),
Ref2 = make_ref(),
- {R,W} = pipe_nif(),
+ {{R, R_ptr}, {W, W_ptr}} = pipe_nif(),
%% Change ref
eagain = read_nif(R, 1),
@@ -520,9 +522,13 @@ select_2(Config) ->
[] = flush(),
0 = select_nif(R,?ERL_NIF_SELECT_STOP,R,Ref1),
- 0 = select_nif(W,?ERL_NIF_SELECT_STOP,W,Ref1),
timer:sleep(10),
+ {1, {R_ptr,_}} = last_fd_stop_call(),
true = is_closed_nif(R),
+
+ 0 = select_nif(W,?ERL_NIF_SELECT_STOP,W,Ref1),
+ timer:sleep(10),
+ {1, {W_ptr,1}} = last_fd_stop_call(),
true = is_closed_nif(W),
select_3(Config).
@@ -2397,6 +2403,7 @@ pipe_nif() -> ?nif_stub.
write_nif(_,_) -> ?nif_stub.
read_nif(_,_) -> ?nif_stub.
is_closed_nif(_) -> ?nif_stub.
+last_fd_stop_call() -> ?nif_stub.
%% maps
is_map_nif(_) -> ?nif_stub.
diff --git a/erts/emulator/test/nif_SUITE_data/nif_SUITE.c b/erts/emulator/test/nif_SUITE_data/nif_SUITE.c
index 878a9ffda9..813d19ae90 100644
--- a/erts/emulator/test/nif_SUITE_data/nif_SUITE.c
+++ b/erts/emulator/test/nif_SUITE_data/nif_SUITE.c
@@ -2087,7 +2087,9 @@ static ERL_NIF_TERM pipe_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]
enif_release_resource(read_rsrc);
enif_release_resource(write_rsrc);
- return enif_make_tuple2(env, read_fd, write_fd);
+ return enif_make_tuple2(env,
+ enif_make_tuple2(env, read_fd, make_pointer(env, read_rsrc)),
+ enif_make_tuple2(env, write_fd, make_pointer(env, write_rsrc)));
}
static ERL_NIF_TERM write_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
@@ -2176,17 +2178,37 @@ static void fd_resource_dtor(ErlNifEnv* env, void* obj)
}
}
+static struct {
+ void* obj;
+ int was_direct_call;
+}last_fd_stop;
+int fd_stop_cnt = 0;
+
static void fd_resource_stop(ErlNifEnv* env, void* obj, ErlNifEvent fd,
int is_direct_call)
{
struct fd_resource* fdr = (struct fd_resource*)obj;
assert(fd == fdr->fd);
assert(fd >= 0);
+
+ last_fd_stop.obj = obj;
+ last_fd_stop.was_direct_call = is_direct_call;
+ fd_stop_cnt++;
+
close(fd);
fdr->fd = -1; /* thread safety ? */
fdr->was_selected = 0;
}
+static ERL_NIF_TERM last_fd_stop_call(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+ ERL_NIF_TERM last, ret;
+ last = enif_make_tuple2(env, make_pointer(env, last_fd_stop.obj),
+ enif_make_int(env, last_fd_stop.was_direct_call));
+ ret = enif_make_tuple2(env, enif_make_int(env, fd_stop_cnt), last);
+ fd_stop_cnt = 0;
+ return ret;
+}
static ErlNifFunc nif_funcs[] =
@@ -2270,7 +2292,8 @@ static ErlNifFunc nif_funcs[] =
{"pipe_nif", 0, pipe_nif},
{"write_nif", 2, write_nif},
{"read_nif", 2, read_nif},
- {"is_closed_nif", 1, is_closed_nif}
+ {"is_closed_nif", 1, is_closed_nif},
+ {"last_fd_stop_call", 0, last_fd_stop_call}
};
ERL_NIF_INIT(nif_SUITE,nif_funcs,load,NULL,upgrade,unload)