Comments (4)
I forgot to mention. Sometimes you have to explicitly set structs to be not Send
or Sync
if they are not threadsafe. Especially when working with C code it's good to think about this for every structure.
from runng.
This one is trickier.
I've been using #derive[]
sparingly on an "as-needed" basis. For example, NngError
has Clone/Copy/Debug/PartialEq.
Most of the other structs are wrappers around C FFI bindings and not safe for Copy/Clone. Pretty much all of them have a function that needs to be called on Drop
(nng_msg_free
, nng_close
, etc.). As much as possible I'd like to use Rust to enforce "correct" usage, but I haven't really settled on the best way to deal with this:
- Sockets currently use an
Arc
(code) - Stats does it with lifetimes (code)
- Pair1 is Clone because "polyamorous" mode enables multiple connections over a socket (code)
For example, once you've called create_async_context() I don't think it's safe to use the socket (because nng_aio will be using it), so the socket should probably get "consumed" (i.e. create_async_context(self)
instead of create_async_context(&self)
). But I need to ask the nng author to be sure.
Pipes complicate this because they can be obtained from a message, but closing them will make the associated nng_ctx/nng_aio fail...
But I think you're right that there could be some improvements:
- I added
impl Clone for NngMsg
(which just callsnng_msg_dup
) - I think
Debug
is safe everywhere so I'll look at sprinkling it around
from runng.
Thanks for looking into this. This makes me wonder, in async code it is common to use closures and thus often one needs to "clone" things. In the little test app I posted, I thus end up cloning a protocol::pair1::Pair1
even though it's not in polyamorous mode. Is that a problem?
from runng.
It's ok to clone it, it won't get closed until the last reference goes away. The Arc
provides Send/Sync.
At the moment there's only impl Send for NngAio
because I tend to write:
let a = factory.pair_open()?.listen(&url)?;
let b = factory.pair_open()?.dial(&url)?;
let a_thread = thread::spawn(move || -> NngReturn {
let mut ctx = a.create_async_context()?;
//...
});
I don't plan to use the synchronous functions like SendMsg::send()
so I've not thought about that part of the API much. If you do plan to use that part, feel free to make suggestions or a PR. Come to think of it, I'm not even sure its got tests.
from runng.
Related Issues (20)
- NngMsg API takes raw pointers... HOT 3
- NngFail is not compatible with failure::Error HOT 2
- How do I close a connection? HOT 3
- Agree on a crate for linking to libnng HOT 17
- Aio context pointers should be pinned
- Implement survey: surveyor and respondent protocols
- Implement bus protocol
- Subscribe protocol context support
- Implement stream API
- Implement `nng_iov` for vectored I/O
- Add support for IoVec to iov HOT 1
- Wrap `nng_url`
- Switch to `std::future`
- Investigate switching to custom Future
- reqrep_tests::nonblock occasionally fails
- Canceling an async receive drops messages HOT 2
- Question on runng vs nng-rs HOT 2
- Long running Aio HOT 2
- stream ReadAsync / WriteAsync HOT 2
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 runng.