1
0
mirror of https://github.com/lutris/lutris synced 2024-07-05 16:38:42 +00:00

[fix regression] Remove psutil, it could cause Lutris to slow down while game is running

This commit is contained in:
daniel-j 2017-09-04 11:12:58 +02:00 committed by djazz
parent 8a566ebb84
commit 85f3d893e2
8 changed files with 69 additions and 46 deletions

View File

@ -12,6 +12,6 @@ before_install:
install:
- pip install --upgrade pip
- sudo apt-get -qq update
- sudo apt-get install -y python3-yaml python3-psutil python3-gi gir1.2-gtk-3.0 psmisc gir1.2-glib-2.0 libgirepository1.0-dev
- sudo apt-get install -y python3-yaml python3-gi gir1.2-gtk-3.0 psmisc gir1.2-glib-2.0 libgirepository1.0-dev
script: nosetests

View File

@ -8,8 +8,7 @@ Lutris should work on any Gnome system, the following depencies should be
installed:
* python > 3.4
* python3-yaml
* python3-psutil
* python-yaml
* PyGobject
* libsoup-gnome

1
debian/control vendored
View File

@ -20,7 +20,6 @@ Architecture: any
Depends: ${misc:Depends},
${python3:Depends},
python3-yaml,
python3-psutil,
python3-gi,
gir1.2-gtk-3.0,
psmisc,

View File

@ -21,11 +21,11 @@ BuildRequires: python3-devel
%if 0%{?fedora_version}
BuildRequires: python3-gobject, python3-wheel, python3-setuptools, python3-gobject
Requires: python3-gobject, python3-PyYAML, python3-psutil, cabextract
Requires: python3-gobject, python3-PyYAML, cabextract
%endif
%if 0%{?rhel_version} || 0%{?centos_version}
BuildRequires: python3-gobject
Requires: python3-gobject, python3-PyYAML, python3-psutil, cabextract
Requires: python3-gobject, python3-PyYAML, cabextract
%endif
%if 0%{?suse_version}
BuildRequires: python3-gobject
@ -34,7 +34,7 @@ BuildRequires: update-desktop-files
BuildRequires: hicolor-icon-theme
BuildRequires: polkit
BuildRequires: python3-setuptools
Requires: python3-gobject, python3-PyYAML, python3-psutil, cabextract
Requires: python3-gobject, python3-PyYAML, cabextract
%endif
%if 0%{?fedora_version} || 0%{?suse_version}
BuildRequires: fdupes

View File

@ -4,7 +4,6 @@ import os
import time
import shlex
import subprocess
import psutil
from lutris import settings
from lutris.gui.dialogs import DownloadDialog
@ -38,7 +37,7 @@ def is_running():
if pid:
# If process is defunct, don't consider it as running
process = Process(pid)
return process.state != psutil.STATUS_ZOMBIE
return process.state != 'Z'
else:
return False

View File

@ -8,7 +8,6 @@ import shlex
import threading
import subprocess
import contextlib
import psutil
from collections import defaultdict
from gi.repository import GLib
@ -259,7 +258,7 @@ class LutrisThread(threading.Thread):
continue
num_watched_children += 1
processes['monitored'].append(str(child))
if child.state == psutil.STATUS_ZOMBIE:
if child.state == 'Z':
terminated_children += 1
if processes != self.monitored_processes:

View File

