diff options
Diffstat (limited to 'python/modules/IcePy/Thread.cpp')
-rw-r--r-- | python/modules/IcePy/Thread.cpp | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/python/modules/IcePy/Thread.cpp b/python/modules/IcePy/Thread.cpp index 06f100200a3..4be4a97702d 100644 --- a/python/modules/IcePy/Thread.cpp +++ b/python/modules/IcePy/Thread.cpp @@ -38,9 +38,30 @@ IcePy::AdoptThread::~AdoptThread() IcePy::ThreadHook::ThreadHook(PyObject* threadNotification, PyObject* threadStart, PyObject* threadStop) : _threadNotification(threadNotification), _threadStart(threadStart), _threadStop(threadStop) { - Py_INCREF(threadNotification); - Py_INCREF(threadStart); - Py_INCREF(threadStop); + if(threadNotification) + { + if(!PyObject_HasAttrString(threadNotification, STRCAST("start")) || + !PyObject_HasAttrString(threadNotification, STRCAST("stop"))) + { + throw Ice::InitializationException(__FILE__, __LINE__, + "threadNotification object must have 'start' and 'stop' methods"); + } + + } + + if(threadStart && !PyCallable_Check(threadStart)) + { + throw Ice::InitializationException(__FILE__, __LINE__, "threadStart must be a callable"); + } + + if(threadStop && !PyCallable_Check(threadStop)) + { + throw Ice::InitializationException(__FILE__, __LINE__, "threadStop must be a callable"); + } + + Py_XINCREF(threadNotification); + Py_XINCREF(threadStart); + Py_XINCREF(threadStop); } void |