Just assume Platform_meterTypes[0] is always &CPUMeter_class for every
platform. This removes a conditional in AvailableMetersPanel_new().
Also adds some comments about the logic here. Without assuming
Platform_meterTypes[0], the (int i=1) clause in this for loop will not
make sense. (I.e. Why not (int i=0)? )
Also replaced a sprintf() call with safer snprintf() in code further
below.
Two changes in this commit:
- All meters now explicitly specify "maxItems" property, even for just
1 item. (Exception is "container" CPU meter classes, which use
CUSTOM_METERMODE.)
- "maxItems" being 0 is now allowed. This will let bar meters and graph
meters render an empty meter.
calloc() allows 'nmemb' or 'size' to be zero, in which case NULL may be
returned. Letting htop die because of either argument being zero doesn't
make sense.
As a side note: As size_t is unsigned, compiler should be able to optimize
conditional (nmemb > 0 && size > 0) to (nmemb && size). This theorically
shouldn't increase code size too much.
Namely:
o use malloc where an xCalloc slipped in
o safeguard against an empty arg list - I don't think it's possible,
but it would be potentially exploitable
o we need to initialize the arg string to an empty string because we no
longer use strlcpy(3)
o annotate a tricky use of strlcpy(3)'s truncation
Including:
o set *basenameEnd even in error cases (FreeBSD probably needs this)
o use kvm_openfiles(3) rather than kvm_open(3) so that we can report
errors (as with FreeBSD)
o sanify the process argument list creation by using strlcat(3)
o drop the pageSizeKb variable and use the PAGE_SIZE_KB macro directly,
as the page size can't change anyway
o clean up a few macros, add MINIMUM() and MAXIMUM() (should be
mirrored to FreeBSD)
o fix some syntax
o add some useful comments
This involves switching from kvm_open(3) to kvm_openfiles(3). The only
difference is that the latter has saner error reporting (see the man
page for details). We can now fatally report the error rather than just
calling assert(3).
Once a process goes zombie on Linux, /proc/PID/cmdline
gets empty. So, when we detect it is a zombie we stop
reading this file.
For processes that were zombies before htop started,
there's no way to get the full name.
Closes#49.
This simplifies the protocol between the platform-independent
and platform-specific parts. The platform-specific parts
were supposed to re-determine the value of process->show
on each iteration, and the Darwin subsystem wasn't doing that.
Instead of adding the code to the Darwin part, I lifted the
burden of the OS-specific of resetting process->show: now
they can choose to hide a process if they want to (e.g.
detecting kernel threads) but are not required to
(e.g. on Darwin where we're not listing threads separately (yet?)).
Fixes tree view collapsing/expanding on OSX. Closes#416.