123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- //go:build android
- package main
- import "C"
- import (
- "encoding/json"
- "errors"
- "github.com/metacubex/mihomo/component/process"
- "github.com/metacubex/mihomo/constant"
- "sync"
- "sync/atomic"
- "time"
- )
- type ProcessMap struct {
- m sync.Map
- }
- func (cm *ProcessMap) Store(key int64, value string) {
- cm.m.Store(key, value)
- }
- 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)
- SendMessage(Message{
- Type: ProcessMessage,
- Data: Process{
- Id: id,
- Metadata: metadata,
- },
- })
- for {
- select {
- case <-timeout:
- return "", errors.New("package resolver timeout")
- default:
- value, exists := processMap.Load(id)
- if exists {
- return value, nil
- }
- time.Sleep(20 * time.Millisecond)
- }
- }
- }
- }
- //export setProcessMap
- func setProcessMap(s *C.char) {
- if s == nil {
- return
- }
- paramsString := C.GoString(s)
- go func() {
- var processMapItem = &ProcessMapItem{}
- err := json.Unmarshal([]byte(paramsString), processMapItem)
- if err == nil {
- processMap.Store(processMapItem.Id, processMapItem.Value)
- }
- }()
- }
|