| 1632 | } |
| 1633 | |
| 1634 | EX_FAST_REF |
| 1635 | ExFastReference( |
| 1636 | _Inout_ PEX_FAST_REF FastRef |
| 1637 | ) { |
| 1638 | EX_FAST_REF OldRef, NewRef; |
| 1639 | |
| 1640 | while (true) { |
| 1641 | OldRef = ReadForWriteAccess(FastRef); |
| 1642 | if (OldRef.RefCnt != 0) { |
| 1643 | NewRef.Value = OldRef.Value - 1; |
| 1644 | NewRef.Object = InterlockedCompareExchangePointerRelease(&FastRef->Object, NewRef.Object, OldRef.Object); |
| 1645 | if (NewRef.Object != OldRef.Object) { |
| 1646 | continue; |
| 1647 | } |
| 1648 | } |
| 1649 | break; |
| 1650 | } |
| 1651 | return OldRef; |
| 1652 | } |
| 1653 | |
| 1654 | LOGICAL |
| 1655 | ExFastRefAddAdditionalReferenceCounts( |
no outgoing calls
no test coverage detected