Async Object Derive
This library provides set of procedural macros to make convenient reference-counting wrappers for using objects in asynchronous environment.
Example
This code makes wrappers Background and WBackground for BackgroundImpl object. Internally they are just Arc<Rwlock> and Weak<Rwlock> plus tooling for access the Rwlock without blocking asyncronous job.
The structures Background and WBackground will have these automatically generated proxy methods:
Note Option return type for weak wrapper WBackground. If all instance of Background are destroyed, the BackgroundImpl is dropped too. Remaining WBackground instances starts to return None for all method calls.
The difference between normal and async proxy methods is in their way to mutex access. The synchronous methods are just waiting for mutex unlock. The async methods tries to access the mutex and if it's locked puts asynchronous task to sleep until mutex is released, allowing other tasks to continue on this worker.
There is also event pub/sub support. For example:
Below is the code which changes background color when button is pressed
let pool = builder.create.unwrap;
let button = new;
let background = new;
pool.spawn;
It's important to emphasize the role of Event wrapper (note that in code above stream provides Event instances) and asyncness of send_event method. The future returned by send_event is allowed to continue only when all subscribers got their instances of Event and these instances are dropped. This allows to pause before sending next event until the moment when previous event is fully processed by subscribers. If user is not interested in result of sending the event the returned future may just be dropped as in 'press' method above. Event itself will be sent anyway.