/// <summary>
 /// This is called from within simulate but outside the locked portion
 /// We need to do our own locking here
 /// Essentially, we need to remove the prim from our space segment, whatever segment it's in.
 ///
 /// If there are no more prim in the segment, we need to empty (spacedestroy)the segment and reclaim memory
 /// that the space was using.
 /// </summary>
 /// <param name="prim"></param>
 public void RemovePrimThreadLocked(AuroraPhysXPrim prim)
 {
     //Console.WriteLine("RemovePrimThreadLocked " +  prim.m_primName);
     lock (prim)
     {
         remCollisionEventReporting(prim);
         remActivePrim(prim);
         lock (ode)
         {
             prim.m_frozen = true;
             if (prim.prim_geom != IntPtr.Zero)
             {
                 prim.DestroyBody();
                 prim.IsPhysical = false;
                 prim.m_targetSpace = IntPtr.Zero;
                 try
                 {
                     if (prim.prim_geom != IntPtr.Zero)
                     {
                         d.GeomDestroy(prim.prim_geom);
                         prim.prim_geom = IntPtr.Zero;
                     }
                     else
                     {
                         m_log.Warn("[PHYSICS]: Unable to remove prim from physics scene");
                     }
                 }
                 catch (AccessViolationException)
                 {
                     m_log.Info("[PHYSICS]: Couldn't remove prim from physics scene, it was already be removed.");
                 }
             }
             if (!prim.childPrim)
             {
                 lock (prim.childrenPrim)
                 {
                     foreach (AuroraPhysXPrim prm in prim.childrenPrim)
                     {
                         RemovePrimThreadLocked (prm);
                     }
                 }
             }
             lock (_prims)
                 _prims.Remove (prim);
         }
     }
 }