Ejemplo n.º 1
0
Archivo: gen.go Proyecto: NONFish/goc2p
func (gen *myGenerator) asyncCall() {
	gen.tickets.Take()
	go func() {
		defer func() {
			if p := recover(); p != nil {
				err, ok := interface{}(p).(error)
				var buff bytes.Buffer
				buff.WriteString("Async Call Panic! (")
				if ok {
					buff.WriteString("error: ")
					buff.WriteString(err.Error())
				} else {
					buff.WriteString("clue: ")
					buff.WriteString(fmt.Sprintf("%v", p))
				}
				buff.WriteString(")")
				errMsg := buff.String()
				logger.Fatalln(errMsg)
				result := &lib.CallResult{
					Id:   -1,
					Code: lib.RESULT_CODE_FATAL_CALL,
					Msg:  errMsg}
				gen.sendResult(result)
			}
		}()
		rawReq := gen.caller.BuildReq()
		var timeout bool
		timer := time.AfterFunc(gen.timeoutNs, func() {
			timeout = true
			result := &lib.CallResult{
				Id:   rawReq.Id,
				Req:  rawReq,
				Code: lib.RESULT_CODE_WARNING_CALL_TIMEOUT,
				Msg:  fmt.Sprintf("Timeout! (expected: < %v)", gen.timeoutNs)}
			gen.sendResult(result)
		})
		rawResp := gen.interact(&rawReq)
		if !timeout {
			timer.Stop()
			var result *lib.CallResult
			if rawResp.Err != nil {
				result = &lib.CallResult{
					Id:     rawResp.Id,
					Req:    rawReq,
					Code:   lib.RESULT_CODE_ERROR_CALL,
					Msg:    rawResp.Err.Error(),
					Elapse: rawResp.Elapse}
			} else {
				result = gen.caller.CheckResp(rawReq, *rawResp)
				result.Elapse = rawResp.Elapse
			}
			gen.sendResult(result)
		}
		gen.tickets.Return()
	}()
}