diff options
author | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2010-02-07 00:36:25 +0000 |
---|---|---|
committer | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2010-02-07 00:36:25 +0000 |
commit | bb4b895471e3165c71bdfd1fdae5e1ffde8f1696 (patch) | |
tree | 57bec175bb5dbf43303f7334162b9b2b4bda03c6 /sca-cpp/trunk/modules/python | |
parent | 00f9947613624b251551ba709824f97f1b6c2fb1 (diff) |
Moved server configuration to HTTPD postConfig phase, to avoid running configuration commands twice and added a way for runtime modules and components to handle start/restart/stop events. Improved build scripts a little, to not depend on external environment variables.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@907352 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-cpp/trunk/modules/python')
-rw-r--r-- | sca-cpp/trunk/modules/python/driver.hpp | 1 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/python/eval.hpp | 24 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/python/mod-python.cpp | 29 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/python/mod-python.hpp | 4 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/python/python-test.cpp | 2 | ||||
-rwxr-xr-x | sca-cpp/trunk/modules/python/server-test | 7 | ||||
-rwxr-xr-x | sca-cpp/trunk/modules/python/wiring-test | 7 |
7 files changed, 54 insertions, 20 deletions
diff --git a/sca-cpp/trunk/modules/python/driver.hpp b/sca-cpp/trunk/modules/python/driver.hpp index a1467c41a8..2820201057 100644 --- a/sca-cpp/trunk/modules/python/driver.hpp +++ b/sca-cpp/trunk/modules/python/driver.hpp @@ -47,6 +47,7 @@ const value evalDriverLoop(PyObject* script, istream& in, ostream& out) { } const bool evalDriverRun(const char* path, istream& in, ostream& out) { + PythonRuntime py; scheme::setupDisplay(out); ifstream is(path); failable<PyObject*> script = readScript(path, is); diff --git a/sca-cpp/trunk/modules/python/eval.hpp b/sca-cpp/trunk/modules/python/eval.hpp index 1b9392aed7..09c2cba92d 100644 --- a/sca-cpp/trunk/modules/python/eval.hpp +++ b/sca-cpp/trunk/modules/python/eval.hpp @@ -39,16 +39,23 @@ namespace python { */ class PythonRuntime { public: - PythonRuntime() { - Py_Initialize(); - + PythonRuntime() : owner(true) { + Py_InitializeEx(0); setupIO(); } + PythonRuntime(unused const PythonRuntime& r) : owner(false) { + } + ~PythonRuntime() { + if (!owner) + return; + //Py_Finalize(); } -} pythonRuntime; +private: + const bool owner; +}; /** * Declare conversion functions. @@ -211,8 +218,15 @@ const failable<value> evalScript(const value& expr, PyObject* script) { // Get the requested function PyObject* func = PyObject_GetAttrString(script, c_str(car<value>(expr))); - if (func == NULL) + if (func == NULL) { + + // The start, stop, and restart functions are optional + const value fn = car<value>(expr); + if (fn == "start" || fn == "stop" || fn == "restart") + return value(false); + return mkfailure<value>(string("Couldn't find function: ") + car<value>(expr) + " : " + lastError()); + } if (!PyCallable_Check(func)) { Py_DECREF(func); return mkfailure<value>(string("Couldn't find callable function: ") + car<value>(expr)); diff --git a/sca-cpp/trunk/modules/python/mod-python.cpp b/sca-cpp/trunk/modules/python/mod-python.cpp index 1c35467b4b..a45b83997f 100644 --- a/sca-cpp/trunk/modules/python/mod-python.cpp +++ b/sca-cpp/trunk/modules/python/mod-python.cpp @@ -37,15 +37,38 @@ namespace server { namespace modeval { /** + * Start the module. + */ +const failable<bool> start(unused ServerConf& sc) { + // Start a Python runtime + sc.moduleConf = new (gc_new<python::PythonRuntime>()) python::PythonRuntime(); + return true; +} + +/** + * Stop the module. + */ +const failable<bool> stop(unused ServerConf& sc) { + return true; +} + +/** + * Restart the module. + */ +const failable<bool> restart(unused ServerConf& sc) { + return true; +} + +/** * Evaluate a Python component implementation and convert it to an applicable * lambda function. */ -const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px) { +const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px, modeval::ServerConf& sc) { const string itype(elementName(impl)); if (contains(itype, ".python")) - return modpython::evalImplementation(path, impl, px); + return modpython::evalImplementation(path, impl, px, sc); if (contains(itype, ".cpp")) - return modcpp::evalImplementation(path, impl, px); + return modcpp::evalImplementation(path, impl, px, sc); return mkfailure<lambda<value(const list<value>&)> >(string("Unsupported implementation type: ") + itype); } diff --git a/sca-cpp/trunk/modules/python/mod-python.hpp b/sca-cpp/trunk/modules/python/mod-python.hpp index e67b9a4a93..cbe2b6b97c 100644 --- a/sca-cpp/trunk/modules/python/mod-python.hpp +++ b/sca-cpp/trunk/modules/python/mod-python.hpp @@ -34,7 +34,7 @@ #include "value.hpp" #include "monad.hpp" #include "eval.hpp" -#include "../http/httpd.hpp" +#include "../server/mod-eval.hpp" namespace tuscany { namespace server { @@ -63,7 +63,7 @@ struct applyImplementation { * Evaluate a Python component implementation and convert it to an applicable * lambda function. */ -const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px) { +const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px, unused modeval::ServerConf& sc) { const string fpath(path + attributeValue("script", impl)); ifstream is(fpath); if (fail(is)) diff --git a/sca-cpp/trunk/modules/python/python-test.cpp b/sca-cpp/trunk/modules/python/python-test.cpp index 48687fa0ec..c4ffcee57e 100644 --- a/sca-cpp/trunk/modules/python/python-test.cpp +++ b/sca-cpp/trunk/modules/python/python-test.cpp @@ -37,6 +37,7 @@ const string testPythonAdd = bool testEvalExpr() { gc_scoped_pool pool; + PythonRuntime py; istringstream is(testPythonAdd); failable<PyObject*> script = readScript("script", is); @@ -69,6 +70,7 @@ const string testCallLambda( bool testEvalLambda() { gc_scoped_pool pool; + PythonRuntime py; const value trl = mklist<value>("testReturnLambda"); istringstream trlis(testReturnLambda); diff --git a/sca-cpp/trunk/modules/python/server-test b/sca-cpp/trunk/modules/python/server-test index 247734e63d..fe1ff7a486 100755 --- a/sca-cpp/trunk/modules/python/server-test +++ b/sca-cpp/trunk/modules/python/server-test @@ -22,14 +22,11 @@ ../server/server-conf tmp ./python-conf tmp cat >>tmp/conf/httpd.conf <<EOF - -<Location /> SCAContribution `pwd`/ SCAComposite domain-test.composite -</Location> EOF -apachectl -k start -d `pwd`/tmp +../http/httpd-start tmp sleep 2 # Test @@ -37,6 +34,6 @@ sleep 2 rc=$? # Cleanup -apachectl -k stop -d `pwd`/tmp +../http/httpd-stop tmp sleep 2 return $rc diff --git a/sca-cpp/trunk/modules/python/wiring-test b/sca-cpp/trunk/modules/python/wiring-test index 96306ace28..a3c85838fd 100755 --- a/sca-cpp/trunk/modules/python/wiring-test +++ b/sca-cpp/trunk/modules/python/wiring-test @@ -24,14 +24,11 @@ echo "Testing..." ../server/server-conf tmp ./python-conf tmp cat >>tmp/conf/httpd.conf <<EOF - -<Location /> SCAContribution `pwd`/ SCAComposite domain-test.composite -</Location> EOF -apachectl -k start -d `pwd`/tmp +../http/httpd-start tmp sleep 2 # Test HTTP GET @@ -71,7 +68,7 @@ if [ "$rc" = "0" ]; then fi # Cleanup -apachectl -k stop -d `pwd`/tmp +../http/httpd-stop tmp sleep 2 if [ "$rc" = "0" ]; then echo "OK" |