I really like the promise-based RPC capabilities provided by capnproto, and 
am working to integrate them into an event-driven application that was 
previously using libev.

Luckily, the application was already using libev-agnostic callback wrapper 
classes for various event types, making it very easy to throw out libev 
code and to replace it with kj. For example, here is the existing interface 
of a periodic callback:

// Callback type called periodically.
class EventSystem::PeriodicCallback {
public:
 // Construct a callback to function with the specified period.
 template <typename T_Func>
 PeriodicCallback(double seconds, T_Func &&function);
 ~PeriodicCallback();
 
 // Change the period of the callback.
 void setPeriod(double seconds);
 
 // Enable or disable the callback.
 void enable();
 void disable();
 
private:
 // Allocate and initialize the implementation structure.
 void _initialize();
 
private:
 std::function<void()> _function;
 void *_impl;
};

I have however run into a problem regarding callbacks rescheduling 
themselves, and would like to know what the "recommended" solution is. The 
kj implementation struct for the periodic callback currently looks like so:

struct PeriodicCallbackImpl {
 PeriodicCallbackImpl();
 
 kj::Promise<void> promise;
 kj::Duration period;
};

Since a promise can only execute once (please correct me if I'm wrong), the 
callback has to reschedule the promise within itself. However, the new 
promise has to be stored somewhere, and the only place to store it is 
within the implementation struct. This however destroys the original 
promise, which is still executing, resulting in an exception: expected 
!firing; Promise callback destroyed itself.

I've come up with two methods that work, but don't quite feel right:
1) Add a second promise to the implementation struct, and move the 
executing promise there (requires another promise that is only used 
transiently).
2) Call detach on the executing promise (is this legal within the callback 
itself? What is the error handler for in this case?).

What is the recommended method for rescheduling a promise during its own 
callback execution?

-- 
You received this message because you are subscribed to the Google Groups 
"Cap'n Proto" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
Visit this group at https://groups.google.com/group/capnproto.

Reply via email to