diff --git a/cmd/syncthing/main.go b/cmd/syncthing/main.go index b392bcaf..0372b22f 100644 --- a/cmd/syncthing/main.go +++ b/cmd/syncthing/main.go @@ -915,6 +915,12 @@ func syncthingMain(runtimeOptions RuntimeOptions) { cleanConfigDirectory() + if cfg.Options().SetLowPriority { + if err := osutil.SetLowPriority(); err != nil { + l.Warnln("Failed to lower process priority:", err) + } + } + code := <-stop mainService.Stop() diff --git a/lib/config/config_test.go b/lib/config/config_test.go index 38ad0e2c..5245f6eb 100644 --- a/lib/config/config_test.go +++ b/lib/config/config_test.go @@ -76,6 +76,7 @@ func TestDefaultValues(t *testing.T) { KCPUpdateIntervalMs: 25, KCPFastResend: false, DefaultFolderPath: "~", + SetLowPriority: true, } cfg := New(device1) @@ -224,6 +225,7 @@ func TestOverriddenValues(t *testing.T) { KCPUpdateIntervalMs: 1000, KCPFastResend: true, DefaultFolderPath: "/media/syncthing", + SetLowPriority: false, } os.Unsetenv("STNOUPGRADE") diff --git a/lib/config/optionsconfiguration.go b/lib/config/optionsconfiguration.go index 74e1df4a..578bd6ad 100644 --- a/lib/config/optionsconfiguration.go +++ b/lib/config/optionsconfiguration.go @@ -143,6 +143,7 @@ type OptionsConfiguration struct { KCPSendWindowSize int `xml:"kcpSendWindowSize" json:"kcpSendWindowSize" default:"128"` KCPReceiveWindowSize int `xml:"kcpReceiveWindowSize" json:"kcpReceiveWindowSize" default:"128"` DefaultFolderPath string `xml:"defaultFolderPath" json:"defaultFolderPath" default:"~"` + SetLowPriority bool `xml:"setLowPriority" json:"setLowPriority" default:"true"` DeprecatedUPnPEnabled bool `xml:"upnpEnabled,omitempty" json:"-"` DeprecatedUPnPLeaseM int `xml:"upnpLeaseMinutes,omitempty" json:"-"` diff --git a/lib/config/testdata/overridenvalues.xml b/lib/config/testdata/overridenvalues.xml index 1ab0f2d6..d8387aa4 100644 --- a/lib/config/testdata/overridenvalues.xml +++ b/lib/config/testdata/overridenvalues.xml @@ -44,5 +44,6 @@ 1000 true /media/syncthing + false diff --git a/lib/osutil/lowprio_linux.go b/lib/osutil/lowprio_linux.go new file mode 100644 index 00000000..c3b6ab48 --- /dev/null +++ b/lib/osutil/lowprio_linux.go @@ -0,0 +1,61 @@ +// Copyright (C) 2018 The Syncthing Authors. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at https://mozilla.org/MPL/2.0/. + +package osutil + +import ( + "syscall" + + "github.com/pkg/errors" +) + +const ioprioClassShift = 13 + +type ioprioClass int + +const ( + ioprioClassRT ioprioClass = iota + 1 + ioprioClassBE + ioprioClassIdle +) + +const ( + ioprioWhoProcess = iota + 1 + ioprioWhoPGRP + ioprioWhoUser +) + +func ioprioSet(class ioprioClass, value int) error { + res, _, err := syscall.Syscall(syscall.SYS_IOPRIO_SET, + uintptr(ioprioWhoProcess), 0, + uintptr(class)<