Mark futures as cancelled
This allows callers to cancel futures without having to worry about
receiving a `ready` message if the future completes before the
cancellation is applied.
Its possible that a message for this already in the callers message
queue. In which case you can call `cancel(Future, [flush])` to remove
that message.
diff --git a/c_src/main.c b/c_src/main.c
index 7b935d8..16c3618 100644
--- a/c_src/main.c
+++ b/c_src/main.c
@@ -84,8 +84,10 @@
caller = future->pid_env;
}
- msg = T2(future->msg_env, future->msg_ref, ATOM_ready);
- enif_send(caller, &(future->pid), future->msg_env, msg);
+ if(!future->cancelled) {
+ msg = T2(future->msg_env, future->msg_ref, ATOM_ready);
+ enif_send(caller, &(future->pid), future->msg_env, msg);
+ }
// We're now done with this future which means we need
// to release our handle to it. See erlfdb_create_future
@@ -112,6 +114,7 @@
f->pid_env = env;
f->msg_env = enif_alloc_env();
f->msg_ref = enif_make_copy(f->msg_env, ref);
+ f->cancelled = false;
// This resource reference counting dance is a bit
// awkward as erlfdb_future_cb can be called both
@@ -620,6 +623,7 @@
}
future = (ErlFDBFuture*) res;
+ future->cancelled = true;
fdb_future_cancel(future->future);
return ATOM_ok;
diff --git a/c_src/resources.h b/c_src/resources.h
index 798b22f..ead7b1c 100644
--- a/c_src/resources.h
+++ b/c_src/resources.h
@@ -47,6 +47,7 @@
ErlNifEnv* pid_env;
ErlNifEnv* msg_env;
ERL_NIF_TERM msg_ref;
+ bool cancelled;
} ErlFDBFuture;