You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

131 lines
4.6 KiB

VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'False
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
END
Attribute VB_Name = "Pool"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Attribute VB_Description = "APE Pool Manager"
Option Explicit
Implements APEInterfaces.IPool
'Private variable to hold the WorkerID of the Worker which was
'passed to a client
Private mlWorkerID As Long
'A count of references is kept to keep track of
'how many references to this same worker it has.
'When the count is 0, moWorker is added back into
'the global collection and set to nothing.
Private mlReferenceCount As Long
Public Function IPool_GetWorker() As APEInterfaces.IWorker
Attribute IPool_GetWorker.VB_Description = "Returns a AEWorker.Worker object and reserves it for the calling applications use."
'A client uses this method to get a reference to a worker
'Find a worker that is not busy (passed to another client).
'Mark the Worker as busy
'Store the WorkerID in the Private Class Module level
'mlWorkerID
Dim oWork As clsWorker
Dim bFoundWorker As Boolean
On Error GoTo GetWorkerError
LogEvent giGET_WORKER
'If mlWorkerID does not equal zero then the client
'that has reference to this instance of this class
'already has a worker. Therefore just pass a reference
'to the same worker.
If mlWorkerID <> 0 Then
mlReferenceCount = mlReferenceCount + 1
Set IPool_GetWorker = gcWorkers.Item(CStr(mlWorkerID)).Worker
glRequestsSatisfied = glRequestsSatisfied + 1
If gbShow Then
With frmPoolMgr.lblSatisfied
.Caption = CStr(glRequestsSatisfied)
.Refresh
End With
End If
Else
'The client does not have any other references to a Worker
'Find a worker that does not have any connections made
'by other clients
bFoundWorker = False
For Each oWork In gcWorkers
If Not oWork.Busy Then
oWork.Busy = True
mlWorkerID = oWork.ID
mlReferenceCount = mlReferenceCount + 1
bFoundWorker = True
Set IPool_GetWorker = oWork.Worker
'Update statistics
glRequestsSatisfied = glRequestsSatisfied + 1
If gbShow Then
With frmPoolMgr.lblSatisfied
.Caption = CStr(glRequestsSatisfied)
.Refresh
End With
End If
Exit For
End If
Next oWork
If Not bFoundWorker Then
'All workers are being used by other clients
'set function equal to nothing
Set IPool_GetWorker = Nothing
glRequestsRejected = glRequestsRejected + 1
If gbShow Then
With frmPoolMgr.lblRejected
.Caption = CStr(glRequestsRejected)
.Refresh
End With
End If
End If
End If
Exit Function
GetWorkerError:
Select Case Err.Number
Case ERR_OVER_FLOW
LogError Err
If glRequestsSatisfied = glMAX_LONG Then glRequestsSatisfied = 0
If glRequestsRejected = glMAX_LONG Then glRequestsRejected = 0
Resume Next
Case Else
LogError Err
Err.Raise Err.Number, Err.Source, Err.Description
End Select
End Function
Public Sub IPool_ReleaseWorker()
Attribute IPool_ReleaseWorker.VB_Description = "Notifies the AEPoolMgr that an AEWorker.Worker object received by GetWorker is no longer referenced by the calling application."
'Called by a client when it destroys a reference to
'a worker that it received by calling GetWorker
'Check to see if the client has another reference to
'the worker. If it does not, mark the worker that was passed
'to the client as not busy and set mlWorkerID = to 0.
LogEvent giRELEASE_WORKER
'If ReferenceCount is zero then this method is being called without
'having an unreleased reference to the worker
If mlReferenceCount = 0 Then Exit Sub
mlReferenceCount = mlReferenceCount - 1
'If ReferenceCount = 0 now then client has released
'its only reference to a worker
If mlReferenceCount = 0 Then
gcWorkers.Item(CStr(mlWorkerID)).Busy = False
mlWorkerID = 0
End If
End Sub
Private Sub Class_Initialize()
CountInitialize
End Sub
Private Sub Class_Terminate()
CountTerminate
End Sub