mirror of
https://github.com/godruoyi/go-snowflake.git
synced 2025-12-23 05:25:15 +00:00
32 lines
655 B
Go
32 lines
655 B
Go
package snowflake
|
|
|
|
import "sync/atomic"
|
|
|
|
var lastTime int64
|
|
var lastSeq uint32
|
|
|
|
// AtomicResolver define as atomic sequence resolver, base on standard sync/atomic.
|
|
func AtomicResolver(ms int64) (uint16, error) {
|
|
var last int64
|
|
var seq, localSeq uint32
|
|
|
|
for {
|
|
last = atomic.LoadInt64(&lastTime)
|
|
localSeq = atomic.LoadUint32(&lastSeq)
|
|
if last > ms {
|
|
return MaxSequence, nil
|
|
}
|
|
|
|
if last == ms {
|
|
seq = uint32(MaxSequence) & (localSeq + 1)
|
|
if seq == 0 {
|
|
return MaxSequence, nil
|
|
}
|
|
}
|
|
|
|
if atomic.CompareAndSwapInt64(&lastTime, last, ms) && atomic.CompareAndSwapUint32(&lastSeq, localSeq, seq) {
|
|
return uint16(seq), nil
|
|
}
|
|
}
|
|
}
|