Author: ArcRiley
Date: 2008-02-17 15:02:17 -0500 (Sun, 17 Feb 2008)
New Revision: 929

Modified:
   trunk/pysoy/src/_core/_coreLoop.pxi
   trunk/pysoy/src/bodies._bodies/Body.pxi
   trunk/pysoy/src/scenes/Scene.pxi
   trunk/pysoy/src/scenes/soy.scenes.pxd
   trunk/pysoy/src/scenes/soy.scenes.pyx
Log:
#901 : trying new Scene._stepLock() mutex system


Modified: trunk/pysoy/src/_core/_coreLoop.pxi
===================================================================
--- trunk/pysoy/src/_core/_coreLoop.pxi 2008-02-17 18:42:43 UTC (rev 928)
+++ trunk/pysoy/src/_core/_coreLoop.pxi 2008-02-17 20:02:17 UTC (rev 929)
@@ -67,6 +67,7 @@
       _step = _scene._steps()
       if _step > _maxstep :
         _maxstep = _step
+      _scene._stepLock()
       for j from 0 <= j < _step :
         _scene._updateTime()
         _givefields._foreach(_prerunField, NULL)
@@ -76,6 +77,7 @@
         ode.dJointGroupEmpty(_contactgroup)
         if j != 0 :
           _callfields._foreach(_runField, NULL)
+      _scene._stepUnLock()
       _scene._bodies.unlock()
     _scenes.unlock()
     if _maxstep == 0 :

Modified: trunk/pysoy/src/bodies._bodies/Body.pxi
===================================================================
--- trunk/pysoy/src/bodies._bodies/Body.pxi     2008-02-17 18:42:43 UTC (rev 
928)
+++ trunk/pysoy/src/bodies._bodies/Body.pxi     2008-02-17 20:02:17 UTC (rev 
929)
@@ -168,7 +168,9 @@
     def __get__(self) :
       cdef ode.dVector3 xyz
       if self._bodyID :
+        self._scene._stepLock()
         ode.dBodyCopyPosition(self._bodyID, xyz)
+        self._scene._stepUnLock()
         return (xyz[0], xyz[1], xyz[2])
       else :
         return (self._position[0], self._position[1], self._position[2])
@@ -178,7 +180,9 @@
       if len(value)!=3 :
         raise TypeError('Must provide (x,y,z)')
       if self._bodyID :
+        self._scene._stepLock()
         ode.dBodySetPosition(self._bodyID, value[0], value[1], value[2])
+        self._scene._stepUnLock()
       else :
         self._position[0] = value[0]
         self._position[1] = value[1]
@@ -194,7 +198,9 @@
     def __get__(self) :
       cdef ode.dReal *real
       if self._bodyID :
+        self._scene._stepLock()
         real = <ode.dReal *> ode.dBodyGetAngularVel(self._bodyID)
+        self._scene._stepUnLock()
         return (real[0], real[1], real[2])
       else :
         return (self._angularVel[0], self._angularVel[1], self._angularVel[2])
@@ -204,7 +210,9 @@
       if len(value)!=3 :
         raise TypeError('Must provide (x,y,z)')
       if self._bodyID :
+        self._scene._stepLock()
         ode.dBodySetAngularVel(self._bodyID, value[0], value[1], value[2])
+        self._scene._stepUnLock()
       else :
         self._angularVel[0] = value[0]
         self._angularVel[1] = value[1]
@@ -220,7 +228,9 @@
     def __get__(self) :
       cdef ode.dReal *real
       if self._bodyID :
+        self._scene._stepLock()
         real = <ode.dReal *> ode.dBodyGetLinearVel(self._bodyID)
+        self._scene._stepUnLock()
         return (real[0], real[1], real[2])
       else :
         return (self._linearVel[0], self._linearVel[1], self._linearVel[2])
@@ -230,9 +240,9 @@
       if len(value)!=3 :
         raise TypeError('Must provide (x,y,z)')
       if self._bodyID :
-        self._scene._bodies.lock()
+        self._scene._stepLock()
         ode.dBodySetLinearVel(self._bodyID, value[0], value[1], value[2])