@ -1,5 +1,5 @@
import os
import psutil
import signal
from lutris.util.log import logger
@ -13,39 +13,48 @@ class Process(object):
self.pid = int(pid)
except ValueError:
raise InvalidPid("'%s' is not a valid pid" % pid)
self.process = None
self.children = []
self.children_pids = []
self.parent = None
try:
self.process = psutil.Process(self.pid)
except psutil.NoSuchProcess:
return
self.get_children()
def __repr__(self):
return "Process {}".format(self.pid)
def __str__(self):
if self.process and self.process.is_running():
return "{} ({}:{})".format(self.name, self.pid, self.state)
return str(self.pid)
return "{} ({}:{})".format(self.name, self.pid, self.state)
def get_stat(self, parsed=True):
stat_filename = "/proc/{}/stat".format(self.pid)
if not os.path.exists(stat_filename):
return
with open(stat_filename) as stat_file:
try:
_stat = stat_file.readline()
except (ProcessLookupError, FileNotFoundError):
logger.warning('Unable to read stat for process %s', self.pid)
return
if parsed:
return _stat[_stat.rfind(")") + 1:].split()
return _stat
def get_thread_ids(self):
"""Return a list of thread ids opened by process."""
if self.process and self.process.is_running():
return [c.id for c in self.process.threads()]
basedir = '/proc/{}/task/'.format(self.pid)
if os.path.isdir(basedir):
try:
return [tid for tid in os.listdir(basedir)]
except FileNotFoundError:
return []
else:
return []
def get_children_pids_of_thread(self, tid):
"""Return pids of child processes opened by thread `tid` of process."""
children = []
try:
p = psutil.Process(tid)
children = [c.pid for c in p.children()]
except:
pass
children_path = '/proc/{}/task/{}/children'.format(self.pid, tid)
if os.path.exists(children_path):
with open(children_path) as children_file:
children = children_file.read().strip().split()
return children
def get_children(self):
@ -57,8 +66,9 @@ class Process(object):
@property
def name(self):
"""Filename of the executable."""
if self.process and self.process.is_running():
return self.process.name()
_stat = self.get_stat(parsed=False)
if _stat:
return _stat[_stat.find("(") + 1:_stat.rfind(")")]
@property
def state(self):
@ -67,24 +77,39 @@ class Process(object):
sleep, Z is zombie, T is traced or stopped (on a signal), and W is
paging.
"""
if self.process and self.process.is_running():
return self.process.status()
return psutil.STATUS_ZOMBIE
_stat = self.get_stat()
if _stat:
return _stat[0]
@property
def ppid(self):
"""PID of the parent."""
_stat = self.get_stat()
if _stat:
return _stat[1]
@property
def pgrp(self):
"""Process group ID of the process."""
_stat = self.get_stat()
if _stat:
return _stat[2]
@property
def cmdline(self):
"""Return command line used to run the process `pid`."""
if self.process and self.process.is_running():
return self.process.cmdline()
cmdline_path = '/proc/{}/cmdline'.format(self.pid)
with open(cmdline_path) as cmdline_file:
_cmdline = cmdline_file.read().replace('\x00', ' ')
return _cmdline
@property
def cwd(self):
if self.process and self.process.is_running():
cwd_path = self.process.cwd()
return os.readlink(cwd_path)
cwd_path = '/proc/%d/cwd' % int(self.pid)
return os.readlink(cwd_path)
def kill(self):
try:
self.process.kill()
os.kill(self.pid, signal.SIGKILL)
except OSError:
logger.error("Could not kill process %s", self.pid)

View File

@ -6,7 +6,6 @@ import string
import subprocess
import sys
import traceback
import psutil
from lutris.util.log import logger
@ -138,7 +137,7 @@ def get_pid(program, multiple=False):
def get_all_pids():
"""Return all pids of currently running processes"""
return psutil.pids()
return [int(pid) for pid in os.listdir('/proc') if pid.isdigit()]
def kill_pid(pid):
@ -147,15 +146,18 @@ def kill_pid(pid):
except ValueError:
logger.error("Invalid pid %s")
return
psutil.Process(pid).kill()
execute(['kill', '-9', pid])
def get_command_line(pid):
"""Return command line used to run the process `pid`."""
try:
return psutil.Process(pid).cmdline()
except:
pass
cmdline = None
cmdline_path = '/proc/{}/cmdline'.format(pid)
if os.path.exists(cmdline_path):
with open(cmdline_path) as cmdline_file:
cmdline = cmdline_file.read()
cmdline = cmdline.replace('\x00', ' ')
return cmdline
def python_identifier(string):