Skip to content

Commit

Permalink
mq, feat: Integrate js_invoke into the invoke.
Browse files Browse the repository at this point in the history
  • Loading branch information
xicilion committed Apr 6, 2018
1 parent 62b6581 commit e85831e
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 80 deletions.
4 changes: 0 additions & 4 deletions fibjs/include/JSHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,6 @@ class JSHandler : public Handler_base {
return 0;
}

public:
static result_t js_invoke(Handler_base* hdlr, object_base* v,
obj_ptr<Handler_base>& retVal, AsyncEvent* ac);

private:
bool m_async;
};
Expand Down
72 changes: 0 additions & 72 deletions fibjs/src/mq/JSHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,76 +126,4 @@ result_t JSHandler::invoke(object_base* v, obj_ptr<Handler_base>& retVal,
return 0;
}

result_t JSHandler::js_invoke(Handler_base* hdlr, object_base* v,
obj_ptr<Handler_base>& retVal, AsyncEvent* ac)
{
class asyncInvoke : public AsyncEvent {
public:
asyncInvoke(Handler_base* pThis, object_base* v,
obj_ptr<Handler_base>& retVal, AsyncEvent* ac)
: m_ac(ac)
, m_pThis(pThis)
, m_v(v)
, m_retVal(retVal)
{
}

public:
virtual result_t js_invoke()
{
{
JSFiber::scope s;
m_hr = JSHandler::js_invoke(m_pThis, m_v, m_retVal, this);
if (m_hr == CALL_E_EXCEPTION)
m_message = Runtime::errMessage();
}

async(CALL_E_NOSYNC);

return m_hr;
}

virtual void invoke()
{
if (m_hr == CALL_E_EXCEPTION)
Runtime::setError(m_message);
m_ac->post(m_hr);
delete this;
}

private:
AsyncEvent* m_ac;
obj_ptr<Handler_base> m_pThis;
obj_ptr<object_base> m_v;
obj_ptr<Handler_base>& m_retVal;
result_t m_hr;
exlib::string m_message;
};

if (ac->isSync()) {
result_t hr;
obj_ptr<Handler_base> hdlr1 = hdlr;
obj_ptr<Handler_base> hdlr2;
AsyncEvent ac;

while (true) {
hr = hdlr1->invoke(v, hdlr2, &ac);
if (hr == CALL_E_NOSYNC) {
retVal = hdlr1;
return 0;
}

if (hr < 0 || hr == CALL_RETURN_NULL)
return hr;

hdlr1 = hdlr2;
}

return 0;
}

(new asyncInvoke(hdlr, v, retVal, ac))->sync(hdlr->holder());
return CALL_E_PENDDING;
}

} /* namespace fibjs */
58 changes: 54 additions & 4 deletions fibjs/src/mq/mq.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ result_t mq_base::invoke(Handler_base* hdlr, object_base* v,
: AsyncState(ac)
, m_next(hdlr)
, m_v(v)
, m_hr(0)
{
set(call);
}
Expand All @@ -79,24 +80,73 @@ result_t mq_base::invoke(Handler_base* hdlr, object_base* v,
asyncInvoke* pThis = (asyncInvoke*)pState;
result_t hr;

if (n == CALL_RETURN_NULL)
if (n == CALL_RETURN_NULL || pThis->m_hr == CALL_RETURN_NULL)
return pThis->done();

if (pThis->m_hr == CALL_E_EXCEPTION)
Runtime::setError(pThis->m_message);

if (pThis->m_hr < 0)
return pThis->m_hr;

pThis->m_hdlr = pThis->m_next;
pThis->m_next.Release();

hr = pThis->m_hdlr->invoke(pThis->m_v, pThis->m_next, pThis);
if (hr == CALL_E_NOASYNC)
return JSHandler::js_invoke(pThis->m_hdlr, pThis->m_v, pThis->m_next,
pThis);
if (hr == CALL_E_NOASYNC) {
pThis->sync(pThis->m_hdlr->holder());
return CALL_E_PENDDING;
}

return hr;
}

public:
virtual result_t js_invoke()
{
{
JSFiber::scope s;

m_hr = js_run();
if (m_hr == CALL_E_EXCEPTION)
m_message = Runtime::errMessage();
}

apost(0);

return m_hr;
}

private:
result_t js_run()
{
result_t hr;
obj_ptr<Handler_base> hdlr1 = m_hdlr;
obj_ptr<Handler_base> hdlr2;
AsyncEvent ac;

while (true) {
hr = hdlr1->invoke(m_v, hdlr2, &ac);
if (hr == CALL_E_NOSYNC) {
m_next = hdlr1;
return 0;
}

if (hr < 0 || hr == CALL_RETURN_NULL)
return hr;

hdlr1 = hdlr2;
}

return 0;
}

private:
obj_ptr<Handler_base> m_hdlr;
obj_ptr<Handler_base> m_next;
obj_ptr<object_base> m_v;
result_t m_hr;
exlib::string m_message;
};

if (ac->isSync())
Expand Down

0 comments on commit e85831e

Please sign in to comment.