forked from OSchip/llvm-project
Implementing the notion of externally-acquirable ScriptInterpreter lock
With this notion, if parties outside the ScriptInterpreter itself need to acquire a lock on script APIs, they can do so by a pattern like this: { auto lock = interpeter->AcquireInterpreterLock(); // do whatever you need to do... } // lock will automatically be released here This might be useful for classes that use the Python convenience objects (e.g. PythonDictionary) to ensure they keep the underlying interpreter in a safe and controlled condition while they call through the C API functions Of course, the ScriptInterpreter still manages its internal locking correctly when necessary :-) llvm-svn: 178189
This commit is contained in:
parent
459d3ee1dd
commit
360cc3188d
|
@ -61,6 +61,22 @@ public:
|
|||
protected:
|
||||
void* m_object;
|
||||
};
|
||||
|
||||
class ScriptInterpreterLocker
|
||||
{
|
||||
public:
|
||||
|
||||
ScriptInterpreterLocker ()
|
||||
{
|
||||
}
|
||||
|
||||
virtual ~ScriptInterpreterLocker ()
|
||||
{
|
||||
}
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN (ScriptInterpreterLocker);
|
||||
};
|
||||
|
||||
|
||||
class ScriptInterpreter
|
||||
{
|
||||
|
@ -409,6 +425,9 @@ public:
|
|||
return lldb::ScriptInterpreterObjectSP(new ScriptInterpreterObject(object));
|
||||
}
|
||||
|
||||
virtual std::auto_ptr<ScriptInterpreterLocker>
|
||||
AcquireInterpreterLock ();
|
||||
|
||||
const char *
|
||||
GetScriptInterpreterPtyName ();
|
||||
|
||||
|
|
|
@ -181,6 +181,9 @@ public:
|
|||
virtual lldb::ScriptInterpreterObjectSP
|
||||
MakeScriptObject (void* object);
|
||||
|
||||
virtual std::auto_ptr<ScriptInterpreterLocker>
|
||||
AcquireInterpreterLock ();
|
||||
|
||||
void
|
||||
CollectDataForBreakpointCommandCallback (BreakpointOptions *bp_options,
|
||||
CommandReturnObject &result);
|
||||
|
@ -271,7 +274,7 @@ private:
|
|||
DISALLOW_COPY_AND_ASSIGN (ScriptInterpreterPythonObject);
|
||||
};
|
||||
|
||||
class Locker
|
||||
class Locker : public ScriptInterpreterLocker
|
||||
{
|
||||
public:
|
||||
|
||||
|
|
|
@ -178,6 +178,7 @@ class RegisterValue;
|
|||
class RegularExpression;
|
||||
class Scalar;
|
||||
class ScriptInterpreter;
|
||||
class ScriptInterpreterLocker;
|
||||
class ScriptInterpreterObject;
|
||||
#ifndef LLDB_DISABLE_PYTHON
|
||||
class ScriptInterpreterPython;
|
||||
|
|
|
@ -81,6 +81,12 @@ ScriptInterpreter::LanguageToString (lldb::ScriptLanguage language)
|
|||
return return_value;
|
||||
}
|
||||
|
||||
std::auto_ptr<ScriptInterpreterLocker>
|
||||
ScriptInterpreter::AcquireInterpreterLock ()
|
||||
{
|
||||
return std::auto_ptr<ScriptInterpreterLocker>(new ScriptInterpreterLocker());
|
||||
}
|
||||
|
||||
void
|
||||
ScriptInterpreter::InitializeInterpreter (SWIGInitCallback python_swig_init_callback)
|
||||
{
|
||||
|
|
|
@ -135,6 +135,7 @@ ScriptInterpreterPython::Locker::Locker (ScriptInterpreterPython *py_interpreter
|
|||
uint16_t on_entry,
|
||||
uint16_t on_leave,
|
||||
FILE* wait_msg_handle) :
|
||||
ScriptInterpreterLocker (),
|
||||
m_teardown_session( (on_leave & TearDownSession) == TearDownSession ),
|
||||
m_python_interpreter(py_interpreter),
|
||||
m_tmp_fh(wait_msg_handle)
|
||||
|
@ -2806,6 +2807,15 @@ ScriptInterpreterPython::GetDocumentationForItem(const char* item, std::string&
|
|||
}
|
||||
}
|
||||
|
||||
std::auto_ptr<ScriptInterpreterLocker>
|
||||
ScriptInterpreterPython::AcquireInterpreterLock ()
|
||||
{
|
||||
std::auto_ptr<ScriptInterpreterLocker> py_lock(new Locker(this,
|
||||
Locker::AcquireLock | Locker::InitSession,
|
||||
Locker::FreeLock | Locker::TearDownSession));
|
||||
return py_lock;
|
||||
}
|
||||
|
||||
void
|
||||
ScriptInterpreterPython::InitializeInterpreter (SWIGInitCallback python_swig_init_callback)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue