diff --git a/BulletSharp/LinearMath/Threads.cs b/BulletSharp/LinearMath/Threads.cs index a733a653d..8c3de85e0 100644 --- a/BulletSharp/LinearMath/Threads.cs +++ b/BulletSharp/LinearMath/Threads.cs @@ -56,6 +56,33 @@ internal TaskSchedulerPpl(IntPtr native) } } + /// + /// Default task sheduler not get but created, so mast be disposable + /// + public sealed class TaskSchedulerDefault : TaskScheduler, System.IDisposable + { + internal TaskSchedulerDefault(IntPtr native) + : base(native) + { + } + + ~TaskSchedulerDefault() + { + DestroyNativeObject(); + } + private void DestroyNativeObject() + { + if (Native != IntPtr.Zero) + btThreads_DestroyDefaultTaskScheduler(Native); + } + + void IDisposable.Dispose() + { + DestroyNativeObject(); + GC.SuppressFinalize(this); + } + } + public class Threads { private static TaskSchedulerOpenMP _taskSchedulerOpenMP; @@ -122,5 +149,14 @@ public static TaskSchedulerTbb GetTbbTaskScheduler() } return _taskSchedulerTbb; } + + public static TaskSchedulerDefault CreateDefaultTaskSheduler() + { + IntPtr native = btThreads_CreateGetDefaultTaskScheduler(); + if (native != IntPtr.Zero) + return new TaskSchedulerDefault(native); + return null; + } + } } diff --git a/BulletSharp/UnsafeNativeMethods.cs b/BulletSharp/UnsafeNativeMethods.cs index bd91ccd8c..a97cabb51 100644 --- a/BulletSharp/UnsafeNativeMethods.cs +++ b/BulletSharp/UnsafeNativeMethods.cs @@ -6601,7 +6601,14 @@ public static extern IntPtr btSerializerWrapper_new(IntPtr allocateCallback, Int [DllImport(Native.Dll, CallingConvention = Native.Conv)] public static extern void btTetrahedronShapeEx_setVertices(IntPtr obj, [In] ref Vector3 v0, [In] ref Vector3 v1, [In] ref Vector3 v2, [In] ref Vector3 v3); - [DllImport(Native.Dll, CallingConvention = Native.Conv)] + + [DllImport(Native.Dll, CallingConvention = Native.Conv)] + public static extern IntPtr btThreads_CreateGetDefaultTaskScheduler(); + + [DllImport(Native.Dll, CallingConvention = Native.Conv)] + public static extern void btThreads_DestroyDefaultTaskScheduler(IntPtr taskScheduler); + + [DllImport(Native.Dll, CallingConvention = Native.Conv)] public static extern IntPtr btThreads_btGetOpenMPTaskScheduler(); [DllImport(Native.Dll, CallingConvention = Native.Conv)] public static extern IntPtr btThreads_btGetPPLTaskScheduler(); diff --git a/libbulletc/src/btThreads_wrap.cpp b/libbulletc/src/btThreads_wrap.cpp index ef5c325d8..39a4d6d6d 100644 --- a/libbulletc/src/btThreads_wrap.cpp +++ b/libbulletc/src/btThreads_wrap.cpp @@ -22,6 +22,15 @@ void btITaskScheduler_setNumThreads(btITaskScheduler* obj, int numThreads) obj->setNumThreads(numThreads); } + +btITaskScheduler* btThreads_CreateGetDefaultTaskScheduler() +{ + return btCreateDefaultTaskScheduler(); +} +void btThreads_DestroyDefaultTaskScheduler(btITaskScheduler* obj) +{ + delete obj; +} btITaskScheduler* btThreads_btGetSequentialTaskScheduler() { return btGetSequentialTaskScheduler(); diff --git a/libbulletc/src/btThreads_wrap.h b/libbulletc/src/btThreads_wrap.h index 0a8ce4c87..3f9d13db2 100644 --- a/libbulletc/src/btThreads_wrap.h +++ b/libbulletc/src/btThreads_wrap.h @@ -8,6 +8,9 @@ extern "C" { EXPORT int btITaskScheduler_getNumThreads(btITaskScheduler* obj); EXPORT void btITaskScheduler_setNumThreads(btITaskScheduler* obj, int numThreads); + EXPORT btITaskScheduler* btThreads_CreateGetDefaultTaskScheduler(); + EXPORT void btThreads_DestroyDefaultTaskScheduler(btITaskScheduler* ts); + EXPORT btITaskScheduler* btThreads_btGetSequentialTaskScheduler(); EXPORT btITaskScheduler* btThreads_btGetOpenMPTaskScheduler(); EXPORT btITaskScheduler* btThreads_btGetPPLTaskScheduler();