Comments (6)
Options:
- What the current
send
branch does. This is sound, and it supports bothenif_send
use cases ("calling process" and "created thread"), but it incurs measurable overhead on every NIF call. - We can add a bool to
NifEnv
telling whether or not it's the "environment of the calling process". The bit would be true for envs created byhandle_nif_call
and false for envs created byOwnedEnv::run
etc. This would impose some overhead, not on every NIF call, but on everything you do with aNifEnv
(no guess whether this is better or worse than option 1). Plus this is a half solution. It works only for "calling process" cases, i.e. when the bit is set. If it's not set, we might be either in a "calling process" or a "created thread" situation, and we have no way of knowing which. - We can create a different thread-local variable, a bool that is set true by
ThreadSpawner::spawn()
to mark "created" threads. This too is a half solution, but the other half: if we're in a calling process, we know it's safe to callenif_send(null, ...)
. If not, we don't know ifenv
is the correct environment to pass toenif_send
or not. - We could do both option 2 and option 3.
- We can mark
NifEnv::send()
andtrait JobSpawner
asunsafe
. - We can add some kind of flag that you have to set in your
rustler_export_nifs
if you want to useenv.send()
, so you only pay the overhead if you're actually planning to send messages. If you don't set the flag, the thread-local variable will beNone
and.send()
, seeing this, can just panic.
from rustler.
Looks like another option would be to use enif_thread_type
from rustler.
Thanks for posing this in the erlang-questions lists. enif_send
is the only safety hole that I haven't solved yet. If you learn anything new, please do record it here for posterity.
Maybe once the dust has settled on OTP-20 (and they are juggling quite a bit in the NIF code) we can see if there are any changes/additions on the Erlang side that will allow safe enif_send
.
from rustler.
An alternative to option 6 would be to use cargo conditional compilation. If the user wants to use send, they add the send
feature to the Cargo.toml
, and the code for the feature only gets compiled in if the user explicitly enables the feature. This would completely remove all runtime cost when the feature is disabled, and possibly make the implementation simpler.
from rustler.
Right -- I forgot about that. I'll do that.
from rustler.
@scrogson Nice find! enif_thread_type
first appeared in OTP-19 and is provided by erlang_nif-sys = ">=0.5.3"
.
from rustler.
Related Issues (20)
- `nif` macro fails with macro arguments HOT 2
- New Binary from Vec or Slice
- Support for enif_monitor_process HOT 1
- resource with lifetime
- Expose `enif_is_process_alive` HOT 4
- rustler errors on OTP26 HOT 1
- How to conveniently work with binaries as vectors of bytes?
- Why does Term::map_from_pairs return a NifResult?
- Support for fully custom `:load_from` for escripts HOT 8
- This OTP release uses the unsupported Erlang NIF version "2.17" HOT 1
- Test NifStruct derived traits
- Running `dialiyzer` with `rustler` 0.30.0 results in "The pattern can never match the type"" HOT 4
- Import structs from a library
- Can't `mix compile` with path dependency in `Cargo.toml` HOT 2
- Obscure error messages HOT 3
- Would you mind to release `rustler-0.30.1` which includes #570 ? HOT 1
- [Feature request] Add support for i128 and u128 HOT 6
- Unsupported Erlang version error with OTP 26 and features = nif_version_2_17 in Cargo.toml HOT 3
- [Feature request] Support for serializing Path/PathBuf HOT 2
- Transparently decode mixed lists of floats/integers into `f64`
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from rustler.