From 134f86e8d5c414409631b25b8c6f0ee45fbd8631 Mon Sep 17 00:00:00 2001
From: David Walter Seikel
Date: Thu, 3 Nov 2016 21:44:39 +1000
Subject: Initial update to OpenSim 0.8.2.1 source code.
---
ThirdParty/SmartThreadPool/WorkItemsGroupBase.cs | 471 +++++++++++++++++++++++
1 file changed, 471 insertions(+)
create mode 100644 ThirdParty/SmartThreadPool/WorkItemsGroupBase.cs
(limited to 'ThirdParty/SmartThreadPool/WorkItemsGroupBase.cs')
diff --git a/ThirdParty/SmartThreadPool/WorkItemsGroupBase.cs b/ThirdParty/SmartThreadPool/WorkItemsGroupBase.cs
new file mode 100644
index 0000000..27fae5e
--- /dev/null
+++ b/ThirdParty/SmartThreadPool/WorkItemsGroupBase.cs
@@ -0,0 +1,471 @@
+using System;
+using System.Threading;
+
+namespace Amib.Threading.Internal
+{
+ public abstract class WorkItemsGroupBase : IWorkItemsGroup
+ {
+ #region Private Fields
+
+ ///
+ /// Contains the name of this instance of SmartThreadPool.
+ /// Can be changed by the user.
+ ///
+ private string _name = "WorkItemsGroupBase";
+
+ public WorkItemsGroupBase()
+ {
+ IsIdle = true;
+ }
+
+ #endregion
+
+ #region IWorkItemsGroup Members
+
+ #region Public Methods
+
+ ///
+ /// Get/Set the name of the SmartThreadPool/WorkItemsGroup instance
+ ///
+ public string Name
+ {
+ get { return _name; }
+ set { _name = value; }
+ }
+
+ #endregion
+
+ #region Abstract Methods
+
+ public abstract int Concurrency { get; set; }
+ public abstract int WaitingCallbacks { get; }
+ public abstract object[] GetStates();
+ public abstract WIGStartInfo WIGStartInfo { get; }
+ public abstract void Start();
+ public abstract void Cancel(bool abortExecution);
+ public abstract bool WaitForIdle(int millisecondsTimeout);
+ public abstract event WorkItemsGroupIdleHandler OnIdle;
+
+ internal abstract void Enqueue(WorkItem workItem);
+ internal virtual void PreQueueWorkItem() { }
+
+ #endregion
+
+ #region Common Base Methods
+
+ ///
+ /// Cancel all the work items.
+ /// Same as Cancel(false)
+ ///
+ public virtual void Cancel()
+ {
+ Cancel(false);
+ }
+
+ ///
+ /// Wait for the SmartThreadPool/WorkItemsGroup to be idle
+ ///
+ public void WaitForIdle()
+ {
+ WaitForIdle(Timeout.Infinite);
+ }
+
+ ///
+ /// Wait for the SmartThreadPool/WorkItemsGroup to be idle
+ ///
+ public bool WaitForIdle(TimeSpan timeout)
+ {
+ return WaitForIdle((int)timeout.TotalMilliseconds);
+ }
+
+ ///
+ /// IsIdle is true when there are no work items running or queued.
+ ///
+ public bool IsIdle { get; protected set; }
+
+ #endregion
+
+ #region QueueWorkItem
+
+ ///
+ /// Queue a work item
+ ///
+ /// A callback to execute
+ /// Returns a work item result
+ public IWorkItemResult QueueWorkItem(WorkItemCallback callback)
+ {
+ WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback);
+ Enqueue(workItem);
+ return workItem.GetWorkItemResult();
+ }
+
+ ///
+ /// Queue a work item
+ ///
+ /// A callback to execute
+ /// The priority of the work item
+ /// Returns a work item result
+ public IWorkItemResult QueueWorkItem(WorkItemCallback callback, WorkItemPriority workItemPriority)
+ {
+ PreQueueWorkItem();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, workItemPriority);
+ Enqueue(workItem);
+ return workItem.GetWorkItemResult();
+ }
+
+ ///
+ /// Queue a work item
+ ///
+ /// Work item info
+ /// A callback to execute
+ /// Returns a work item result
+ public IWorkItemResult QueueWorkItem(WorkItemInfo workItemInfo, WorkItemCallback callback)
+ {
+ PreQueueWorkItem();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, workItemInfo, callback);
+ Enqueue(workItem);
+ return workItem.GetWorkItemResult();
+ }
+
+ ///
+ /// Queue a work item
+ ///
+ /// A callback to execute
+ ///
+ /// The context object of the work item. Used for passing arguments to the work item.
+ ///
+ /// Returns a work item result
+ public IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state)
+ {
+ WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state);
+ Enqueue(workItem);
+ return workItem.GetWorkItemResult();
+ }
+
+ ///
+ /// Queue a work item
+ ///
+ /// A callback to execute
+ ///
+ /// The context object of the work item. Used for passing arguments to the work item.
+ ///
+ /// The work item priority
+ /// Returns a work item result
+ public IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state, WorkItemPriority workItemPriority)
+ {
+ PreQueueWorkItem();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state, workItemPriority);
+ Enqueue(workItem);
+ return workItem.GetWorkItemResult();
+ }
+
+ ///
+ /// Queue a work item
+ ///
+ /// Work item information
+ /// A callback to execute
+ ///
+ /// The context object of the work item. Used for passing arguments to the work item.
+ ///
+ /// Returns a work item result
+ public IWorkItemResult QueueWorkItem(WorkItemInfo workItemInfo, WorkItemCallback callback, object state)
+ {
+ PreQueueWorkItem();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, workItemInfo, callback, state);
+ Enqueue(workItem);
+ return workItem.GetWorkItemResult();
+ }
+
+ ///
+ /// Queue a work item
+ ///
+ /// A callback to execute
+ ///
+ /// The context object of the work item. Used for passing arguments to the work item.
+ ///
+ ///
+ /// A delegate to call after the callback completion
+ ///
+ /// Returns a work item result
+ public IWorkItemResult QueueWorkItem(
+ WorkItemCallback callback,
+ object state,
+ PostExecuteWorkItemCallback postExecuteWorkItemCallback)
+ {
+ PreQueueWorkItem();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state, postExecuteWorkItemCallback);
+ Enqueue(workItem);
+ return workItem.GetWorkItemResult();
+ }
+
+ ///
+ /// Queue a work item
+ ///
+ /// A callback to execute
+ ///
+ /// The context object of the work item. Used for passing arguments to the work item.
+ ///
+ ///
+ /// A delegate to call after the callback completion
+ ///
+ /// The work item priority
+ /// Returns a work item result
+ public IWorkItemResult QueueWorkItem(
+ WorkItemCallback callback,
+ object state,
+ PostExecuteWorkItemCallback postExecuteWorkItemCallback,
+ WorkItemPriority workItemPriority)
+ {
+ PreQueueWorkItem();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state, postExecuteWorkItemCallback, workItemPriority);
+ Enqueue(workItem);
+ return workItem.GetWorkItemResult();
+ }
+
+ ///
+ /// Queue a work item
+ ///
+ /// A callback to execute
+ ///
+ /// The context object of the work item. Used for passing arguments to the work item.
+ ///
+ ///
+ /// A delegate to call after the callback completion
+ ///
+ /// Indicates on which cases to call to the post execute callback
+ /// Returns a work item result
+ public IWorkItemResult QueueWorkItem(
+ WorkItemCallback callback,
+ object state,
+ PostExecuteWorkItemCallback postExecuteWorkItemCallback,
+ CallToPostExecute callToPostExecute)
+ {
+ PreQueueWorkItem();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state, postExecuteWorkItemCallback, callToPostExecute);
+ Enqueue(workItem);
+ return workItem.GetWorkItemResult();
+ }
+
+ ///
+ /// Queue a work item
+ ///
+ /// A callback to execute
+ ///
+ /// The context object of the work item. Used for passing arguments to the work item.
+ ///
+ ///
+ /// A delegate to call after the callback completion
+ ///
+ /// Indicates on which cases to call to the post execute callback
+ /// The work item priority
+ /// Returns a work item result
+ public IWorkItemResult QueueWorkItem(
+ WorkItemCallback callback,
+ object state,
+ PostExecuteWorkItemCallback postExecuteWorkItemCallback,
+ CallToPostExecute callToPostExecute,
+ WorkItemPriority workItemPriority)
+ {
+ PreQueueWorkItem();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state, postExecuteWorkItemCallback, callToPostExecute, workItemPriority);
+ Enqueue(workItem);
+ return workItem.GetWorkItemResult();
+ }
+
+ #endregion
+
+ #region QueueWorkItem(Action<...>)
+
+ public IWorkItemResult QueueWorkItem(Action action)
+ {
+ return QueueWorkItem (action, SmartThreadPool.DefaultWorkItemPriority);
+ }
+
+ public IWorkItemResult QueueWorkItem (Action action, WorkItemPriority priority)
+ {
+ PreQueueWorkItem ();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem (
+ this,
+ WIGStartInfo,
+ delegate
+ {
+ action.Invoke ();
+ return null;
+ }, priority);
+ Enqueue (workItem);
+ return workItem.GetWorkItemResult ();
+ }
+
+ public IWorkItemResult QueueWorkItem(Action action, T arg)
+ {
+ return QueueWorkItem (action, arg, SmartThreadPool.DefaultWorkItemPriority);
+ }
+
+ public IWorkItemResult QueueWorkItem (Action action, T arg, WorkItemPriority priority)
+ {
+ PreQueueWorkItem ();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem (
+ this,
+ WIGStartInfo,
+ state =>
+ {
+ action.Invoke (arg);
+ return null;
+ },
+ WIGStartInfo.FillStateWithArgs ? new object[] { arg } : null, priority);
+ Enqueue (workItem);
+ return workItem.GetWorkItemResult ();
+ }
+
+ public IWorkItemResult QueueWorkItem(Action action, T1 arg1, T2 arg2)
+ {
+ return QueueWorkItem (action, arg1, arg2, SmartThreadPool.DefaultWorkItemPriority);
+ }
+
+ public IWorkItemResult QueueWorkItem (Action action, T1 arg1, T2 arg2, WorkItemPriority priority)
+ {
+ PreQueueWorkItem ();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem (
+ this,
+ WIGStartInfo,
+ state =>
+ {
+ action.Invoke (arg1, arg2);
+ return null;
+ },
+ WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2 } : null, priority);
+ Enqueue (workItem);
+ return workItem.GetWorkItemResult ();
+ }
+
+ public IWorkItemResult QueueWorkItem(Action action, T1 arg1, T2 arg2, T3 arg3)
+ {
+ return QueueWorkItem (action, arg1, arg2, arg3, SmartThreadPool.DefaultWorkItemPriority);
+ ;
+ }
+
+ public IWorkItemResult QueueWorkItem (Action action, T1 arg1, T2 arg2, T3 arg3, WorkItemPriority priority)
+ {
+ PreQueueWorkItem ();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem (
+ this,
+ WIGStartInfo,
+ state =>
+ {
+ action.Invoke (arg1, arg2, arg3);
+ return null;
+ },
+ WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2, arg3 } : null, priority);
+ Enqueue (workItem);
+ return workItem.GetWorkItemResult ();
+ }
+
+ public IWorkItemResult QueueWorkItem(
+ Action action, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
+ {
+ return QueueWorkItem (action, arg1, arg2, arg3, arg4,
+ SmartThreadPool.DefaultWorkItemPriority);
+ }
+
+ public IWorkItemResult QueueWorkItem (
+ Action action, T1 arg1, T2 arg2, T3 arg3, T4 arg4, WorkItemPriority priority)
+ {
+ PreQueueWorkItem ();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem (
+ this,
+ WIGStartInfo,
+ state =>
+ {
+ action.Invoke (arg1, arg2, arg3, arg4);
+ return null;
+ },
+ WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2, arg3, arg4 } : null, priority);
+ Enqueue (workItem);
+ return workItem.GetWorkItemResult ();
+ }
+
+ #endregion
+
+ #region QueueWorkItem(Func<...>)
+
+ public IWorkItemResult QueueWorkItem(Func func)
+ {
+ PreQueueWorkItem();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem(
+ this,
+ WIGStartInfo,
+ state =>
+ {
+ return func.Invoke();
+ });
+ Enqueue(workItem);
+ return new WorkItemResultTWrapper(workItem.GetWorkItemResult());
+ }
+
+ public IWorkItemResult QueueWorkItem(Func func, T arg)
+ {
+ PreQueueWorkItem();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem(
+ this,
+ WIGStartInfo,
+ state =>
+ {
+ return func.Invoke(arg);
+ },
+ WIGStartInfo.FillStateWithArgs ? new object[] { arg } : null);
+ Enqueue(workItem);
+ return new WorkItemResultTWrapper(workItem.GetWorkItemResult());
+ }
+
+ public IWorkItemResult QueueWorkItem(Func func, T1 arg1, T2 arg2)
+ {
+ PreQueueWorkItem();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem(
+ this,
+ WIGStartInfo,
+ state =>
+ {
+ return func.Invoke(arg1, arg2);
+ },
+ WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2 } : null);
+ Enqueue(workItem);
+ return new WorkItemResultTWrapper(workItem.GetWorkItemResult());
+ }
+
+ public IWorkItemResult QueueWorkItem(
+ Func func, T1 arg1, T2 arg2, T3 arg3)
+ {
+ PreQueueWorkItem();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem(
+ this,
+ WIGStartInfo,
+ state =>
+ {
+ return func.Invoke(arg1, arg2, arg3);
+ },
+ WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2, arg3 } : null);
+ Enqueue(workItem);
+ return new WorkItemResultTWrapper(workItem.GetWorkItemResult());
+ }
+
+ public IWorkItemResult QueueWorkItem(
+ Func func, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
+ {
+ PreQueueWorkItem();
+ WorkItem workItem = WorkItemFactory.CreateWorkItem(
+ this,
+ WIGStartInfo,
+ state =>
+ {
+ return func.Invoke(arg1, arg2, arg3, arg4);
+ },
+ WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2, arg3, arg4 } : null);
+ Enqueue(workItem);
+ return new WorkItemResultTWrapper(workItem.GetWorkItemResult());
+ }
+
+ #endregion
+
+ #endregion
+ }
+}
\ No newline at end of file
--
cgit v1.1