osutil: implement setprocname to set process title for some platforms
This patch adds a simple setprocname method to osutil. The operation is not
defined by any standard and is platform-specific, the current implementation
tries to cover some major platforms (ex. Linux, OS X, FreeBSD) that is
relatively easy to support. Other platforms (Windows [4], other BSDs, ...)
can be added in the future.
The current implementation supports two methods to change process title:
a. setproctitle if available (works in FreeBSD).
b. rewrite argv in place (works in Linux [1] and Mac OS X). [2] [3]
[1]: Linux has "prctl(PR_SET_NAME, ...)" but 1) it has 16-byte limit, which
is too small; 2) it is not quite equivalent to what we want - it changes
"/proc/self/comm", not "/proc/self/cmdline" - "comm" change won't show up
in "ps" output unless "-o comm" is used.
[2]: The implementation does not rewrite the **environ buffer like some
other implementations do, just to make the code simpler and safer. However,
this also means the buffer size we can rewrite is significantly shorter. If
we are really greedy and want the "environ" space, we can change the
implementation later.
[3]: It requires a CPython private API: Py_GetArgcArgv to get the original
argv. Unfortunately Python 3 makes a copy of argv and returns the wchar_t
version, so it is not supported for now. (if we really want to, we could
count backwards from "char **environ", given known argc and argv, not sure
if that's a good idea - probably not)
[4]: The feature is aimed to make it easier for forked command server
processes to show what they are doing. Since Windows does not support
fork(), despite it's a major platform, its support is not added in this
patch.
basic:
* neither file exists
creating
* neither file still exists
* empty file x created
creating
* file x changed size
creating
* nothing changed with either file
* file x changed inode
creating
* empty file y created
creating
* file y changed size
creating
* file y changed inode
creating
* both files changed inode
creating
fakeuncacheable:
* neither file exists
creating
* neither file still exists
creating
* empty file x created
creating
* file x changed size
creating
* nothing changed with either file
creating
* file x changed inode
creating
* empty file y created
creating
* file y changed size
creating
* file y changed inode
creating
* both files changed inode
creating
repository tip rolled back to revision -1 (undo commit)
working directory now based on revision -1
repository tip rolled back to revision -1 (undo commit)
working directory now based on revision -1
setbeforeget:
* neither file exists
string set externally
* file x created
creating
string from function
* string set externally again
string 2 set externally
* file y created
creating
string from function
antiambiguity: