@@ -137,11 +137,6 @@ func (c *CommunicationManager) InstallToTask(t task.Task) error {
137137 c .outCh [t ] = in
138138
139139 go func () {
140- inv := InvocationInfo {
141- Task : t ,
142- CommMgr : c ,
143- }
144-
145140 for msg := range out {
146141 // process message
147142 transRaw := transport .GetRootAsTransportMessageRaw (msg , 0 )
@@ -150,83 +145,19 @@ func (c *CommunicationManager) InstallToTask(t task.Task) error {
150145 continue
151146 }
152147 if transRaw .DataType () == transport .TransportMessageRaw_DataTransportRequest {
153- // request
154- req := transport.TransportRequest {}
155- // convert to transport request
156- reqTbl := & flatbuffers.Table {}
157- if ! transRaw .Data (reqTbl ) {
158- log .Errorf ("Error getting transport request table" )
159- continue
160- }
161- req .Init (reqTbl .Bytes , reqTbl .Pos )
162- log .Debugf ("Hostcall received request: %d" , req .Method ())
163- c .reqCh <- & ReqChanData {
164- Req : & req ,
165- InvInfo : & inv ,
148+ err := c .doResponse (t , transRaw )
149+ if err != nil {
150+ log .Errorf ("Error processing response: %v" , err )
166151 }
167152 } else if transRaw .DataType () == transport .TransportMessageRaw_DataTransportResponse {
168- // response
169- resp := transport.TransportResponse {}
170- // convert to transport response
171- respTbl := & flatbuffers.Table {}
172- if ! transRaw .Data (respTbl ) {
173- log .Errorf ("Error getting transport response table" )
174- continue
153+ err := c .doRequest (t , transRaw )
154+ if err != nil {
155+ log .Errorf ("Error processing request: %v" , err )
175156 }
176- resp .Init (respTbl .Bytes , respTbl .Pos )
177- log .Debugf ("Hostcall received response: %d" , resp .Id ())
178- go func () {
179- // check if it is response to a pending request
180- c .pendingRequestsMu .RLock ()
181- entry , ok := c .pendingRequests [resp .Id ()]
182- c .pendingRequestsMu .RUnlock ()
183- if ok {
184- cb := entry .cb
185- if err := cb (& resp ); err != nil {
186- log .Errorf ("Error handling response: %v" , err )
187- }
188- if entry .autoClear {
189- c .pendingRequestsMu .Lock ()
190- delete (c .pendingRequests , resp .Id ())
191- c .pendingRequestsMu .Unlock ()
192- }
193- return
194- }
195-
196- // this is when we receive a response that is not a pending request
197- c .respCh <- & RespChanData {
198- Resp : & resp ,
199- InvInfo : & inv ,
200- }
201- }()
202-
203157 } else if transRaw .DataType () == transport .TransportMessageRaw_DataTransportSignal {
204- sig := transport.TransportSignal {}
205- sigTbl := & flatbuffers.Table {}
206- if ! transRaw .Data (sigTbl ) {
207- log .Errorf ("Error getting transport signal table" )
208- continue
209- }
210- sig .Init (sigTbl .Bytes , sigTbl .Pos )
211- log .Debugf ("Platform received signal: %s" , sig .Method ().String ())
212- // check if we have a callback for this signal
213- c .taskSigCallbacksMu .RLock ()
214- if _ , ok := c .taskSigCallbacks [t ]; ! ok {
215- c .taskSigCallbacksMu .RUnlock ()
216- log .Errorf ("No signal callbacks registered for task: %v" , t .Name ())
217- continue
218- }
219- if _ , ok := c .taskSigCallbacks [t ][sig .Method ()]; ! ok {
220- c .taskSigCallbacksMu .RUnlock ()
221- log .Warnf ("No signal callback registered for task: %v, signal: %v" , t .Name (),
222- sig .Method ())
223- continue
224- }
225- cb := c .taskSigCallbacks [t ][sig .Method ()]
226- c .taskSigCallbacksMu .RUnlock ()
227- // call the callback
228- if err := cb (sig .PayloadBytes ()); err != nil {
229- log .Errorf ("Error handling signal: %v" , err )
158+ err := c .doSignal (t , transRaw )
159+ if err != nil {
160+ log .Errorf ("Error processing signal: %v" , err )
230161 }
231162 } else {
232163 log .Errorf ("Invalid transport message type: %d" , transRaw .DataType ())
@@ -237,6 +168,95 @@ func (c *CommunicationManager) InstallToTask(t task.Task) error {
237168 return nil
238169}
239170
171+ func (c * CommunicationManager ) doResponse (t task.Task , transportRaw * transport.TransportMessageRaw ) error {
172+ inv := InvocationInfo {
173+ Task : t ,
174+ CommMgr : c ,
175+ }
176+ // request
177+ req := transport.TransportRequest {}
178+ // convert to transport request
179+ reqTbl := & flatbuffers.Table {}
180+ if ! transportRaw .Data (reqTbl ) {
181+ return fmt .Errorf ("error getting transport request table" )
182+ }
183+ req .Init (reqTbl .Bytes , reqTbl .Pos )
184+ log .Debugf ("Hostcall received request: %d" , req .Method ())
185+ c .reqCh <- & ReqChanData {
186+ Req : & req ,
187+ InvInfo : & inv ,
188+ }
189+ return nil
190+ }
191+
192+ func (c * CommunicationManager ) doRequest (t task.Task , transportRaw * transport.TransportMessageRaw ) error {
193+ inv := InvocationInfo {
194+ Task : t ,
195+ CommMgr : c ,
196+ }
197+ resp := transport.TransportResponse {}
198+ // convert to transport response
199+ respTbl := & flatbuffers.Table {}
200+ if ! transportRaw .Data (respTbl ) {
201+ return fmt .Errorf ("error getting transport response table" )
202+ }
203+ resp .Init (respTbl .Bytes , respTbl .Pos )
204+ log .Debugf ("Hostcall received response: %d" , resp .Id ())
205+ go func () {
206+ // check if it is response to a pending request
207+ c .pendingRequestsMu .RLock ()
208+ entry , ok := c .pendingRequests [resp .Id ()]
209+ c .pendingRequestsMu .RUnlock ()
210+ if ok {
211+ cb := entry .cb
212+ if err := cb (& resp ); err != nil {
213+ log .Errorf ("Error handling response: %v" , err )
214+ }
215+ if entry .autoClear {
216+ c .pendingRequestsMu .Lock ()
217+ delete (c .pendingRequests , resp .Id ())
218+ c .pendingRequestsMu .Unlock ()
219+ }
220+ return
221+ }
222+
223+ // this is when we receive a response that is not a pending request
224+ c .respCh <- & RespChanData {
225+ Resp : & resp ,
226+ InvInfo : & inv ,
227+ }
228+ }()
229+ return nil
230+ }
231+
232+ func (c * CommunicationManager ) doSignal (t task.Task , transportRaw * transport.TransportMessageRaw ) error {
233+ sig := transport.TransportSignal {}
234+ sigTbl := & flatbuffers.Table {}
235+ if ! transportRaw .Data (sigTbl ) {
236+ return fmt .Errorf ("error getting transport signal table" )
237+ }
238+ sig .Init (sigTbl .Bytes , sigTbl .Pos )
239+ log .Debugf ("Platform received signal: %s" , sig .Method ().String ())
240+ // check if we have a callback for this signal
241+ c .taskSigCallbacksMu .RLock ()
242+ if _ , ok := c .taskSigCallbacks [t ]; ! ok {
243+ c .taskSigCallbacksMu .RUnlock ()
244+ return fmt .Errorf ("no signal callbacks registered for task: %v" , t .Name ())
245+ }
246+ if _ , ok := c .taskSigCallbacks [t ][sig .Method ()]; ! ok {
247+ c .taskSigCallbacksMu .RUnlock ()
248+ return fmt .Errorf ("no signal callback registered for task: %v, signal: %v" , t .Name (),
249+ sig .Method ())
250+ }
251+ cb := c .taskSigCallbacks [t ][sig .Method ()]
252+ c .taskSigCallbacksMu .RUnlock ()
253+ // call the callback
254+ if err := cb (sig .PayloadBytes ()); err != nil {
255+ return fmt .Errorf ("error handling signal: %v" , err )
256+ }
257+ return nil
258+ }
259+
240260func (c * CommunicationManager ) GetIncomingRequest () * ReqChanData {
241261 return <- c .reqCh
242262}
0 commit comments