@@ -51,14 +51,14 @@ func New(sid uint64) {
51
51
//refresh base
52
52
lasttime = templasttime
53
53
rollback = 0
54
- base = getlasttime () + getrollback () + getserverid ()
54
+ atomic . StoreUint64 ( & base , getlasttime ()+ getrollback ()+ getserverid () )
55
55
} else if templasttime < lasttime {
56
56
//rollback
57
57
rollback ++
58
58
if rollback > 63 {
59
59
panic ("[ID.init] server time rollback more then 60s" )
60
60
}
61
- base = getlasttime () + getrollback () + getserverid ()
61
+ atomic . StoreUint64 ( & base , getlasttime ()+ getrollback ()+ getserverid () )
62
62
}
63
63
}
64
64
}()
@@ -73,7 +73,7 @@ func getserverid() uint64 {
73
73
return serverid << 23
74
74
}
75
75
76
- const mask uint64 = uint64 (63 ) << 23
76
+ const mask uint64 = uint64 (7 ) << 23
77
77
78
78
func checkserverid (id uint64 ) bool {
79
79
if ((id & mask ) >> 23 ) == serverid {
@@ -85,30 +85,23 @@ func checkserverid(id uint64) bool {
85
85
var ERRMAX = errors .New ("[ID.GetID]Max id was used up in this second" )
86
86
87
87
func GetID () (uint64 , error ) {
88
- if ! checkserverid (base ) {
89
- return 0 , ERRMAX
90
- }
91
- newid := atomic .AddUint64 (& base , 1 )
92
- if ! checkserverid (newid ) {
93
- return 0 , ERRMAX
94
- }
95
- return newid , nil
88
+ _ , end , e := GetIDs (1 )
89
+ return end , e
96
90
}
97
91
98
- var ERRMAXONCE = errors .New ("[ID.GetID]Too many ids required once" )
99
-
100
- func GetIDs (delta uint64 ) (start uint64 , end uint64 , e error ) {
101
- if delta > 5000 {
102
- return 0 , 0 , ERRMAXONCE
92
+ //range is [start,end],including start and end,if delta is 1,start = end
93
+ func GetIDs (delta uint16 ) (start uint64 , end uint64 , e error ) {
94
+ if delta == 0 {
95
+ delta += 1
103
96
}
104
- if ! checkserverid (base ) {
105
- return 0 , 0 , ERRMAX
106
- }
107
- newid := atomic .AddUint64 (& base , delta )
108
- if ! checkserverid (newid ) {
109
- return 0 , 0 , ERRMAX
97
+ for {
98
+ oldbase := atomic .LoadUint64 (& base )
99
+ if ! checkserverid (oldbase + uint64 (delta )) {
100
+ return 0 , 0 , ERRMAX
101
+ }
102
+ if ! atomic .CompareAndSwapUint64 (& base , oldbase , oldbase + uint64 (delta )) {
103
+ continue
104
+ }
105
+ return oldbase + 1 , oldbase + uint64 (delta ), nil
110
106
}
111
- start = newid - delta
112
- end = newid
113
- return
114
107
}
0 commit comments