diff --git a/db/ConfigBuilder.cpp b/db/ConfigBuilder.cpp index 43ec0cb..177c9a4 100644 --- a/db/ConfigBuilder.cpp +++ b/db/ConfigBuilder.cpp @@ -698,8 +698,8 @@ namespace NekoRay { // geopath auto geoip = FindCoreAsset("geoip.db"); auto geosite = FindCoreAsset("geosite.db"); - if (geoip.isEmpty()) result->error = geoip + " not found"; - if (geosite.isEmpty()) result->error = geosite + " not found"; + if (geoip.isEmpty()) result->error = + "geoip.db not found"; + if (geosite.isEmpty()) result->error = + "geosite.db not found"; // final add routing rule QJSONARRAY_ADD(routingRules, QString2QJsonObject(dataStore->custom_route_global)["rules"].toArray()) @@ -711,6 +711,19 @@ namespace NekoRay { {"geosite", QJsonObject{{"path", geosite},},} }); + // api + result->coreConfig.insert("experimental", QJsonObject{ + {"v2ray_api", QJsonObject{ + {"listen", "127.0.0.1:" + Int2String(dataStore->inbound_socks_port + 10)}, + {"stats", QJsonObject{ + {"enabled", true}, + {"outbounds", QJsonArray{ + tagProxy, "bypass", "block" + }}, + }} + }}, + }); + return result; } diff --git a/db/TrafficLooper.cpp b/db/TrafficLooper.cpp index b7a74b5..04b709f 100644 --- a/db/TrafficLooper.cpp +++ b/db/TrafficLooper.cpp @@ -62,7 +62,6 @@ namespace NekoRay::traffic { } void TrafficLooper::loop() { - if (IS_NEKO_BOX) return; // TODO upstream api while (true) { auto sleep_ms = dataStore->traffic_loop_interval; auto user_disabled = sleep_ms == 0; diff --git a/go/cmd/nekobox_core/core_box.go b/go/cmd/nekobox_core/core_box.go index ce0e66b..a677a79 100644 --- a/go/cmd/nekobox_core/core_box.go +++ b/go/cmd/nekobox_core/core_box.go @@ -15,6 +15,7 @@ import ( box "github.com/sagernet/sing-box" "github.com/sagernet/sing-box/adapter" "github.com/sagernet/sing-box/common/dialer" + "github.com/sagernet/sing-box/experimental/v2rayapi" "github.com/sagernet/sing/common/metadata" "github.com/sagernet/sing/common/network" ) @@ -22,6 +23,8 @@ import ( var instance *box.Box var instance_cancel context.CancelFunc +var box_v2ray_service *v2rayapi.StatsService + // Use sing-box instead of libcore & v2ray func setupCore() { diff --git a/go/cmd/nekobox_core/go.mod b/go/cmd/nekobox_core/go.mod index dd372c5..2c83b18 100644 --- a/go/cmd/nekobox_core/go.mod +++ b/go/cmd/nekobox_core/go.mod @@ -4,8 +4,8 @@ go 1.19 require ( github.com/dustin/go-humanize v1.0.0 - github.com/sagernet/sing v0.0.0-20220921101604-86d7d510231f - github.com/sagernet/sing-box v1.0.2-0.20220923023007-9856b73cb530 + github.com/sagernet/sing v0.0.0-20220926054900-7209937cc235 + github.com/sagernet/sing-box v1.0.2-0.20220929011213-aa613cba7362 github.com/spf13/cobra v1.5.0 neko v1.0.0 ) @@ -49,10 +49,10 @@ require ( github.com/sagernet/go-tun2socks v1.16.12-0.20220818015926-16cb67876a61 // indirect github.com/sagernet/netlink v0.0.0-20220905062125-8043b4a9aa97 // indirect github.com/sagernet/quic-go v0.0.0-20220818150011-de611ab3e2bb // indirect - github.com/sagernet/sing-dns v0.0.0-20220915084601-812e0864b45b // indirect + github.com/sagernet/sing-dns v0.0.0-20220929010544-ee843807aae3 // indirect github.com/sagernet/sing-shadowsocks v0.0.0-20220819002358-7461bb09a8f6 // indirect - github.com/sagernet/sing-tun v0.0.0-20220922083325-80ee99472704 // indirect - github.com/sagernet/sing-vmess v0.0.0-20220923035311-d70afe4ab2c9 // indirect + github.com/sagernet/sing-tun v0.0.0-20220925112147-6bad0c2380ca // indirect + github.com/sagernet/sing-vmess v0.0.0-20220925083655-063bc85ea685 // indirect github.com/sagernet/smux v0.0.0-20220831015742-e0f1988e3195 // indirect github.com/sagernet/websocket v0.0.0-20220913015213-615516348b4e // indirect github.com/spf13/pflag v1.0.5 // indirect @@ -61,12 +61,12 @@ require ( go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.22.0 // indirect - go4.org/netipx v0.0.0-20220812043211-3cc044ffd68d // indirect - golang.org/x/crypto v0.0.0-20220919173607-35f4265a4bc0 // indirect + go4.org/netipx v0.0.0-20220925034521-797b0c90d8ab // indirect + golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7 // indirect golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/net v0.0.0-20220909164309-bea034e7d591 // indirect - golang.org/x/sys v0.0.0-20220913120320-3275c407cedc // indirect + golang.org/x/net v0.0.0-20220923203811-8be639271d50 // indirect + golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect golang.org/x/tools v0.1.11-0.20220513221640-090b14e8501f // indirect diff --git a/go/cmd/nekobox_core/go.sum b/go/cmd/nekobox_core/go.sum index 60da7fe..5849a8f 100644 --- a/go/cmd/nekobox_core/go.sum +++ b/go/cmd/nekobox_core/go.sum @@ -157,18 +157,18 @@ github.com/sagernet/quic-go v0.0.0-20220818150011-de611ab3e2bb h1:wc0yQ+SBn4TaTY github.com/sagernet/quic-go v0.0.0-20220818150011-de611ab3e2bb/go.mod h1:MIccjRKnPTjWwAOpl+AUGWOkzyTd9tERytudxu+1ra4= github.com/sagernet/sing v0.0.0-20220812082120-05f9836bff8f/go.mod h1:QVsS5L/ZA2Q5UhQwLrn0Trw+msNd/NPGEhBKR/ioWiY= github.com/sagernet/sing v0.0.0-20220817130738-ce854cda8522/go.mod h1:QVsS5L/ZA2Q5UhQwLrn0Trw+msNd/NPGEhBKR/ioWiY= -github.com/sagernet/sing v0.0.0-20220921101604-86d7d510231f h1:GX416thAwyc0vHBOal/qplvdhFgYO2dHD5GqADCJ0Ig= -github.com/sagernet/sing v0.0.0-20220921101604-86d7d510231f/go.mod h1:x3NHUeJBQwV75L51zwmLKQdLtRvR+M4PmXkfQtU1vIY= -github.com/sagernet/sing-box v1.0.2-0.20220923023007-9856b73cb530 h1:37mjY3D6FBHOUTG0hRBx0iSsCzAe0tEqPyfRuE194HU= -github.com/sagernet/sing-box v1.0.2-0.20220923023007-9856b73cb530/go.mod h1:hIY63nNHAQL8HV1d3i3KAbzAAixA7qIZudfmLr8D5KE= -github.com/sagernet/sing-dns v0.0.0-20220915084601-812e0864b45b h1:cXCMNJ9heZ+c6l+qUcku60x9KyXo4SOAaJfg/6spOmU= -github.com/sagernet/sing-dns v0.0.0-20220915084601-812e0864b45b/go.mod h1:SrvWLfOSlnFmH32CWXicfilAGgIXR0VjrH6yRbuXYww= +github.com/sagernet/sing v0.0.0-20220926054900-7209937cc235 h1:RnOAPYPntphJkZaucj90uAiJtoyuvVbW13fjHDgb3rM= +github.com/sagernet/sing v0.0.0-20220926054900-7209937cc235/go.mod h1:5/u6RMDMoGIkSNtrZb41kJvyIFg3Ysn69P3WiAu8m0c= +github.com/sagernet/sing-box v1.0.2-0.20220929011213-aa613cba7362 h1:V+8AA8VxGA1xlWbU7XEzi6MFhl6jBkSsBs4xA5iy1WY= +github.com/sagernet/sing-box v1.0.2-0.20220929011213-aa613cba7362/go.mod h1:NjHsyHk4AL1DP3OPaF1JQm5w6gPn5btjPS0PYGP8w+k= +github.com/sagernet/sing-dns v0.0.0-20220929010544-ee843807aae3 h1:AEdyJxEDFq38z0pBX/0MpikQapGMIch+1ADe9k1bJqU= +github.com/sagernet/sing-dns v0.0.0-20220929010544-ee843807aae3/go.mod h1:SrvWLfOSlnFmH32CWXicfilAGgIXR0VjrH6yRbuXYww= github.com/sagernet/sing-shadowsocks v0.0.0-20220819002358-7461bb09a8f6 h1:JJfDeYYhWunvtxsU/mOVNTmFQmnzGx9dY034qG6G3g4= github.com/sagernet/sing-shadowsocks v0.0.0-20220819002358-7461bb09a8f6/go.mod h1:EX3RbZvrwAkPI2nuGa78T2iQXmrkT+/VQtskjou42xM= -github.com/sagernet/sing-tun v0.0.0-20220922083325-80ee99472704 h1:DOQQXQbB2gq4n2FuMHrL07HRs2naCCsuiu/9l1JFb9A= -github.com/sagernet/sing-tun v0.0.0-20220922083325-80ee99472704/go.mod h1:5AhPUv9jWDQ3pv3Mj78SL/1TSjhoaj6WNASxRKLqXqM= -github.com/sagernet/sing-vmess v0.0.0-20220923035311-d70afe4ab2c9 h1:w7JlEa4xHXuuPTL3Opb+Z5f/l66SYi54rSfobzuxSF8= -github.com/sagernet/sing-vmess v0.0.0-20220923035311-d70afe4ab2c9/go.mod h1:bwhAdSNET1X+j9DOXGj9NIQR39xgcWIk1rOQ9lLD+gM= +github.com/sagernet/sing-tun v0.0.0-20220925112147-6bad0c2380ca h1:Owgx9izFNYyMyUZ61td+mL3vumBhJz4zNismYlCyQbw= +github.com/sagernet/sing-tun v0.0.0-20220925112147-6bad0c2380ca/go.mod h1:ftP5VXlp3RJO5+WS3mPFk7jB9B/K/QrPEZX3BUORGQY= +github.com/sagernet/sing-vmess v0.0.0-20220925083655-063bc85ea685 h1:AZzFNRR/ZwMTceUQ1b/mxx6oyKqmFymdMn/yleJmoVM= +github.com/sagernet/sing-vmess v0.0.0-20220925083655-063bc85ea685/go.mod h1:bwhAdSNET1X+j9DOXGj9NIQR39xgcWIk1rOQ9lLD+gM= github.com/sagernet/smux v0.0.0-20220831015742-e0f1988e3195 h1:5VBIbVw9q7aKbrFdT83mjkyvQ+VaRsQ6yflTepfln38= github.com/sagernet/smux v0.0.0-20220831015742-e0f1988e3195/go.mod h1:yedWtra8nyGJ+SyI+ziwuaGMzBatbB10P1IOOZbbSK8= github.com/sagernet/websocket v0.0.0-20220913015213-615516348b4e h1:7uw2njHFGE+VpWamge6o56j2RWk4omF6uLKKxMmcWvs= @@ -208,16 +208,16 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= go.uber.org/zap v1.22.0 h1:Zcye5DUgBloQ9BaT4qc9BnjOFog5TvBSAGkJ3Nf70c0= go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U= -go4.org/netipx v0.0.0-20220812043211-3cc044ffd68d h1:ggxwEf5eu0l8v+87VhX1czFh8zJul3hK16Gmruxn7hw= -go4.org/netipx v0.0.0-20220812043211-3cc044ffd68d/go.mod h1:tgPU4N2u9RByaTN3NC2p9xOzyFpte4jYwsIIRF7XlSc= +go4.org/netipx v0.0.0-20220925034521-797b0c90d8ab h1:+yW1yrZ09EYNu1spCUOHBBNRbrLnfmutwyhbhCv3b6Q= +go4.org/netipx v0.0.0-20220925034521-797b0c90d8ab/go.mod h1:tgPU4N2u9RByaTN3NC2p9xOzyFpte4jYwsIIRF7XlSc= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220919173607-35f4265a4bc0 h1:a5Yg6ylndHHYJqIPrdq0AhvR6KTvDTAvgBtaidhEevY= -golang.org/x/crypto v0.0.0-20220919173607-35f4265a4bc0/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7 h1:WJywXQVIb56P2kAvXeMGTIgQ1ZHQxR60+F9dLsodECc= +golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= @@ -249,8 +249,8 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211111160137-58aab5ef257a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220630215102-69896b714898/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591 h1:D0B/7al0LLrVC8aWF4+oxpv/m8bc7ViFfVS8/gXGdqI= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20220923203811-8be639271d50 h1:vKyz8L3zkd+xrMeIaBsQ/MNVPVFSffdaU3ZyYlBGFnI= +golang.org/x/net v0.0.0-20220923203811-8be639271d50/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1 h1:B333XXssMuKQeBwiNODx4TupZy7bf4sxFZnN2ZOcvUE= @@ -287,8 +287,8 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220913120320-3275c407cedc h1:dpclq5m2YrqPGStKmtw7IcNbKLfbIqKXvNxDJKdIKYc= -golang.org/x/sys v0.0.0-20220913120320-3275c407cedc/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc= +golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/go/cmd/nekobox_core/grpc_box.go b/go/cmd/nekobox_core/grpc_box.go index 74fa465..75ccf4c 100644 --- a/go/cmd/nekobox_core/grpc_box.go +++ b/go/cmd/nekobox_core/grpc_box.go @@ -15,6 +15,8 @@ import ( "unsafe" box "github.com/sagernet/sing-box" + "github.com/sagernet/sing-box/adapter" + "github.com/sagernet/sing-box/experimental/v2rayapi" ) type server struct { @@ -43,14 +45,23 @@ func (s *server) Start(ctx context.Context, in *gen.LoadConfigReq) (out *gen.Err instance, instance_cancel, err = box_main.Create([]byte(in.CoreConfig), true) - // Logger if instance != nil { + // Logger logFactory_ := reflect.Indirect(reflect.ValueOf(instance)).FieldByName("logFactory") logFactory_ = reflect.NewAt(logFactory_.Type(), unsafe.Pointer(logFactory_.UnsafeAddr())).Elem() // get unexported logFactory logFactory_ = logFactory_.Elem().Elem() // get struct writer_ := logFactory_.FieldByName("writer") writer_ = reflect.NewAt(writer_.Type(), unsafe.Pointer(writer_.UnsafeAddr())).Elem() // get unexported io.Writer writer_.Set(reflect.ValueOf(neko_log.LogWriter)) + // V2ray Service + v2ray_ := reflect.Indirect(reflect.ValueOf(instance)).FieldByName("v2rayServer") + v2ray_ = reflect.NewAt(v2ray_.Type(), unsafe.Pointer(v2ray_.UnsafeAddr())).Elem() + + if v2ray, ok := v2ray_.Interface().(adapter.V2RayServer); ok { + if s, ok := v2ray.StatsService().(*v2rayapi.StatsService); ok { + box_v2ray_service = s + } + } } return @@ -70,10 +81,11 @@ func (s *server) Stop(ctx context.Context, in *gen.EmptyReq) (out *gen.ErrorResp return } - instance_cancel() - err = instance.Close() instance = nil + box_v2ray_service = nil + instance_cancel() + instance.Close() // xx closed return } @@ -119,7 +131,18 @@ func (s *server) Test(ctx context.Context, in *gen.TestReq) (out *gen.TestResp, func (s *server) QueryStats(ctx context.Context, in *gen.QueryStatsReq) (out *gen.QueryStatsResp, _ error) { out = &gen.QueryStatsResp{} - // TODO upstream api + + if box_v2ray_service != nil { + req := &v2rayapi.GetStatsRequest{ + Name: fmt.Sprintf("outbound>>>%s>>>traffic>>>%s", in.Tag, in.Direct), + Reset_: true, + } + resp, err := box_v2ray_service.GetStats(ctx, req) + if err == nil { + out.Traffic = resp.Stat.Value + } + } + return } diff --git a/libs/build_go.sh b/libs/build_go.sh index 836482d..4e8b8d9 100755 --- a/libs/build_go.sh +++ b/libs/build_go.sh @@ -29,5 +29,5 @@ popd #### Go: nekobox_core #### pushd go/cmd/nekobox_core -go build -v -o $DEST -trimpath -ldflags "-w -s -X neko/pkg/neko_common.Version_neko=$version_standalone" -tags "with_gvisor,with_quic,with_wireguard" +go build -v -o $DEST -trimpath -ldflags "-w -s -X neko/pkg/neko_common.Version_neko=$version_standalone" -tags "with_gvisor,with_quic,with_wireguard,with_v2ray_api" popd diff --git a/ui/dialog_basic_settings.cpp b/ui/dialog_basic_settings.cpp index 1f0740f..db73f87 100644 --- a/ui/dialog_basic_settings.cpp +++ b/ui/dialog_basic_settings.cpp @@ -77,7 +77,6 @@ DialogBasicSettings::DialogBasicSettings(QWidget *parent) // Style if (IS_NEKO_BOX) { - ui->traffic_statistics_box->setDisabled(true); ui->connection_statistics_box->setDisabled(true); } // diff --git a/ui/mainwindow.cpp b/ui/mainwindow.cpp index 2c678c9..9f9d36a 100644 --- a/ui/mainwindow.cpp +++ b/ui/mainwindow.cpp @@ -104,6 +104,9 @@ MainWindow::MainWindow(QWidget *parent) ui->toolButton_preferences->setMenu(ui->menu_preferences); ui->toolButton_server->setMenu(ui->menu_server); ui->menubar->setVisible(false); +#ifdef NKR_PACKAGE + ui->toolButton_update->hide(); +#endif connect(ui->toolButton_document, &QToolButton::clicked, this, [=] { QDesktopServices::openUrl(QUrl("https://matsuridayo.github.io/")); }); connect(ui->toolButton_ads, &QToolButton::clicked, this, diff --git a/ui/mainwindow_grpc.cpp b/ui/mainwindow_grpc.cpp index df1268b..248b6d7 100644 --- a/ui/mainwindow_grpc.cpp +++ b/ui/mainwindow_grpc.cpp @@ -76,9 +76,9 @@ void MainWindow::speedtest_current_group(int mode) { if (group->archive) return; auto order = ui->proxyListTable->order;//copy + QMutex lock_write; + QMutex lock_return; QList> profiles; - QMutex lock; - QMutex lock2; int threadN = mode == libcore::FullTest ? 1 : NekoRay::dataStore->test_concurrent; int threadN_finished = 0; @@ -89,19 +89,20 @@ void MainWindow::speedtest_current_group(int mode) { } // Threads + lock_return.lock(); for (int i = 0; i < threadN; i++) { runOnNewThread([&] { forever { // - lock.lock(); + lock_write.lock(); if (profiles.isEmpty()) { threadN_finished++; - if (threadN == threadN_finished) lock2.unlock(); - lock.unlock(); + if (threadN == threadN_finished) lock_return.unlock(); + lock_write.unlock(); return; } auto profile = profiles.takeFirst(); - lock.unlock(); + lock_write.unlock(); // libcore::TestReq req; @@ -162,9 +163,8 @@ void MainWindow::speedtest_current_group(int mode) { } // Control - lock2.lock(); - lock2.lock(); - lock2.unlock(); + lock_return.lock(); + lock_return.unlock(); speedtesting = false; }); #endif