Skip to content

Commit 32be9c5

Browse files
Implement CPU Affinity Control
1 parent 81e42b2 commit 32be9c5

File tree

8 files changed

+34
-3
lines changed

8 files changed

+34
-3
lines changed

app/src/main/java/com/micewine/emu/activities/GeneralSettings.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,5 +209,6 @@ class GeneralSettings : AppCompatActivity() {
209209
const val DISPLAY_RESOLUTION_DEFAULT_VALUE = "1280x720"
210210
const val DEAD_ZONE = "deadZone"
211211
const val MOUSE_SENSIBILITY = "mouseSensibility"
212+
const val CPU_AFFINITY = "cpuAffinity"
212213
}
213214
}

app/src/main/java/com/micewine/emu/activities/MainActivity.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ import com.micewine.emu.activities.GeneralSettings.Companion.BOX64_SHOWSEGV
7575
import com.micewine.emu.activities.GeneralSettings.Companion.BOX64_SHOWSEGV_DEFAULT_VALUE
7676
import com.micewine.emu.activities.GeneralSettings.Companion.BOX64_SSE42
7777
import com.micewine.emu.activities.GeneralSettings.Companion.BOX64_SSE42_DEFAULT_VALUE
78+
import com.micewine.emu.activities.GeneralSettings.Companion.CPU_AFFINITY
7879
import com.micewine.emu.activities.GeneralSettings.Companion.DISPLAY_RESOLUTION
7980
import com.micewine.emu.activities.GeneralSettings.Companion.DISPLAY_RESOLUTION_DEFAULT_VALUE
8081
import com.micewine.emu.activities.GeneralSettings.Companion.ENABLE_DRI3
@@ -131,6 +132,7 @@ import com.micewine.emu.fragments.SetupFragment
131132
import com.micewine.emu.fragments.SetupFragment.Companion.abortSetup
132133
import com.micewine.emu.fragments.SetupFragment.Companion.dialogTitleText
133134
import com.micewine.emu.fragments.SetupFragment.Companion.progressBarIsIndeterminate
135+
import com.micewine.emu.fragments.WineSettingsFragment.Companion.availableCPUs
134136
import com.micewine.emu.utils.DriveUtils
135137
import com.micewine.emu.utils.FilePathResolver
136138
import io.ByteWriter
@@ -865,6 +867,7 @@ class MainActivity : AppCompatActivity() {
865867
var selectedFile: String = ""
866868
var miceWineVersion: String = "MiceWine ${BuildConfig.VERSION_NAME} (git-${BuildConfig.GIT_SHORT_SHA})"
867869
var vulkanDriverDeviceName: String? = null
870+
var cpuAffinity: String? = null
868871
private var selectedResolution: String? = ""
869872

870873
var selectedFragment = "HomeFragment"
@@ -975,6 +978,8 @@ class MainActivity : AppCompatActivity() {
975978
enableCpuCounter = preferences.getBoolean(CPU_COUNTER_KEY, false)
976979
enableDebugInfo = preferences.getBoolean(ENABLE_DEBUG_INFO_KEY, true)
977980

981+
cpuAffinity = preferences.getString(CPU_AFFINITY, availableCPUs.joinToString(","))
982+
978983
vulkanDriverDeviceName = getVulkanDeviceName()
979984
}
980985

app/src/main/java/com/micewine/emu/core/ShellLoader.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.lifecycle.MutableLiveData
66
import androidx.lifecycle.ViewModel
77
import com.micewine.emu.activities.EmulationActivity.Companion.handler
88
import com.micewine.emu.activities.EmulationActivity.Companion.sharedLogs
9+
import com.micewine.emu.activities.MainActivity.Companion.cpuAffinity
910
import com.micewine.emu.fragments.InfoDialogFragment
1011
import com.micewine.emu.fragments.InfoDialogFragment.Companion.descriptionText
1112
import com.micewine.emu.fragments.InfoDialogFragment.Companion.titleText

app/src/main/java/com/micewine/emu/core/WineWrapper.kt

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
11
package com.micewine.emu.core
22

33
import android.os.Build
4+
import com.micewine.emu.activities.MainActivity.Companion.cpuAffinity
45
import com.micewine.emu.activities.MainActivity.Companion.wineDisksFolder
56
import com.micewine.emu.activities.MainActivity.Companion.winePrefix
67
import com.micewine.emu.core.EnvVars.getEnv
78
import com.micewine.emu.core.ShellLoader.runCommand
89
import com.micewine.emu.core.ShellLoader.runCommandWithOutput
910
import java.io.File
11+
import kotlin.math.abs
1012

1113
object WineWrapper {
1214
private var IS_BOX64 = if (Build.SUPPORTED_ABIS[0] == "x86_64") "" else "box64"
1315

16+
private fun getCpuHexMask(): String {
17+
val availCpus = Runtime.getRuntime().availableProcessors()
18+
val cpuMask = MutableList(availCpus) { '0' }
19+
val cpuAffinity = cpuAffinity?.replace(",", "")
20+
21+
for (i in 0..<cpuAffinity!!.length) {
22+
cpuMask[abs(cpuAffinity[i].toString().toInt() - availCpus) - 1] = '1'
23+
}
24+
25+
return Integer.toHexString(cpuMask.joinToString("").toInt(2))
26+
}
27+
1428
fun wineServer(args: String) {
1529
runCommand(
1630
getEnv() + "$IS_BOX64 wineserver $args"
@@ -25,14 +39,14 @@ object WineWrapper {
2539

2640
fun wine(args: String) {
2741
runCommand(
28-
getEnv() + "WINEPREFIX=$winePrefix $IS_BOX64 wine $args"
42+
getEnv() + "WINEPREFIX=$winePrefix taskset ${getCpuHexMask()} $IS_BOX64 wine $args"
2943
)
3044
}
3145

3246
fun wine(args: String, retLog: Boolean): String {
3347
if (retLog) {
3448
return runCommandWithOutput(
35-
getEnv() + "BOX64_LOG=0 WINEPREFIX=$winePrefix $IS_BOX64 wine $args"
49+
getEnv() + "BOX64_LOG=0 WINEPREFIX=$winePrefix taskset ${getCpuHexMask()} $IS_BOX64 wine $args"
3650
)
3751
}
3852
return ""
@@ -41,7 +55,7 @@ object WineWrapper {
4155
fun wine(args: String, cwd: String) {
4256
runCommand(
4357
"cd $cwd;" +
44-
getEnv() + "WINEPREFIX=$winePrefix $IS_BOX64 wine $args"
58+
getEnv() + "WINEPREFIX=$winePrefix taskset ${getCpuHexMask()} $IS_BOX64 wine $args"
4559
)
4660
}
4761

app/src/main/java/com/micewine/emu/fragments/WineSettingsFragment.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import androidx.fragment.app.Fragment
88
import androidx.recyclerview.widget.GridLayoutManager
99
import androidx.recyclerview.widget.RecyclerView
1010
import com.micewine.emu.R
11+
import com.micewine.emu.activities.GeneralSettings.Companion.CHECKBOX
12+
import com.micewine.emu.activities.GeneralSettings.Companion.CPU_AFFINITY
1113
import com.micewine.emu.activities.GeneralSettings.Companion.ENABLE_SERVICES
1214
import com.micewine.emu.activities.GeneralSettings.Companion.ENABLE_SERVICES_DEFAULT_VALUE
1315
import com.micewine.emu.activities.GeneralSettings.Companion.SPINNER
@@ -48,10 +50,15 @@ class WineSettingsFragment : Fragment() {
4850

4951
addToAdapter(R.string.wine_esync_title, R.string.null_description, null, SWITCH, WINE_ESYNC_DEFAULT_VALUE, WINE_ESYNC)
5052
addToAdapter(R.string.enable_wine_services_title, R.string.null_description, null, SWITCH, ENABLE_SERVICES_DEFAULT_VALUE, ENABLE_SERVICES)
53+
addToAdapter(R.string.cpu_affinity_title, R.string.null_description, availableCPUs, CHECKBOX, availableCPUs.joinToString(","), CPU_AFFINITY)
5154
addToAdapter(R.string.wine_log_level_title, R.string.null_description, arrayOf("minimal", "default"), SPINNER, WINE_LOG_LEVEL_DEFAULT_VALUE, WINE_LOG_LEVEL)
5255
}
5356

5457
private fun addToAdapter(titleId: Int, descriptionId: Int, valuesArray: Array<String>?, type: Int, defaultValue: Any, keyId: String) {
5558
settingsList.add(SettingsListSpinner(titleId, descriptionId, valuesArray, type, "$defaultValue", keyId))
5659
}
60+
61+
companion object {
62+
val availableCPUs = (0 until Runtime.getRuntime().availableProcessors()).map { it.toString() }.toTypedArray()
63+
}
5764
}

app/src/main/res/values-pt-rBR/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,4 +139,5 @@
139139
<string name="box64_manager_title">Gerenciador de Box64</string>
140140
<string name="box64_manager_description">Gerenciar Versões do Box64</string>
141141
<string name="mouse_captured">Mouse Capturado Pressione Voltar ou ESC para Soltar</string>
142+
<string name="cpu_affinity_title">Afinidade de CPU</string>
142143
</resources>

app/src/main/res/values-zh-rCN/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,4 +139,5 @@
139139
<string name="box64_manager_title">Box64 管理器</string>
140140
<string name="box64_manager_description">管理 Box64 版本</string>
141141
<string name="mouse_captured">鼠标已捕获,按下返回键或ESC键释放</string>
142+
<string name="cpu_affinity_title">CPU 关联性</string>
142143
</resources>

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,5 @@
162162
<string name="box64_manager_title">Box64 Manager</string>
163163
<string name="box64_manager_description">Manage Box64 Versions</string>
164164
<string name="mouse_captured">Mouse Captured Press Back or ESC to Release</string>
165+
<string name="cpu_affinity_title">CPU Affinity</string>
165166
</resources>

0 commit comments

Comments
 (0)