Files
MWClash/core/process.go

82 lines
1.4 KiB
Go
Raw Normal View History

2024-04-30 23:38:49 +08:00
//go:build android
package main
import "C"
import (
"encoding/json"
"errors"
"github.com/metacubex/mihomo/component/process"
"github.com/metacubex/mihomo/constant"
2024-06-16 19:04:33 +08:00
"sync"
"sync/atomic"
"time"
)
2024-06-16 19:04:33 +08:00
type ProcessMap struct {
m sync.Map
}
func (cm *ProcessMap) Store(key int64, value string) {
cm.m.Store(key, value)
}
2024-06-16 19:04:33 +08:00
func (cm *ProcessMap) Load(key int64) (string, bool) {
value, ok := cm.m.Load(key)
if !ok || value == nil {
return "", false
}
return value.(string), true
}
var counter int64 = 0
var processMap ProcessMap
func init() {
process.DefaultPackageNameResolver = func(metadata *constant.Metadata) (string, error) {
if metadata == nil {
return "", process.ErrInvalidNetwork
}
id := atomic.AddInt64(&counter, 1)
timeout := time.After(200 * time.Millisecond)
2024-07-13 16:36:08 +08:00
SendMessage(Message{
Type: ProcessMessage,
Data: Process{
Id: id,
2024-06-16 19:04:33 +08:00
Metadata: metadata,
},
2024-06-16 19:04:33 +08:00
})
for {
select {
case <-timeout:
return "", errors.New("package resolver timeout")
default:
2024-06-16 19:04:33 +08:00
value, exists := processMap.Load(id)
if exists {
2024-06-16 19:04:33 +08:00
return value, nil
}
2024-06-16 19:04:33 +08:00
time.Sleep(20 * time.Millisecond)
}
}
}
}
//export setProcessMap
func setProcessMap(s *C.char) {
2024-06-16 19:04:33 +08:00
if s == nil {
return
}
2024-06-28 07:45:50 +08:00
paramsString := C.GoString(s)
go func() {
var processMapItem = &ProcessMapItem{}
err := json.Unmarshal([]byte(paramsString), processMapItem)
if err == nil {
2024-06-16 19:04:33 +08:00
processMap.Store(processMapItem.Id, processMapItem.Value)
}
}()
}