Files
LayaNative2.0/Conch/source/conch/JSWrapper/JSInterface/JSC/JSCEnv.h
T
2020-11-11 16:17:13 +08:00

302 lines
6.7 KiB
C++

/**
@file JSCEnv.h
@brief
@author James
@version 1.0
@date 2018_8_23
*/
#ifndef __JSCEnv_H__
#define __JSCEnv_H__
#include <JavaScriptCore/JavaScriptCore.h>
#include "JSCProxyTLS.h"
#include <misc/JCWorkerThread.h>
namespace laya
{
void JSPrint( const char* p_sBuffer );
void JSAlert( const char* p_sBuffer );
void JSAlertExit( const char* p_sBuffer );
void evalJS( const char* p_sSource );
class Javascript
{
public:
typedef void(*voidfun)(void* data);
Javascript()
{
}
void init(int nPort)
{
}
void run(const char* sSource)
{
}
void run(const char* sSource, std::function<void(void)> preRunFunc)
{
}
void run(voidfun func, void* pdata)
{
}
void uninit()
{
}
void initJSEngine();
void uninitJSEngine();
public:
JSGlobalContextRef m_pGlobalContext;
JSValueRef m_pUndefined;
};
class JSThreadInterface
{
public:
JSThreadInterface()
{
}
virtual ~JSThreadInterface()
{
}
virtual void post(std::function<void(void)> func) = 0;
virtual void on(int nEvent, JCEventEmitter::EventHandler func, void* pInThread = 0) = 0;
virtual void start() = 0;
virtual void stop() = 0;
virtual void initialize(int nPort) = 0;
virtual void uninitialize() = 0;
virtual void setLoopFunc(std::function<bool(void)> func) = 0;
virtual void pushDbgFunc(std::function<void(void)> task) = 0;
virtual void runDbgFuncs() = 0;
virtual void waitAndRunDbgFuncs() = 0;
virtual bool hasDbgFuncs() = 0;
virtual JCWorkerThread* getWorker() = 0;
virtual void run(Javascript::voidfun func, void* pData) = 0;
virtual void clearFunc() = 0;
};
class JSCWorker : public JCWorkerThread
{
public:
JSCWorker();
~JSCWorker();
virtual void _defRunLoop();
virtual void _runLoop();
virtual void stop();
public:
Javascript* m_pJS;
};
class JSMulThread : public JSThreadInterface
{
public:
JSMulThread()
{
m_kWorker.setThreadName("JavaScript Main");
m_kWorker.m_pJS = &m_kJS;
}
~JSMulThread()
{
}
void post(std::function<void(void)> func)
{
if (m_kWorker.m_bStop)return;
CToObjectCPostFunc(func);
}
void on(int nEvent, JCEventEmitter::EventHandler func, void* pInThread = 0)
{
m_kWorker.on(nEvent, func, (JCWorkerThread*)pInThread);
}
void start()
{
m_kWorker.start();
}
void stop()
{
m_kWorker.stop();
}
void initialize(int nPort)
{
m_kJS.init(nPort);
}
void uninitialize()
{
m_kJS.uninit();
}
void setLoopFunc(std::function<bool(void)> func)
{
m_kWorker.setLoopFunc(func);
}
void pushDbgFunc(std::function<void(void)> task)
{
}
void runDbgFuncs()
{
}
void waitAndRunDbgFuncs()
{
}
bool hasDbgFuncs()
{
return false;
}
JCWorkerThread* getWorker()
{
return &m_kWorker;
}
void run(Javascript::voidfun func, void* pData)
{
m_kWorker.runQueue();
m_kWorker.m_funcLoop();
}
void clearFunc()
{
}
public:
Javascript m_kJS;
JSCWorker m_kWorker;
};
class JSSingleThread : public JSThreadInterface
{
public:
JSSingleThread()
{
}
~JSSingleThread()
{
}
void post(std::function<void(void)> func)
{
//if (m_kWorker.m_bStop)return;
//CToObjectCPostFunc(func);
m_kQueueLock.lock();
m_vFuncQueue.push_back(func);
m_kQueueLock.unlock();
}
void on(int nEvent, JCEventEmitter::EventHandler func, void* pInThread = 0)
{
switch (nEvent)
{
case JCWorkerThread::Event_threadStart:
m_kStartFunc.func = func;
m_kStartFunc.bDel = false;
break;
case JCWorkerThread::Event_threadStop:
m_kStopFunc.func = func;
m_kStopFunc.bDel = false;
break;
default:
LOGE("JSSingleThread on() event type error");
break;
}
}
void start()
{
m_kStartFunc.func(NULL);
}
void stop()
{
m_kStopFunc.func(NULL);
}
void initialize(int nPort)
{
clearFunc();
m_kJS.init(nPort);
m_kJS.initJSEngine();
}
void uninitialize()
{
clearFunc();
m_kJS.uninitJSEngine();
m_kJS.uninit();
}
void setLoopFunc(std::function<bool(void)> func)
{
m_kLoopFunc = func;
}
void pushDbgFunc(std::function<void(void)> task)
{
}
void runDbgFuncs()
{
}
void waitAndRunDbgFuncs()
{
}
bool hasDbgFuncs()
{
return false;
}
JCWorkerThread* getWorker()
{
return NULL;
}
void run(Javascript::voidfun func, void* pData)
{
runFunQueue();
m_kLoopFunc();
}
void clearFunc()
{
m_kQueueLock.lock();
m_vFuncQueue.clear();
m_kQueueLock.unlock();
}
public:
void runFunQueue()
{
std::vector<std::function<void(void)>> vWorkQueue;
m_kQueueLock.lock();
std::swap(vWorkQueue, m_vFuncQueue);
m_kQueueLock.unlock();
for (int i = 0; i < (int)vWorkQueue.size(); i++)
{
vWorkQueue[i]();
}
}
public:
Javascript m_kJS;
JCEventEmitter::EvtHandlerPack m_kStartFunc;
JCEventEmitter::EvtHandlerPack m_kStopFunc;
std::vector<std::function<void(void)>> m_vFuncQueue;
std::mutex m_kQueueLock;
std::function<bool(void)> m_kLoopFunc;
};
};
//------------------------------------------------------------------------------
#endif //__JSCEnv_H__
//-----------------------------END FILE--------------------------------