Singleton: Difference between revisions

203 bytes added ,  11 years ago
m
Line 332:
Quit $$$NULLOREF
}
If pConcurrency = -1 Set pConcurrency = $xecuteXecute("Quit "_..#DEFAULTCONCURRENCY)
// acquire lock for global singleton object
Set lockTO = $ZUtil(115,4), lockOK = 1
If (pConcurrency<4, = 1) || (pConcurrency = 2) || (pConcurrency = 3) {
Lock +^CacheTempUser("Singleton", ..%ClassName(1))#"S":lockTO Set lockOK = $Test
Set lockOK = $Test
} ElseIf pConcurrency = 4 {
Lock +^CacheTempUser("Singleton", ..%ClassName(1)):lockTO Set lockOK = $Test
Set lockOK = $Test
}
If 'lockOK {
Line 380 ⟶ 378:
Method Set() As %Status
{
// check for version change
// serialise local singleton object if changes have occurred
Lock Set -oId0 = $Get(^CacheTempUser("Singleton", ..%ClassName(1)))
If ..%ObjectModified()=0 Quit $$$OK
Set oRef0 = ..%Open(oId0,, .sc)
If $$$ISERR(sc) Quit sc
If oRef0.Version = ..Version {
Set ..Version = ..Version + 1
} Else {
If '$Test Quit $$$ERROR($$$LockFailedToAcquireExclusiveConcurrencyVersionMismatch, ..%ClassName(1))
}
}
// serialise local singleton object ifand changescheck havestatus occurredcode
Set sc = ..%GetSwizzleObject(,.oId) If $$$ISERR(sc) Quit sc
// obtainacquire exclusive lock on global singleton object
Set lockTO = $ZUtil(115,4)
If ..Concurrency '= 0 {
Lock +^CacheTempUser("Singleton", ..%ClassName(1)):lockTO
Set lockTO = $ZUtil(115,4)
Lock If +^CacheTempUser'$Test Quit $$$ERROR("Singleton"$$$LockFailedToAcquireExclusive, ..%ClassName(1)):lockTO
If '$Test Quit $$$ERROR($$$LockFailedToAcquireExclusive, ..%ClassName(1))
}
// update global singleton object and release lock
Set ^CacheTempUser("Singleton", ..%ClassName(1)) = oId
Lock -^CacheTempUser("Singleton", ..%ClassName(1))
If ..Concurrency '= 0 {
Lock -^CacheTempUser("Singleton", ..%ClassName(1))
}
Quit $$$OK
}
Line 421 ⟶ 424:
 
Property Concurrency As %Integer [ Private, Transient ];
 
Property Version As %Integer [ Private ];
 
}