improve sync cancel error handling

This commit is contained in:
saces 2026-02-06 16:10:58 +01:00
parent b5feb27b03
commit 65cafdd0f8

View file

@ -5,6 +5,7 @@ package main
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"mxclientlib/mxapi" "mxclientlib/mxapi"
"mxclientlib/mxclient" "mxclientlib/mxclient"
@ -30,6 +31,8 @@ static inline void call_c_on_message_handler(on_message_handler_ptr ptr, char* j
*/ */
import "C" import "C"
var apiCanceled = errors.New("canceled by api call")
/* /*
matrix client with c callback matrix client with c callback
*/ */
@ -39,7 +42,7 @@ type CBClient struct {
on_event_handler_pobj unsafe.Pointer on_event_handler_pobj unsafe.Pointer
on_message_handler C.on_message_handler_ptr on_message_handler C.on_message_handler_ptr
on_message_handler_pobj unsafe.Pointer on_message_handler_pobj unsafe.Pointer
syncCancelFunc context.CancelFunc syncCancelFunc context.CancelCauseFunc
} }
func (cli *CBClient) OnEvent(s string) { func (cli *CBClient) OnEvent(s string) {
@ -236,11 +239,19 @@ func apiv0_startclient(cid C.int) *C.char {
return C.CString(fmt.Sprintf("ERR: %v", err)) return C.CString(fmt.Sprintf("ERR: %v", err))
} }
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancelCause(context.Background())
cli.syncCancelFunc = cancel cli.syncCancelFunc = cancel
err = cli.SyncWithContext(ctx) err = cli.SyncWithContext(ctx)
if err != nil { if err != nil {
if errors.Is(err, context.Canceled) {
cause := context.Cause(ctx)
if errors.Is(cause, apiCanceled) {
return C.CString("SUCCESS.")
} else {
return C.CString(fmt.Sprintf("ERR: %v", cause))
}
}
return C.CString(fmt.Sprintf("ERR: %v", err)) return C.CString(fmt.Sprintf("ERR: %v", err))
} }
return C.CString("SUCCESS.") return C.CString("SUCCESS.")
@ -253,7 +264,7 @@ func apiv0_stopclient(cid C.int) *C.char {
return C.CString(fmt.Sprintf("ERR: %v", err)) return C.CString(fmt.Sprintf("ERR: %v", err))
} }
cli.StopSync() cli.StopSync()
cli.syncCancelFunc() cli.syncCancelFunc(apiCanceled)
return C.CString("SUCCESS.") return C.CString("SUCCESS.")
} }