1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- #pragma once
- #include "defs.h"
- namespace NActors {
- // Value representing specific worker's permission for exclusive use of CPU till specific deadline
- struct TLease {
- // Lower WorkerBits store current fast worker id
- // All other higher bits store expiration (hard preemption) timestamp
- using TValue = ui64;
- TValue Value;
- static constexpr ui64 WorkerIdMask = ui64((1ull << WorkerBits) - 1);
- static constexpr ui64 ExpireTsMask = ~WorkerIdMask;
- explicit constexpr TLease(ui64 value)
- : Value(value)
- {}
- constexpr TLease(TWorkerId workerId, ui64 expireTs)
- : Value((workerId & WorkerIdMask) | (expireTs & ExpireTsMask))
- {}
- TWorkerId GetWorkerId() const {
- return Value & WorkerIdMask;
- }
- TLease NeverExpire() const {
- return TLease(Value | ExpireTsMask);
- }
- bool IsNeverExpiring() const {
- return (Value & ExpireTsMask) == ExpireTsMask;
- }
- ui64 GetExpireTs() const {
- // Do not truncate worker id
- // NOTE: it decrease accuracy, but improves performance
- return Value;
- }
- ui64 GetPreciseExpireTs() const {
- return Value & ExpireTsMask;
- }
- operator TValue() const {
- return Value;
- }
- };
- // Special expire timestamp values
- static constexpr ui64 NeverExpire = ui64(-1);
- // Special hard-preemption-in-progress lease
- static constexpr TLease HardPreemptionLease = TLease(TLease::WorkerIdMask, NeverExpire);
- }
|