Revision: 694
http://rpy.svn.sourceforge.net/rpy/?rev=694&view=rev
Author: lgautier
Date: 2008-11-12 21:07:28 +0000 (Wed, 12 Nov 2008)
Log Message:
-----------
- version number: 2.1.0dev for the trunk
- added setlock and freelock when entering R level (to prepare for experiments
with multithreading)
Modified Paths:
--------------
rpy2/trunk/NEWS
rpy2/trunk/rpy/__init__.py
rpy2/trunk/rpy/rinterface/rinterface.c
rpy2/trunk/setup.py
Modified: rpy2/trunk/NEWS
===================================================================
--- rpy2/trunk/NEWS 2008-11-12 21:02:05 UTC (rev 693)
+++ rpy2/trunk/NEWS 2008-11-12 21:07:28 UTC (rev 694)
@@ -1,6 +1,12 @@
SVN
===
+
+
+
+Release 2.0.0
+=============
+
Bugs fixed
----------
Modified: rpy2/trunk/rpy/__init__.py
===================================================================
--- rpy2/trunk/rpy/__init__.py 2008-11-12 21:02:05 UTC (rev 693)
+++ rpy2/trunk/rpy/__init__.py 2008-11-12 21:07:28 UTC (rev 694)
@@ -1 +1 @@
-__version__ = '2.0.0b1'
+__version__ = '2.1.0dev'
Modified: rpy2/trunk/rpy/rinterface/rinterface.c
===================================================================
--- rpy2/trunk/rpy/rinterface/rinterface.c 2008-11-12 21:02:05 UTC (rev
693)
+++ rpy2/trunk/rpy/rinterface/rinterface.c 2008-11-12 21:07:28 UTC (rev
694)
@@ -1398,6 +1398,12 @@
/* len(x) */
static Py_ssize_t VectorSexp_len(PyObject *object)
{
+ if (embeddedR_status & RPY_R_BUSY) {
+ PyErr_Format(PyExc_RuntimeError, "Concurrent access to R is not allowed.");
+ return -1;
+ }
+ embeddedR_setlock();
+
Py_ssize_t len;
//FIXME: sanity checks.
SEXP sexp = RPY_SEXP((PySexpObject *)object);
@@ -1406,6 +1412,8 @@
return -1;
}
len = (Py_ssize_t)GET_LENGTH(sexp);
+
+ embeddedR_freelock();
return len;
}
@@ -1415,10 +1423,17 @@
{
PyObject* res;
R_len_t i_R, len_R;
+
+ if (embeddedR_status & RPY_R_BUSY) {
+ PyErr_Format(PyExc_RuntimeError, "Concurrent access to R is not allowed.");
+ return NULL;
+ }
+ embeddedR_setlock();
SEXP *sexp = &(RPY_SEXP((PySexpObject *)object));
if (! sexp) {
PyErr_Format(PyExc_ValueError, "NULL SEXP.");
+ embeddedR_freelock();
return NULL;
}
@@ -1426,6 +1441,7 @@
* than R for indexing. */
if (i >= R_LEN_T_MAX) {
PyErr_Format(PyExc_IndexError, "Index value exceeds what R can handle.");
+ embeddedR_freelock();
res = NULL;
return res;
}
@@ -1440,6 +1456,7 @@
PyErr_Format(PyExc_IndexError,
"Mysterious error: likely an integer overflow.");
res = NULL;
+ embeddedR_freelock();
return res;
}
if ((i >= GET_LENGTH(*sexp))) {
@@ -1497,6 +1514,7 @@
break;
}
}
+ embeddedR_freelock();
return res;
}
@@ -1694,17 +1712,25 @@
return -1;
}
+ if (embeddedR_status & RPY_R_BUSY) {
+ PyErr_Format(PyExc_RuntimeError, "Concurrent access to R is not allowed.");
+ return -1;
+ }
+ embeddedR_setlock();
+
if (PyObject_IsInstance(object,
(PyObject*)&VectorSexp_Type)) {
//call parent's constructor
if (Sexp_init(self, args, NULL) == -1) {
//PyErr_Format(PyExc_RuntimeError, "Error initializing instance.");
+ embeddedR_freelock();
return -1;
}
} else if (PySequence_Check(object)) {
if ((sexptype < 0) || (sexptype > maxValidSexpType) ||
(! validSexpType[sexptype])) {
PyErr_Format(PyExc_ValueError, "Invalid SEXP type.");
+ embeddedR_freelock();
return -1;
}
//FIXME: implemement automagic type ?
@@ -1717,13 +1743,15 @@
//SET_NAMED(RPY_SEXP((PySexpObject *)self), 2);
} else {
PyErr_Format(PyExc_ValueError, "Invalid sexpvector.");
+ embeddedR_freelock();
return -1;
}
#ifdef RPY_VERBOSE
printf("done (VectorSexp_init).\n");
#endif
-
+
+ embeddedR_freelock();
return 0;
}
@@ -1747,10 +1775,17 @@
return NULL;
}
+ if (embeddedR_status & RPY_R_BUSY) {
+ PyErr_Format(PyExc_RuntimeError, "Concurrent access to R is not allowed.");
+ return NULL;
+ }
+ embeddedR_setlock();
+
const SEXP rho_R = RPY_SEXP((PySexpObject *)self);
if (! rho_R) {
PyErr_Format(PyExc_ValueError, "NULL SEXP.");
Py_DECREF(Py_False);
+ embeddedR_freelock();
return NULL;
}
@@ -1772,6 +1807,7 @@
res = NULL;
}
Py_DECREF(Py_False);
+ embeddedR_freelock();
return (PyObject *)res;
}
PyDoc_STRVAR(EnvironmentSexp_findVar_doc,
@@ -1792,6 +1828,13 @@
}
SEXP res_R = NULL;
PySexpObject *res;
+
+ if (embeddedR_status & RPY_R_BUSY) {
+ PyErr_Format(PyExc_RuntimeError, "Concurrent access to R is not allowed.");
+ return NULL;
+ }
+ embeddedR_setlock();
+
res_R = FRAME(RPY_SEXP((PySexpObject *)self));
res = newPySexpObject(res_R);
return (PyObject *)res;
@@ -1807,10 +1850,17 @@
"R must be initialized before environments can be accessed.");
return NULL;
}
+ if (embeddedR_status & RPY_R_BUSY) {
+ PyErr_Format(PyExc_RuntimeError, "Concurrent access to R is not allowed.");
+ return NULL;
+ }
+ embeddedR_setlock();
+
SEXP res_R = NULL;
PySexpObject *res;
res_R = ENCLOS(RPY_SEXP((PySexpObject *)self));
res = newPySexpObject(res_R);
+ embeddedR_freelock();
return (PyObject *)res;
}
PyDoc_STRVAR(EnvironmentSexp_enclos_doc,
@@ -1839,18 +1889,27 @@
}
name = PyString_AsString(key);
-
+
+ if (embeddedR_status & RPY_R_BUSY) {
+ PyErr_Format(PyExc_RuntimeError, "Concurrent access to R is not allowed.");
+ return NULL;
+ }
+ embeddedR_setlock();
+
SEXP rho_R = RPY_SEXP((PySexpObject *)self);
if (! rho_R) {
PyErr_Format(PyExc_ValueError, "NULL SEXP.");
+ embeddedR_freelock();
return NULL;
}
res_R = findVarInFrame(rho_R, install(name));
if (res_R != R_UnboundValue) {
+ embeddedR_freelock();
return newPySexpObject(res_R);
}
PyErr_Format(PyExc_LookupError, "'%s' not found", name);
+ embeddedR_freelock();
return NULL;
}
@@ -1874,10 +1933,17 @@
}
name = PyString_AsString(key);
-
+
+ if (embeddedR_status & RPY_R_BUSY) {
+ PyErr_Format(PyExc_RuntimeError, "Concurrent access to R is not allowed.");
+ return -1;
+ }
+ embeddedR_setlock();
+
SEXP rho_R = RPY_SEXP((PySexpObject *)self);
if (! rho_R) {
PyErr_Format(PyExc_ValueError, "The environment has NULL SEXP.");
+ embeddedR_freelock();
return -1;
}
@@ -1885,26 +1951,36 @@
SEXP sexp = RPY_SEXP((PySexpObject *)value);
if (! sexp) {
PyErr_Format(PyExc_ValueError, "The value has NULL SEXP.");
+ embeddedR_freelock();
return -1;
}
SEXP sym = Rf_install(name);
PROTECT(sexp_copy = Rf_duplicate(sexp));
Rf_defineVar(sym, sexp_copy, rho_R);
UNPROTECT(1);
+ embeddedR_freelock();
return 0;
}
static Py_ssize_t EnvironmentSexp_length(PyObject *self)
{
+ if (embeddedR_status & RPY_R_BUSY) {
+ PyErr_Format(PyExc_RuntimeError, "Concurrent access to R is not allowed.");
+ return -1;
+ }
+ embeddedR_setlock();
+
SEXP rho_R = RPY_SEXP((PySexpObject *)self);
if (! rho_R) {
PyErr_Format(PyExc_ValueError, "The environment has NULL SEXP.");
+ embeddedR_freelock();
return -1;
}
SEXP symbols;
PROTECT(symbols = R_lsInternal(rho_R, TRUE));
Py_ssize_t len = (Py_ssize_t)GET_LENGTH(symbols);
UNPROTECT(1);
+ embeddedR_freelock();
return len;
}
@@ -1917,10 +1993,17 @@
static PyObject*
EnvironmentSexp_iter(PyObject *sexpEnvironment)
{
+ if (embeddedR_status & RPY_R_BUSY) {
+ PyErr_Format(PyExc_RuntimeError, "Concurrent access to R is not allowed.");
+ return NULL;
+ }
+ embeddedR_setlock();
+
SEXP rho_R = RPY_SEXP((PySexpObject *)sexpEnvironment);
if (! rho_R) {
PyErr_Format(PyExc_ValueError, "The environment has NULL SEXP.");
+ embeddedR_freelock();
return NULL;
}
SEXP symbols;
@@ -1931,6 +2014,7 @@
PyObject *it = PyObject_GetIter((PyObject *)seq);
Py_DECREF(seq);
+ embeddedR_freelock();
return it;
}
@@ -2015,17 +2099,27 @@
&PyBool_Type, ©)) {
return -1;
}
+
+ if (embeddedR_status & RPY_R_BUSY) {
+ PyErr_Format(PyExc_RuntimeError, "Concurrent access to R is not allowed.");
+ return -1;
+ }
+ embeddedR_setlock();
+
if (PyObject_IsInstance(object,
(PyObject*)&EnvironmentSexp_Type)) {
//call parent's constructor
if (Sexp_init(self, args, NULL) == -1) {
PyErr_Format(PyExc_RuntimeError, "Error initializing instance.");
+ embeddedR_freelock();
return -1;
}
} else {
PyErr_Format(PyExc_ValueError, "Cannot instantiate from this type.");
+ embeddedR_freelock();
return -1;
}
+ embeddedR_freelock();
return 0;
}
Modified: rpy2/trunk/setup.py
===================================================================
--- rpy2/trunk/setup.py 2008-11-12 21:02:05 UTC (rev 693)
+++ rpy2/trunk/setup.py 2008-11-12 21:07:28 UTC (rev 694)
@@ -4,7 +4,7 @@
pack_name = 'rpy2'
-pack_version = '2.0.0dev'
+pack_version = '2.1.0dev'
RHOMES = os.getenv('RHOMES')
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
rpy-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rpy-list