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
