#include "il2cpp-config.h"
|
#include "il2cpp-object-internals.h"
|
#include "il2cpp-api.h"
|
#include "AsyncResult.h"
|
#include "vm/Runtime.h"
|
#include "vm/WaitHandle.h"
|
#include "vm/ThreadPoolMs.h"
|
#include "os/Event.h"
|
|
namespace il2cpp
|
{
|
namespace icalls
|
{
|
namespace mscorlib
|
{
|
namespace System
|
{
|
namespace Runtime
|
{
|
namespace Remoting
|
{
|
namespace Messaging
|
{
|
Il2CppObject* AsyncResult::Invoke(Il2CppObject* _this)
|
{
|
#if IL2CPP_TINY
|
IL2CPP_NOT_IMPLEMENTED_ICALL(AsyncResult::Invoke);
|
return NULL;
|
#else
|
Il2CppAsyncCall *ac;
|
Il2CppObject *res;
|
Il2CppAsyncResult *ares = (Il2CppAsyncResult*)_this;
|
|
IL2CPP_ASSERT(ares);
|
IL2CPP_ASSERT(ares->async_delegate);
|
|
ac = (Il2CppAsyncCall*)ares->object_data;
|
if (!ac)
|
{
|
res = vm::Runtime::DelegateInvoke(ares->async_delegate, (void**)&ares->async_state, NULL);
|
}
|
else
|
{
|
il2cpp::os::EventHandle *wait_event = NULL;
|
|
IL2CPP_OBJECT_SETREF(ac->msg, exc, NULL);
|
res = il2cpp::vm::ThreadPoolMs::MessageInvoke((Il2CppObject*)ares->async_delegate->target, ac->msg, &ac->msg->exc, &ac->out_args);
|
IL2CPP_OBJECT_SETREF(ac, res, res);
|
|
il2cpp_monitor_enter((Il2CppObject*)ares);
|
ares->completed = 1;
|
if (ares->handle)
|
wait_event = (il2cpp::os::EventHandle*)il2cpp::vm::WaitHandle::GetPlatformHandle(ares->handle);
|
|
il2cpp_monitor_exit((Il2CppObject*)ares);
|
|
if (wait_event != NULL)
|
wait_event->Get().Set();
|
|
Il2CppException* completionException = NULL;
|
|
if (ac->cb_method)
|
vm::Runtime::Invoke(ac->cb_method, ac->cb_target, (void**)&ares, &completionException);
|
|
if (completionException != NULL)
|
vm::Exception::Raise(completionException);
|
}
|
|
return res;
|
#endif
|
}
|
} // namespace Messaging
|
} // namespace Remoting
|
} // namespace Runtime
|
} // namespace System
|
} // namespace mscorlib
|
} // namespace icalls
|
} // namespace il2cpp
|