hooks work

This commit is contained in:
Michael Davidsaver
2013-03-24 21:14:31 -04:00
parent 23d134540b
commit f58ba8dccb
4 changed files with 79 additions and 23 deletions

View File

@ -127,6 +127,8 @@ static void pyhook(initHookState state)
PyObject *list = PyDict_GetItem(hooktable, key); PyObject *list = PyDict_GetItem(hooktable, key);
Py_DECREF(key); Py_DECREF(key);
if(list) {
list = PyObject_GetIter(list); list = PyObject_GetIter(list);
if(!list) { if(!list) {
fprintf(stderr, "hook sequence not iterable!"); fprintf(stderr, "hook sequence not iterable!");
@ -137,7 +139,7 @@ static void pyhook(initHookState state)
PyObject *obj; PyObject *obj;
if(!PyCallable_Check(next)) if(!PyCallable_Check(next))
continue; continue;
obj = PyObject_CallFunction(next, "O", key); obj = PyObject_CallFunction(next, "");
Py_DECREF(next); Py_DECREF(next);
if(obj) if(obj)
Py_DECREF(obj); Py_DECREF(obj);
@ -154,6 +156,7 @@ static void pyhook(initHookState state)
Py_DECREF(list); Py_DECREF(list);
} }
} }
}
PyGILState_Release(gilstate); PyGILState_Release(gilstate);
} }
@ -181,8 +184,11 @@ void pyRecord_setup(PyObject *module);
/* initialize "magic" builtin module */ /* initialize "magic" builtin module */
static void init_dbapi(void) static void init_dbapi(void)
{ {
PyObject *mod; PyObject *mod, *hookdict;
pystate *st; pystate *st;
PyGILState_STATE state;
state = PyGILState_Ensure();
hooktable = PyDict_New(); hooktable = PyDict_New();
if(!hooktable) if(!hooktable)
@ -195,14 +201,21 @@ static void init_dbapi(void)
mod = Py_InitModule("_dbapi", devsup_methods); mod = Py_InitModule("_dbapi", devsup_methods);
hookdict = PyDict_New();
if(!hookdict)
return;
PyModule_AddObject(mod, "_hooks", hookdict);
for(st = statenames; st->name; st++) { for(st = statenames; st->name; st++) {
PyModule_AddIntConstant(mod, st->name, (long)st->state); PyDict_SetItemString(hookdict, st->name, PyInt_FromLong((long)st->state));
} }
Py_INCREF(hooktable); /* an extra ref */ Py_INCREF(hooktable); /* an extra ref */
PyModule_AddObject(mod, "_hooktable", hooktable); PyModule_AddObject(mod, "_hooktable", hooktable);
pyField_setup(mod); pyField_setup(mod);
pyRecord_setup(mod); pyRecord_setup(mod);
PyGILState_Release(state);
} }
#include <iocsh.h> #include <iocsh.h>

View File

36
python/devsup/hooks.py Normal file
View File

@ -0,0 +1,36 @@
from _dbapi import _hooks, _hooktable
__all__ = [
"hooknames",
"addHook",
"debugHooks",
]
hooknames = _hooks.keys()
def addHook(state, func):
"""addHook("stats", funcion)
Add callback function to IOC start sequence.
def show():
print 'State Occurred'
addHook("AfterIocRunning", show)
"""
sid = _hooks[state]
try:
slist = _hooktable[sid]
except KeyError:
slist = []
_hooktable[sid] = slist
slist.append(func)
def debugHooks():
"""Install debugging print to hooks
"""
for h in hooknames:
def _showstate(state=h):
print 'Reached state',state
addHook(h, _showstate)

View File

@ -1,6 +1,13 @@
#!./bin/linux-x86-debug/devsup #!./bin/linux-x86-debug/devsup
epicsEnvSet("PYTHONPATH", "${PWD}/python")
dbLoadDatabase("dbd/devsup.dbd") dbLoadDatabase("dbd/devsup.dbd")
devsup_registerRecordDeviceDriver(pdbbase) devsup_registerRecordDeviceDriver(pdbbase)
evalPy "print 1" evalPy "import sys"
evalPy "print 2" evalPy "print sys.path"
evalPy "import devsup.hooks"
evalPy "devsup.hooks.debugHooks()"
iocInit