History

GSF.Core: Migrated some threading code from openHistorian

StevenChisholm committed 12 years ago

Commit aeab67f1 parent 327ad416 files · +899 −0Browse files

Showing the changes to Source/Libraries/GSF.Core/Threading/ThreadContainerThreadpool.cs (1 of 6 files). Show all

Unified · Split

Source/Libraries/GSF.Core/Threading/ThreadContainerThreadpool.cs+102−0
@@ -0,0 +1,102 @@
1//******************************************************************************************************
2// ThreadContainerThreadpool.cs - Gbtc
3//
4// Copyright © 2014, Grid Protection Alliance. All Rights Reserved.
5//
6// Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See
7// the NOTICE file distributed with this work for additional information regarding copyright ownership.
8// The GPA licenses this file to you under the Eclipse Public License -v 1.0 (the "License"); you may
9// not use this file except in compliance with the License. You may obtain a copy of the License at:
10//
11// http://www.opensource.org/licenses/eclipse-1.0.php
12//
13// Unless agreed to in writing, the subject software distributed under the License is distributed on an
14// "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the
15// License for the specific language governing permissions and limitations.
16//
17// Code Modification History:
18// ----------------------------------------------------------------------------------------------------
19// 3/8/2014 - Steven E. Chisholm
20// Generated original version of source code.
21//
22//
23//******************************************************************************************************
24
25using System.Threading;
26
27namespace GSF.Threading
28{
29 internal class ThreadContainerThreadpool
30 : ThreadContainerBase
31 {
32 /// <summary>
33 /// Handle that is created when telling the threadpool to do a delayed start.
34 /// </summary>
35 private volatile RegisteredWaitHandle m_registeredHandle;
36
37 /// <summary>
38 /// The reset event that allows the timer to be short circuited.
39 /// </summary>
40 private ManualResetEvent m_waitObject;
41
42 public ThreadContainerThreadpool(WeakActionFast<CallbackArgs> callback)
43 : base(callback)
44 {
45 m_waitObject = new ManualResetEvent(false);
46 }
47
48 protected override void InternalStart(int delay)
49 {
50 m_waitObject.Reset();
51 m_registeredHandle = ThreadPool.RegisterWaitForSingleObject(m_waitObject, BeginRunOnTimer, null, delay, executeOnlyOnce: true);
52 }
53
54 protected override void InternalStart_FromWorkerThread(int delay)
55 {
56 m_waitObject.Reset();
57 m_registeredHandle = ThreadPool.RegisterWaitForSingleObject(m_waitObject, BeginRunOnTimer, null, delay, executeOnlyOnce: true);
58 }
59
60 private void BeginRunOnTimer(object state, bool isTimeout)
61 {
62 //Wait for this race condition to satisfy
63 while (m_registeredHandle == null)
64 ;
65 m_registeredHandle.Unregister(null);
66 m_registeredHandle = null;
67 OnRunning();
68 }
69
70 protected override void InternalCancelTimer()
71 {
72 m_waitObject.Set();
73 }
74
75 protected override void InternalStart()
76 {
77 ThreadPool.QueueUserWorkItem(BeginRunImmediately);
78 }
79
80 protected override void InternalStart_FromWorkerThread()
81 {
82 ThreadPool.QueueUserWorkItem(BeginRunImmediately);
83 }
84
85 private void BeginRunImmediately(object state)
86 {
87 OnRunning();
88 }
89
90 protected override void InternalDispose_FromWorkerThread()
91 {
92 m_waitObject.Dispose();
93 m_waitObject = null;
94 }
95
96 protected override void InternalDoNothing_FromWorkerThread()
97 {
98
99 }
100
101 }
102}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t