BsScriptAsyncOp.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptAsyncOp.h"
  4. #include "BsMonoManager.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoUtil.h"
  7. #include "BsCoreThread.h"
  8. namespace BansheeEngine
  9. {
  10. ScriptAsyncOp::ScriptAsyncOp(MonoObject* instance)
  11. :ScriptObject(instance)
  12. { }
  13. void ScriptAsyncOp::initRuntimeData()
  14. {
  15. metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptAsyncOp::internal_createInstance);
  16. metaData.scriptClass->addInternalCall("Internal_IsComplete", &ScriptAsyncOp::internal_isComplete);
  17. metaData.scriptClass->addInternalCall("Internal_GetReturnValue", &ScriptAsyncOp::internal_getReturnValue);
  18. metaData.scriptClass->addInternalCall("Internal_BlockUntilComplete", &ScriptAsyncOp::internal_blockUntilComplete);
  19. }
  20. MonoObject* ScriptAsyncOp::create(const AsyncOp& op,
  21. std::function<MonoObject*(const AsyncOp&)> asyncOpToReturnValue)
  22. {
  23. MonoObject* managedInstance = metaData.scriptClass->createInstance();
  24. ScriptAsyncOp* scriptAsyncOp = toNative(managedInstance);
  25. scriptAsyncOp->initialize(op, asyncOpToReturnValue);
  26. return managedInstance;
  27. }
  28. void ScriptAsyncOp::initialize(const AsyncOp& op, std::function<MonoObject*(const AsyncOp&)> asyncOpToReturnValue)
  29. {
  30. mAsyncOp = op;
  31. mConvertCallback = asyncOpToReturnValue;
  32. }
  33. void ScriptAsyncOp::internal_createInstance(MonoObject* managedInstance)
  34. {
  35. ScriptAsyncOp* scriptAsyncOp = new (bs_alloc<ScriptAsyncOp>()) ScriptAsyncOp(managedInstance);
  36. }
  37. void ScriptAsyncOp::internal_isComplete(ScriptAsyncOp* thisPtr, bool* value)
  38. {
  39. *value = thisPtr->mAsyncOp.hasCompleted();
  40. }
  41. MonoObject* ScriptAsyncOp::internal_getReturnValue(ScriptAsyncOp* thisPtr)
  42. {
  43. if (!thisPtr->mAsyncOp.hasCompleted())
  44. return nullptr;
  45. if (thisPtr->mConvertCallback == nullptr)
  46. return nullptr;
  47. return thisPtr->mConvertCallback(thisPtr->mAsyncOp);
  48. }
  49. void ScriptAsyncOp::internal_blockUntilComplete(ScriptAsyncOp* thisPtr)
  50. {
  51. if (!thisPtr->mAsyncOp.hasCompleted())
  52. {
  53. // Note: Assuming the AsyncOp was queued via accessor. This will deadlock
  54. // if it wasn't.
  55. gCoreThread().getAccessor()->submitToCoreThread();
  56. thisPtr->mAsyncOp.blockUntilComplete();
  57. }
  58. }
  59. }