SB Implementing ScriptBasic Multi- Thread How to embed ScriptBasic multi-thread?
SB Contents Who this presentation is for What is multi-thread, issues 2 ways of mt ScriptBasic Issues when implementing dependent threads Solutions for the issues
SB Who this presentation is for Curious (why things happen?) Want to learn and understand how ScriptBasic works Want to embed ScriptBasic into multi threaded application NOT for those, who just want to program in scriba
SB What is multi-thread? A single process runs several threads simultaneous A thread has its own stack and call sequence Threads share memory and other process resources UNIX thread is just a process w/o separate data
SB Issues regarding threads Don’t use global variables (except for constant values, like ScriptBasic syntax definition tables) Carefully design locking mechanisms Free memory yourself, don’t rely on OS
SB Enabling MT ScriptBasic No global variables No memory leaking Object oriented approach (although it is C and not C++) Thread and lock primitives for portability ( thread.c )
SB Two way of MT embedding Independent threads (ex: Eszter SB Engine v1.0b22) Dependent threads, long-life worker threads (ex: Eszter SB Engine v1.0b23)
SB Independent threads Threads run independent of each other Possibility and advised to share configuration file Possibility and advised to cache program code in memory (though even v1.0b22 does not) Can’t and should not share support function table
SB Dependent threads Threads access shared data Example: –session handling in web server –Long-life application „global” variables –Locks (not flock, but memory mutexes)
SB Pseudo Interpreter (config, global ST) Thread life-time and ST object life time PROCESS Basic thread Module worker thread Basic thread ST
SB Initializing and using global ST InitModuleInterface –Initializes the module Support Function Table InheritModuleInterface –Sets the Support Function Inherit pointer but has NO effect on the object Support Function Table
SB Module worker thread Module life-time PROCESS Basic thread Module instance counter 2 PROCESS
SB Worker thread initialization DllMain (W32) or _init (UNIX) has no ST bootmodu is called for each thread Solution: use bootmodu with the help of –basext.h macros –Process level global variables
SB MT special macros and variables #define SUPPORT_MULTITHREAD \ static MUTEX mxThreadCounter,mxInit;\ static int iFirst;\ static long lThreadCounter; static void *pProcessLevelMemorySegment;
SB Initialization code in bootmodu INC_THREAD_COUNTER INITLOCK if( iFirst ){ /* inherit malloc and free from pMemorySegment */ pProcessLevelMemorySegment = besINIT_SEGMENT(pSt->pEo->pMemorySegment,NULL); besCreateThread(&hT,worker_thread, pSt->pEo->pSTI); iFirst = 0 } INITUNLO /* unlock the init mutex */
SB New control function besSUB_KEEP long lTC; GET_THREAD_COUNTER(lTC); if( lTC == 0 ){ INC_THREAD_COUNTER } return lTC ? 1 : 0; besEND
SB Module worker thread Module life-time using besSUB_KEEP PROCESS Basic thread Module instance counter 2 PROCESS
SB Thank you for your attention