@@ -35,7 +35,7 @@ type ProxyDeviceManager struct {
3535 networkSpace * sdk.NetworkSpace
3636
3737 stateLock sync.Mutex
38- proxyDevices map [server.Id ]* ProxyDevice
38+ proxyDevices map [server.Id ]* proxyDeviceState
3939}
4040
4141func NewProxyDeviceManagerWithDefaults (ctx context.Context ) * ProxyDeviceManager {
@@ -62,14 +62,11 @@ func NewProxyDeviceManager(ctx context.Context, settings *ProxyDeviceManagerSett
6262 cancel : cancel ,
6363 settings : settings ,
6464 networkSpace : networkSpace ,
65- proxyDevices : map [server.Id ]* ProxyDevice {},
65+ proxyDevices : map [server.Id ]* proxyDeviceState {},
6666 }
6767}
6868
6969func (self * ProxyDeviceManager ) OpenProxyDevice (proxyId server.Id ) (* ProxyDevice , error ) {
70- self .stateLock .Lock ()
71- defer self .stateLock .Unlock ()
72-
7370 nextProxyDevice := func () (* ProxyDevice , error ) {
7471 proxyDeviceConfig := model .GetProxyDeviceConfig (self .ctx , proxyId )
7572 if proxyDeviceConfig == nil {
@@ -85,18 +82,25 @@ func (self *ProxyDeviceManager) OpenProxyDevice(proxyId server.Id) (*ProxyDevice
8582 defer func () {
8683 self .stateLock .Lock ()
8784 defer self .stateLock .Unlock ()
85+
8886 glog .Infof ("[pd]cancel" )
8987 // note we don't call close here because only the sender should call close
9088 pd .Cancel ()
91- if currentPd := self .proxyDevices [proxyId ]; pd == currentPd {
92- delete (self .proxyDevices , proxyId )
89+ if pdState , ok := self .proxyDevices [proxyId ]; ok {
90+ func () {
91+ pdState .StateLock .Lock ()
92+ defer pdState .StateLock .Unlock ()
93+
94+ if pd == pdState .ProxyDevice {
95+ delete (self .proxyDevices , proxyId )
96+ }
97+ }()
9398 }
9499 }()
95100 pd .Run ()
96101 })
97102
98103 go server .HandleError (func () {
99- defer self .cancel ()
100104 for {
101105 if pd .CancelIfIdle () {
102106 return
@@ -113,20 +117,35 @@ func (self *ProxyDeviceManager) OpenProxyDevice(proxyId server.Id) (*ProxyDevice
113117 return pd , nil
114118 }
115119
116- if pd , ok := self .proxyDevices [proxyId ]; ok && pd .UpdateActivity () {
117- return pd , nil
120+ pdState := func () * proxyDeviceState {
121+ self .stateLock .Lock ()
122+ defer self .stateLock .Unlock ()
123+ pdState , ok := self .proxyDevices [proxyId ]
124+ if ! ok {
125+ pdState = & proxyDeviceState {}
126+ self .proxyDevices [proxyId ] = pdState
127+ }
128+ return pdState
129+ }()
130+
131+ pdState .StateLock .Lock ()
132+ defer pdState .StateLock .Unlock ()
133+
134+ if pd := pdState .ProxyDevice ; pd != nil {
135+ if pd .UpdateActivity () {
136+ return pd , nil
137+ } else {
138+ pd .Cancel ()
139+ pdState .ProxyDevice = nil
140+ }
118141 }
119142
120143 pd , err := nextProxyDevice ()
121144 if err != nil {
122145 return nil , err
123146 }
124147
125- if replacedPd , ok := self .proxyDevices [proxyId ]; ok {
126- replacedPd .Cancel ()
127- }
128- self .proxyDevices [proxyId ] = pd
129-
148+ pdState .ProxyDevice = pd
130149 return pd , nil
131150}
132151
@@ -139,6 +158,11 @@ func (self *ProxyDeviceManager) Close() {
139158 self .cancel ()
140159}
141160
161+ type proxyDeviceState struct {
162+ StateLock sync.Mutex
163+ ProxyDevice * ProxyDevice
164+ }
165+
142166func DefaultProxyDeviceSettings () * ProxyDeviceSettings {
143167 return & ProxyDeviceSettings {
144168 ProxyDeviceDescription : "resident proxy" ,
0 commit comments