process.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. //go:build android
  2. package main
  3. import "C"
  4. import (
  5. "encoding/json"
  6. "errors"
  7. "github.com/metacubex/mihomo/component/process"
  8. "github.com/metacubex/mihomo/constant"
  9. "sync"
  10. "sync/atomic"
  11. "time"
  12. )
  13. type ProcessMap struct {
  14. m sync.Map
  15. }
  16. func (cm *ProcessMap) Store(key int64, value string) {
  17. cm.m.Store(key, value)
  18. }
  19. func (cm *ProcessMap) Load(key int64) (string, bool) {
  20. value, ok := cm.m.Load(key)
  21. if !ok || value == nil {
  22. return "", false
  23. }
  24. return value.(string), true
  25. }
  26. var counter int64 = 0
  27. var processMap ProcessMap
  28. func init() {
  29. process.DefaultPackageNameResolver = func(metadata *constant.Metadata) (string, error) {
  30. if metadata == nil {
  31. return "", process.ErrInvalidNetwork
  32. }
  33. id := atomic.AddInt64(&counter, 1)
  34. timeout := time.After(200 * time.Millisecond)
  35. SendMessage(Message{
  36. Type: ProcessMessage,
  37. Data: Process{
  38. Id: id,
  39. Metadata: metadata,
  40. },
  41. })
  42. for {
  43. select {
  44. case <-timeout:
  45. return "", errors.New("package resolver timeout")
  46. default:
  47. value, exists := processMap.Load(id)
  48. if exists {
  49. return value, nil
  50. }
  51. time.Sleep(20 * time.Millisecond)
  52. }
  53. }
  54. }
  55. }
  56. //export setProcessMap
  57. func setProcessMap(s *C.char) {
  58. if s == nil {
  59. return
  60. }
  61. paramsString := C.GoString(s)
  62. go func() {
  63. var processMapItem = &ProcessMapItem{}
  64. err := json.Unmarshal([]byte(paramsString), processMapItem)
  65. if err == nil {
  66. processMap.Store(processMapItem.Id, processMapItem.Value)
  67. }
  68. }()
  69. }