Browse Source

ENGINE-133 timeout in retrieve_next_sync_msg - half baked, not wrapped

PYADPT-55
Edouard Tisserant 9 years ago
parent
commit
c0cdf33234
  1. 35
      src/sync_mixin.cc
  2. 13
      src/sync_mixin.hh

35
src/sync_mixin.cc

@ -61,34 +61,58 @@ namespace pEp {
#ifndef NDEBUG #ifndef NDEBUG
void SyncMixIn::_inject(int event, Identity partner, object extra) void SyncMixIn::_inject(int event, Identity partner, object extra)
{ {
time_t timeout = 0;
PEP_STATUS status = fsm_DeviceState_inject(session, PEP_STATUS status = fsm_DeviceState_inject(session,
(DeviceState_event) event, partner, NULL); (DeviceState_event) event, partner, NULL, &timeout);
_throw_status(status); _throw_status(status);
} }
#endif #endif
jmp_buf SyncMixIn::env; jmp_buf SyncMixIn::env;
jmp_buf SyncMixIn::env_timeout;
void *SyncMixIn::_msg; void *SyncMixIn::_msg;
int SyncMixIn::inject_sync_msg(void *msg, void *management) int SyncMixIn::inject_sync_msg(void *msg, void *management)
{ {
_msg = msg; _msg = msg;
int val = setjmp(env); int val = setjmp(env);
if (!val) if (!val){
// call python timeout timer cancel
auto that = dynamic_cast< SyncMixIn_callback * >(
static_cast< SyncMixIn * > (management));
that->cancelTimeout();
do_sync_protocol(session, management); do_sync_protocol(session, management);
}
return 0; return 0;
} }
void *SyncMixIn::retrieve_next_sync_msg(void *management) void *SyncMixIn::retrieve_next_sync_msg(void *management, time_t *timeout)
{ {
static int twice = 1; static int twice = 1;
twice = !twice; twice = !twice;
if (!twice) if (!twice)
return (void *) _msg; return (void *) _msg;
if (*timeout != 0){
int val = setjmp(env_timeout);
if (!val){
// call python timeout timer start
auto that = dynamic_cast< SyncMixIn_callback * >(
static_cast< SyncMixIn * > (management));
that->setTimeout(*timeout);
}else{
// this will inject tiemout event
return NULL;
}
}
longjmp(env, 1); longjmp(env, 1);
return (void *) 23; return (void *) 23;
} }
// to be called from python timeout timer - may GIL protect us
void SyncMixIn::onTimeout(){
longjmp(env_timeout, 1);
}
void SyncMixIn_callback::messageToSend(Message msg) void SyncMixIn_callback::messageToSend(Message msg)
{ {
call_method< void >(_self, "messageToSend", msg); call_method< void >(_self, "messageToSend", msg);
@ -98,6 +122,11 @@ namespace pEp {
{ {
call_method< void >(_self, "showHandshake", me, partner); call_method< void >(_self, "showHandshake", me, partner);
} }
void SyncMixIn_callback::setTimeout(time_t timeout)
{
call_method< void >(_self, "SetTimeout", timeout);
}
} }
} }

13
src/sync_mixin.hh

@ -22,6 +22,15 @@ namespace pEp {
#ifndef NDEBUG #ifndef NDEBUG
virtual void _inject(int event, Identity partner, object extra); virtual void _inject(int event, Identity partner, object extra);
#endif #endif
virtual void setTimeout(time_t timeout){
throw runtime_error("override this method");
}
virtual void cancelTimeout(){
throw runtime_error("override this method");
}
virtual void onTimeout();
protected: protected:
static PEP_STATUS _messageToSend(void *obj, message *msg); static PEP_STATUS _messageToSend(void *obj, message *msg);
@ -29,9 +38,10 @@ namespace pEp {
pEp_identity *me, pEp_identity *partner); pEp_identity *me, pEp_identity *partner);
static jmp_buf env; static jmp_buf env;
static jmp_buf env_timeout;
static void *_msg; static void *_msg;
static int inject_sync_msg(void *msg, void *management); static int inject_sync_msg(void *msg, void *management);
static void *retrieve_next_sync_msg(void *management); static void *retrieve_next_sync_msg(void *management, time_t *timeout);
}; };
class SyncMixIn_callback : public SyncMixIn { class SyncMixIn_callback : public SyncMixIn {
@ -43,6 +53,7 @@ namespace pEp {
void messageToSend(Message msg); void messageToSend(Message msg);
void showHandshake(Identity me, Identity partner); void showHandshake(Identity me, Identity partner);
void setTimeout(time_t timeout);
}; };
} }
} }

Loading…
Cancel
Save