summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/modules/python
diff options
context:
space:
mode:
authorjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2010-02-07 00:36:25 +0000
committerjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2010-02-07 00:36:25 +0000
commitbb4b895471e3165c71bdfd1fdae5e1ffde8f1696 (patch)
tree57bec175bb5dbf43303f7334162b9b2b4bda03c6 /sca-cpp/trunk/modules/python
parent00f9947613624b251551ba709824f97f1b6c2fb1 (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.hpp1
-rw-r--r--sca-cpp/trunk/modules/python/eval.hpp24
-rw-r--r--sca-cpp/trunk/modules/python/mod-python.cpp29
-rw-r--r--sca-cpp/trunk/modules/python/mod-python.hpp4
-rw-r--r--sca-cpp/trunk/modules/python/python-test.cpp2
-rwxr-xr-xsca-cpp/trunk/modules/python/server-test7
-rwxr-xr-xsca-cpp/trunk/modules/python/wiring-test7
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"