TODO
====

A collection of ideas and notes about stuff to implement in future versions.
"#NNN" occurrences refer to bug tracker issues at:
https://github.com/giampaolo/psutil/issues


HIGHER PRIORITY
===============

 * OpenBSD support.

 * #371: CPU temperature (apparently OSX and Linux only; on Linux it requires
   lm-sensors lib).

 * #269: expose network ifaces RX/TW queues. This should probably go into
   net_if_stats(). Figure out on what platforms this is supported:
   Linux: yes
   Others: ?

 * Process.threads(): thread names; patch for OSX available at:
   https://code.google.com/p/plcrashreporter/issues/detail?id=65

 * Asynchronous psutil.Popen (see http://bugs.python.org/issue1191964)

 * (Windows) fall back on using WMIC for Process methods returning AccessDenied

 * #613: thread names.

 * #604: emulate os.getloadavg() on Windows

 * #269: NIC rx/tx queue.


LOWER PRIORITY
==============

 * #355: Android support.

 * #276: GNU/Hurd support.

 * #429: NetBSD support.

 * DragonFlyBSD support?

 * AIX support?

 * examples/taskmgr-gui.py (using tk).

 * system-wide number of open file descriptors:
    * https://jira.hyperic.com/browse/SIGAR-30
    * http://www.netadmintools.com/part295.html

 * Number of system threads.
    * Windows: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684824(v=vs.85).aspx

 * #357: what CPU a process is on.

  * Doc / wiki which compares similarities between UNIX cli tools and psutil.
   Example:
   df -a  ->  psutil.disk_partitions
   lsof   ->  psutil.Process.open_files() and psutil.Process.open_connections()
   killall->  (actual script)
   tty    ->  psutil.Process.terminal()
   who    ->  psutil.users()


DEBATABLE
=========

 * psutil.proc_tree() something which obtains a {pid:ppid, ...} dict for
   all running processes in one shot. This can be factored out from
   Process.children() and exposed as a first class function.
   PROS: on Windows we can take advantage of _psutil_windows.ppid_map()
   which is faster than iterating over all pids and calling ppid().
   CONS: examples/pstree.py shows this can be easily done in the user code
   so maybe it's not worth the addition.

 * advanced cmdline interface exposing the whole API and providing different
   kind of outputs (e.g. pprinted, colorized, json).

 * [Linux]: process cgroups (http://en.wikipedia.org/wiki/Cgroups). They look
   similar to prlimit() in terms of functionality but uglier (they should allow
   limiting per-process network IO resources though, which is great). Needs
   further reading.

 * Should we expose OS constants (psutil.WINDOWS, psutil.OSX etc.)?

 * Python 3.3. exposed different sched.h functions:
   http://docs.python.org/dev/whatsnew/3.3.html#os
   http://bugs.python.org/issue12655
   http://docs.python.org/dev/library/os.html#interface-to-the-scheduler
   It might be worth to take a look and figure out whether we can include some
   of those in psutil.
   Also, we can probably reimplement wait_pid() on POSIX which is currently
   implemented as a busy-loop.

 * Certain systems provide CPU times about process children. On those systems
   Process.cpu_times() might return a (user, system, user_children,
   system_children) ntuple.
   * Linux: /proc/{PID}/stat
   * Solaris: pr_cutime and pr_cstime
   * FreeBSD: none
   * OSX: none
   * Windows: none

 * ...also, os.times() provides 'elapsed' times as well.

 * ...also Linux provides guest_time and cguest_time.

 * Enrich exception classes hierarchy on Python >= 3.3 / post PEP-3151 so that:
   - NoSuchProcess inherits from ProcessLookupError
   - AccessDenied inherits from PermissionError
   - TimeoutExpired inherits from TimeoutError (debatable)
   See: http://docs.python.org/3/library/exceptions.html#os-exceptions

 * Process.threads() might grow an extra "id" parameter so that it can be
   used as such:

    >>> p = psutil.Process(os.getpid())
    >>> p.threads(id=psutil.current_thread_id())
    thread(id=2539, user_time=0.03, system_time=0.02)
    >>>

   Note: this leads to questions such as "should we have a custom NoSuchThread
   exception? Also see issue #418.

   Note #2: this would work with os.getpid() only.
   psutil.current_thread_id() might be desirable as per issue #418 though.

  * should psutil.TimeoutExpired exception have a 'msg' kwarg similar to
    NoSuchProcess and AccessDenied? Not that we need it, but currently we
    cannot raise a TimeoutExpired exception with a specific error string.

  * process_iter() might grow an "attrs" parameter similar to Process.as_dict()
    invoke the necessary methods and include the results into a "cache"
    attribute attached to the returned Process instances so that one can avoid
    catching NSP and AccessDenied:
        for p in process_iter(attrs=['cpu_percent']):
            print(p.cache['cpu_percent'])
    This also leads questions as whether we should introduce a sorting order.

  * round Process.memory_percent() result?

  * #550: number of threads per core.

  * Have psutil.Process().cpu_affinity([]) be an alias for "all CPUs"?


COMPATIBILITY BREAKAGE
======================

Removals (will likely happen in 2.2):

 * (S) psutil.Process.nice  (deprecated in 0.5.0)
 * (S) get_process_list  (deprecated in 0.5.0)
 * (S) psutil.*mem* functions  (deprecated in 0.3.0 and 0.6.0)
 * (M) psutil.network_io_counters  (deprecated in 1.0.0)
 * (M) local_address and remote_address Process.connection() namedtuple fields
       (deprecated in 1.0.0)


REJECTED IDEAS
==============

STUB