Fix incorrect counting of tasks in the utorrent 2.X that caused gorutine deadlock in some cases.

This commit is contained in:
Alexey Kostin 2019-04-19 12:45:31 +03:00
parent a3beacbd5a
commit ad4036291b

View File

@ -2,6 +2,7 @@ package main
import ( import (
"bufio" "bufio"
"bytes"
"crypto/sha1" "crypto/sha1"
"encoding/hex" "encoding/hex"
"fmt" "fmt"
@ -20,7 +21,6 @@ import (
"strings" "strings"
"sync" "sync"
"time" "time"
"bytes"
) )
func ASCIIconvert(s string) string { func ASCIIconvert(s string) string {
@ -378,7 +378,7 @@ func logic(key string, value map[string]interface{}, bitdir *string, with_label
qbitdir *string, comChannel chan string, errChannel chan string, position int, wg *sync.WaitGroup, boundedChannel chan bool) error { qbitdir *string, comChannel chan string, errChannel chan string, position int, wg *sync.WaitGroup, boundedChannel chan bool) error {
defer wg.Done() defer wg.Done()
defer func() { defer func() {
<- boundedChannel <-boundedChannel
}() }()
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
@ -534,14 +534,14 @@ func main() {
fmt.Println("Press Enter to start") fmt.Println("Press Enter to start")
fmt.Scanln() fmt.Scanln()
log.Println("Started") log.Println("Started")
totaljobs := len(resumefile) - 2 totaljobs := len(resumefile)
numjob := 1 numjob := 1
var oldtags string var oldtags string
var newtags []string var newtags []string
var wg sync.WaitGroup var wg sync.WaitGroup
comChannel := make(chan string, totaljobs) comChannel := make(chan string, totaljobs)
errChannel := make(chan string, totaljobs) errChannel := make(chan string, totaljobs)
boundedChannel := make(chan bool, runtime.GOMAXPROCS(0) * 2) boundedChannel := make(chan bool, runtime.GOMAXPROCS(0)*2)
positionnum := 0 positionnum := 0
for key, value := range resumefile { for key, value := range resumefile {
if key != ".fileguard" && key != "rec" { if key != ".fileguard" && key != "rec" {
@ -561,6 +561,8 @@ func main() {
boundedChannel <- true boundedChannel <- true
go logic(key, value.(map[string]interface{}), &bitdir, &with_label, &with_tags, &qbitdir, comChannel, go logic(key, value.(map[string]interface{}), &bitdir, &with_label, &with_tags, &qbitdir, comChannel,
errChannel, positionnum, &wg, boundedChannel) errChannel, positionnum, &wg, boundedChannel)
} else {
totaljobs--
} }
} }
go func() { go func() {