type Registry struct {
mutex sync.Mutex
register map[uint16]*Subscription
- counter uint16
+ subIds []uint16
rtmgrClient *RtmgrClient
}
// This method should run as a constructor
-func (r *Registry) Initialize(seedsn uint16) {
+func (r *Registry) Initialize() {
r.register = make(map[uint16]*Subscription)
- r.counter = seedsn
+ var i uint16
+ for i = 0; i < 65535; i++ {
+ r.subIds = append(r.subIds, i+1)
+ }
}
// Reserves and returns the next free sequence number
-func (r *Registry) ReserveSubscription(endPoint RmrEndpoint, meid *xapp.RMRMeid) (*Subscription, error) {
+func (r *Registry) ReserveSubscription(endPoint *RmrEndpoint, meid *xapp.RMRMeid) (*Subscription, error) {
// Check is current SequenceNumber valid
// Allocate next SequenceNumber value and retry N times
r.mutex.Lock()
var subs *Subscription = nil
var retrytimes uint16 = 1000
for ; subs == nil && retrytimes > 0; retrytimes-- {
- sequenceNumber := r.counter
- if r.counter == 65535 {
- r.counter = 0
- } else {
- r.counter++
- }
+ sequenceNumber := r.subIds[0]
+ r.subIds = r.subIds[1:]
if _, ok := r.register[sequenceNumber]; ok == false {
subs := &Subscription{
+ registry: r,
Seq: sequenceNumber,
Active: false,
- RmrEndpoint: endPoint,
+ RmrEndpoint: *endPoint,
Meid: meid,
Trans: nil,
}
// Update routing
r.mutex.Unlock()
- err := subs.UpdateRoute(CREATE, r.rtmgrClient)
+ err := subs.UpdateRoute(CREATE)
r.mutex.Lock()
if err != nil {
if _, ok := r.register[sequenceNumber]; ok {
return subs, nil
}
}
- return nil, fmt.Errorf("Registry: Failed to reserves subcription. RmrEndpoint: %s, Meid: %s", endPoint, meid.RanName)
+ return nil, fmt.Errorf("Registry: Failed to reserves subscription. RmrEndpoint: %s, Meid: %s", endPoint, meid.RanName)
}
func (r *Registry) GetSubscription(sn uint16) *Subscription {
r.mutex.Lock()
defer r.mutex.Unlock()
if _, ok := r.register[sn]; ok {
- subs := r.register[sn]
+ r.subIds = append(r.subIds, sn)
delete(r.register, sn)
-
- // Update routing
- r.mutex.Unlock()
- err := subs.UpdateRoute(DELETE, r.rtmgrClient)
- r.mutex.Lock()
- if err != nil {
- xapp.Logger.Error("Registry: Failed to del route. SubId: %d, RmrEndpoint: %s", subs.Seq, subs.RmrEndpoint)
- }
return true
}
return false