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:
Enrico Granata 2013-03-27 22:38:11 +00:00
parent 459d3ee1dd
commit 360cc3188d
5 changed files with 40 additions and 1 deletions

View File

@ -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 ();

View File

@ -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:

View File

@ -178,6 +178,7 @@ class RegisterValue;
class RegularExpression;
class Scalar;
class ScriptInterpreter;
class ScriptInterpreterLocker;
class ScriptInterpreterObject;
#ifndef LLDB_DISABLE_PYTHON
class ScriptInterpreterPython;

View File

@ -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)
{

View File

@ -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)
{