1//************************************ bs::framework - Copyright 2018 Marko Pintera **************************************//
2//*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********//
3#include "CoreThread/BsCoreObjectCore.h"
4#include "CoreThread/BsCoreThread.h"
5
6namespace bs
7{
8 namespace ct
9 {
10 Signal CoreObject::mCoreGpuObjectLoadedCondition;
11 Mutex CoreObject::mCoreGpuObjectLoadedMutex;
12
13 CoreObject::CoreObject()
14 :mFlags(0)
15 { }
16
17 CoreObject::~CoreObject()
18 {
19 THROW_IF_NOT_CORE_THREAD;
20 }
21
22 void CoreObject::initialize()
23 {
24 {
25 Lock lock(mCoreGpuObjectLoadedMutex);
26 setIsInitialized(true);
27 }
28
29 setScheduledToBeInitialized(false);
30
31 mCoreGpuObjectLoadedCondition.notify_all();
32 }
33
34 void CoreObject::synchronize()
35 {
36 if (!isInitialized())
37 {
38#if BS_DEBUG_MODE
39 if (BS_THREAD_CURRENT_ID == CoreThread::instance().getCoreThreadId())
40 BS_EXCEPT(InternalErrorException, "You cannot call this method on the core thread. It will cause a deadlock!");
41#endif
42
43 gCoreThread().submitAll(true);
44
45 Lock lock(mCoreGpuObjectLoadedMutex);
46 while (!isInitialized())
47 {
48 if (!isScheduledToBeInitialized())
49 BS_EXCEPT(InternalErrorException, "Attempting to wait until initialization finishes but object is not scheduled to be initialized.");
50
51 mCoreGpuObjectLoadedCondition.wait(lock);
52 }
53 }
54 }
55
56 void CoreObject::_setThisPtr(SPtr<CoreObject> ptrThis)
57 {
58 mThis = ptrThis;
59 }
60 }
61}