-        self._scene._bodies.unlock()
+        self._scene._stepUnLock()
       else :
         self._linearVel[0] = value[0]
         self._linearVel[1] = value[1]

Modified: trunk/pysoy/src/scenes/Scene.pxi
===================================================================
--- trunk/pysoy/src/scenes/Scene.pxi    2008-02-17 18:42:43 UTC (rev 928)
+++ trunk/pysoy/src/scenes/Scene.pxi    2008-02-17 20:02:17 UTC (rev 929)
@@ -28,15 +28,16 @@
   '''
 
   def __cinit__(self, *args, **kw) :
-    global _scenes
-    self._bodies   = soy._internals.Children()
-    self._joints   = soy._internals.Children()
-    self._lights   = soy._internals.Children()
-    self._worldID  = ode.dWorldCreate()
-    self._spaceID  = ode.dSimpleSpaceCreate(NULL)
-    self._stepSize = 0.01
-    self._prevTime = _time()
-    self._ambient  = soy.colors.gray
+    from soy.colors import gray
+    self._worldID   = ode.dWorldCreate()
+    self._spaceID   = ode.dSimpleSpaceCreate(NULL)
+    self._bodies    = soy._internals.Children()
+    self._joints    = soy._internals.Children()
+    self._lights    = soy._internals.Children()
+    self._ambient   = gray
+    self._stepSize  = 0.01
+    self._prevTime  = _time()
+    self._stepMutex = py.PyThread_allocate_lock()
     _scenes.lock()
     _scenes.append(<void *>self)
     _scenes.unlock()
@@ -109,7 +110,16 @@
     self._prevTime = self._prevTime + (_step * self._stepSize)
     return _step
     
+  cdef void _stepLock(self) :
+    py.PyThread_acquire_lock(self._stepMutex,1)
 
+  cdef int _stepTryLock(self) :
+    return py.PyThread_acquire_lock(self._stepMutex,0)
+
+  cdef void _stepUnLock(self) :
+    py.PyThread_release_lock(self._stepMutex)
+
+
   property gravity :
     '''Scene gravity
 

Modified: trunk/pysoy/src/scenes/soy.scenes.pxd
===================================================================
--- trunk/pysoy/src/scenes/soy.scenes.pxd       2008-02-17 18:42:43 UTC (rev 
928)
+++ trunk/pysoy/src/scenes/soy.scenes.pxd       2008-02-17 20:02:17 UTC (rev 
929)
@@ -23,7 +23,6 @@
 cimport py
 cimport stdio
 cimport soy._internals
-cimport soy.colors
 
 cdef void*  _getScenes ( )
 
@@ -33,11 +32,15 @@
   cdef soy._internals.Children  _bodies
   cdef soy._internals.Children  _joints
   cdef soy._internals.Children  _lights
-  cdef soy.colors.Color         _ambient
+  cdef object                   _ambient
+  cdef void*                    _stepMutex
+  cdef void                     _stepLock       ( self )
+  cdef int                      _stepTryLock    ( self )
+  cdef void                     _stepUnLock     ( self )
   cdef ode.dReal                _stepSize
   cdef double                   _prevTime
   cdef double                   _time
   # _coreloop methods
-  cdef void                     _coreRender(self)
-  cdef int                      _steps(self)
-  cdef void                     _updateTime(self)
+  cdef void                     _coreRender     ( self )
+  cdef int                      _steps          ( self )
+  cdef void                     _updateTime     ( self )

Modified: trunk/pysoy/src/scenes/soy.scenes.pyx
===================================================================
--- trunk/pysoy/src/scenes/soy.scenes.pyx       2008-02-17 18:42:43 UTC (rev 
928)
+++ trunk/pysoy/src/scenes/soy.scenes.pyx       2008-02-17 20:02:17 UTC (rev 
929)
@@ -32,8 +32,7 @@
 cimport soy.joints
 cimport soy.bodies.fields
 cimport soy.bodies._bodies
-import  soy.colors
+cimport soy.colors
 
 include "_getScenes.pxi"
-
 include "Scene.pxi"

_______________________________________________
PySoy-SVN mailing list
PySoy-SVN@pysoy.org
http://www.pysoy.org/mailman/listinfo/pysoy-svn

Reply via email to