Fix deadlock in update-self
This commit is contained in:
parent
d9215feda5
commit
0c0b9e6b9c
@ -23,7 +23,7 @@ type dl_data struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func render_progress(done, total uint64, screen_width uint) string {
|
func render_progress(done, total uint64, screen_width uint) string {
|
||||||
return fmt.Sprintln(1111111, done, total)
|
return fmt.Sprint(1111111, done, total)
|
||||||
}
|
}
|
||||||
|
|
||||||
func DownloadFileWithProgress(destpath, url string, kill_if_signaled bool) (err error) {
|
func DownloadFileWithProgress(destpath, url string, kill_if_signaled bool) (err error) {
|
||||||
@ -41,10 +41,11 @@ func DownloadFileWithProgress(destpath, url string, kill_if_signaled bool) (err
|
|||||||
|
|
||||||
report_progress := func(done, total uint64) error {
|
report_progress := func(done, total uint64) error {
|
||||||
dl_data.mutex.Lock()
|
dl_data.mutex.Lock()
|
||||||
defer dl_data.mutex.Unlock()
|
|
||||||
dl_data.done = done
|
dl_data.done = done
|
||||||
dl_data.total = total
|
dl_data.total = total
|
||||||
if dl_data.canceled_by_user {
|
canceled := dl_data.canceled_by_user
|
||||||
|
dl_data.mutex.Unlock()
|
||||||
|
if canceled {
|
||||||
return Canceled
|
return Canceled
|
||||||
}
|
}
|
||||||
lp.WakeupMainThread()
|
lp.WakeupMainThread()
|
||||||
@ -57,20 +58,21 @@ func DownloadFileWithProgress(destpath, url string, kill_if_signaled bool) (err
|
|||||||
dl_data.mutex.Unlock()
|
dl_data.mutex.Unlock()
|
||||||
err := utils.DownloadToFile(destpath, url, report_progress, register_temp_file_path)
|
err := utils.DownloadToFile(destpath, url, report_progress, register_temp_file_path)
|
||||||
dl_data.mutex.Lock()
|
dl_data.mutex.Lock()
|
||||||
defer dl_data.mutex.Unlock()
|
|
||||||
dl_data.download_finished = true
|
dl_data.download_finished = true
|
||||||
if err != Canceled && err != nil {
|
if err != Canceled && err != nil {
|
||||||
dl_data.error_from_download = err
|
dl_data.error_from_download = err
|
||||||
lp.WakeupMainThread()
|
|
||||||
}
|
}
|
||||||
|
dl_data.mutex.Unlock()
|
||||||
|
lp.WakeupMainThread()
|
||||||
}
|
}
|
||||||
|
|
||||||
redraw := func() {
|
redraw := func() {
|
||||||
lp.QueueWriteString("\r")
|
lp.QueueWriteString("\r")
|
||||||
lp.ClearToEndOfLine()
|
lp.ClearToEndOfLine()
|
||||||
dl_data.mutex.Lock()
|
dl_data.mutex.Lock()
|
||||||
defer dl_data.mutex.Unlock()
|
done, total := dl_data.done, dl_data.total
|
||||||
if dl_data.done+dl_data.total == 0 {
|
dl_data.mutex.Unlock()
|
||||||
|
if done+total == 0 {
|
||||||
lp.QueueWriteString("Waiting for download to start...")
|
lp.QueueWriteString("Waiting for download to start...")
|
||||||
} else {
|
} else {
|
||||||
sz, err := lp.ScreenSize()
|
sz, err := lp.ScreenSize()
|
||||||
@ -78,7 +80,7 @@ func DownloadFileWithProgress(destpath, url string, kill_if_signaled bool) (err
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
w = 80
|
w = 80
|
||||||
}
|
}
|
||||||
lp.QueueWriteString(render_progress(dl_data.done, dl_data.total, w))
|
lp.QueueWriteString(render_progress(done, total, w))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,12 +99,17 @@ func DownloadFileWithProgress(destpath, url string, kill_if_signaled bool) (err
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
lp.OnWakeup = func() error {
|
lp.OnWakeup = func() error {
|
||||||
lp.DebugPrintln("11111111111111")
|
|
||||||
dl_data.mutex.Lock()
|
dl_data.mutex.Lock()
|
||||||
defer dl_data.mutex.Unlock()
|
err := dl_data.error_from_download
|
||||||
if dl_data.error_from_download != nil {
|
finished := dl_data.download_finished
|
||||||
|
dl_data.mutex.Unlock()
|
||||||
|
if err != nil {
|
||||||
return dl_data.error_from_download
|
return dl_data.error_from_download
|
||||||
}
|
}
|
||||||
|
if finished {
|
||||||
|
lp.Quit(0)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
redraw()
|
redraw()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -110,9 +117,9 @@ func DownloadFileWithProgress(destpath, url string, kill_if_signaled bool) (err
|
|||||||
if event.MatchesPressOrRepeat("ctrl+c") || event.MatchesPressOrRepeat("esc") {
|
if event.MatchesPressOrRepeat("ctrl+c") || event.MatchesPressOrRepeat("esc") {
|
||||||
event.Handled = true
|
event.Handled = true
|
||||||
dl_data.mutex.Lock()
|
dl_data.mutex.Lock()
|
||||||
defer dl_data.mutex.Unlock()
|
|
||||||
dl_data.canceled_by_user = true
|
dl_data.canceled_by_user = true
|
||||||
lp.Quit(1)
|
dl_data.mutex.Unlock()
|
||||||
|
return Canceled
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -40,7 +40,7 @@ func DownloadToWriter(url string, dest io.Writer, progress_callback ReportFunc)
|
|||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
if resp.StatusCode != http.StatusOK {
|
if resp.StatusCode != http.StatusOK {
|
||||||
return fmt.Errorf("The server responded with the HTTP error %d (%s)", resp.StatusCode, resp.Status)
|
return fmt.Errorf("The server responded with the HTTP error: %s", resp.Status)
|
||||||
}
|
}
|
||||||
wc := write_counter{report: progress_callback}
|
wc := write_counter{report: progress_callback}
|
||||||
cl, err := strconv.Atoi(resp.Header.Get("Content-Length"))
|
cl, err := strconv.Atoi(resp.Header.Get("Content-Length"))
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user