20,741
edits
m (Robot: Cosmetic changes) |
m (→Locking a Nasal context (threading): naModLock() and naModUnlock() - taken verbatim from the Nasal source code) |
||
Line 253: | Line 253: | ||
For an example how something like this is done in the FlightGear context, you may want to check out $FG_SRC/Scripting/nasal-props.cxx, which wraps the SGPropertyNode class ([[SimGear]]) inside a nasal ghost, so that the C++ class is exposed to Nasal scripts. | For an example how something like this is done in the FlightGear context, you may want to check out $FG_SRC/Scripting/nasal-props.cxx, which wraps the SGPropertyNode class ([[SimGear]]) inside a nasal ghost, so that the C++ class is exposed to Nasal scripts. | ||
= Locking a Nasal context (threading) = | |||
// Acquires a "modification lock" on a context, allowing the C code to | |||
// modify Nasal data without fear that such data may be "lost" by the | |||
// garbage collector (nasal data on the C stack is not examined in | |||
// GC!). This disallows garbage collection until the current thread | |||
// can be blocked. The lock should be acquired whenever nasal objects | |||
// are being modified. It need not be acquired when only read access | |||
// is needed, PRESUMING that the Nasal data being read is findable by | |||
// the collector (via naSave, for example) and that another Nasal | |||
// thread cannot or will not delete the reference to the data. It | |||
// MUST NOT be acquired by naCFunction's, as those are called with the | |||
// lock already held; acquiring two locks for the same thread will | |||
// cause a deadlock when the GC is invoked. It should be UNLOCKED by | |||
// naCFunction's when they are about to do any long term non-nasal | |||
// processing and/or blocking I/O. Note that naModLock() may need to | |||
// block to allow garbage collection to occur, and that garbage | |||
// collection by other threads may be blocked until naModUnlock() is | |||
// called. It must also be UNLOCKED by threads that hold a lock | |||
// already before making a naCall() or naContinue() call -- these | |||
// functions will attempt to acquire the lock again. | |||
void naModLock(); | |||
void naModUnlock(); | |||
= Things to avoid = | = Things to avoid = |