Skip to content

Commit 63b7103

Browse files
update flatbuffer processing logic in common.go (#26)
1 parent 05dd8a7 commit 63b7103

1 file changed

Lines changed: 98 additions & 78 deletions

File tree

spearlet/hostcalls/common/common.go

Lines changed: 98 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
240260
func (c *CommunicationManager) GetIncomingRequest() *ReqChanData {
241261
return <-c.reqCh
242262
}

0 commit comments

Comments
 (0)