Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
htop
Commits
657836a2
Commit
657836a2
authored
Apr 06, 2018
by
Hisham Muhammad
Browse files
Minor style fixes.
parent
63e1417b
Changes
2
Hide whitespace changes
Inline
Side-by-side
darwin/DarwinProcessList.c
View file @
657836a2
...
...
@@ -21,37 +21,6 @@ in the source distribution for its full text.
#include <sys/sysctl.h>
#include <stdbool.h>
struct
kern
{
short
int
version
[
3
];
};
void
GetKernelVersion
(
struct
kern
*
k
)
{
static
short
int
version_
[
3
]
=
{
0
};
if
(
!
version_
[
0
])
{
// just in case it fails someday
version_
[
0
]
=
version_
[
1
]
=
version_
[
2
]
=
-
1
;
char
str
[
256
]
=
{
0
};
size_t
size
=
sizeof
(
str
);
int
ret
=
sysctlbyname
(
"kern.osrelease"
,
str
,
&
size
,
NULL
,
0
);
if
(
ret
==
0
)
sscanf
(
str
,
"%hd.%hd.%hd"
,
&
version_
[
0
],
&
version_
[
1
],
&
version_
[
2
]);
}
memcpy
(
k
->
version
,
version_
,
sizeof
(
version_
));
}
/* compare the given os version with the one installed returns:
0 if equals the installed version
positive value if less than the installed version
negative value if more than the installed version
*/
int
CompareKernelVersion
(
short
int
major
,
short
int
minor
,
short
int
component
)
{
struct
kern
k
;
GetKernelVersion
(
&
k
);
if
(
k
.
version
[
0
]
!=
major
)
return
k
.
version
[
0
]
-
major
;
if
(
k
.
version
[
1
]
!=
minor
)
return
k
.
version
[
1
]
-
minor
;
if
(
k
.
version
[
2
]
!=
component
)
return
k
.
version
[
2
]
-
component
;
return
0
;
}
/*{
#include "ProcessList.h"
#include <mach/mach_host.h>
...
...
@@ -71,19 +40,51 @@ typedef struct DarwinProcessList_ {
}*/
typedef
struct
kern
{
short
int
version
[
3
];
}
kern_
;
static
void
getKernelVersion
(
struct
kern
*
k
)
{
static
short
int
version_
[
3
]
=
{
0
};
if
(
!
version_
[
0
])
{
// just in case it fails someday
version_
[
0
]
=
version_
[
1
]
=
version_
[
2
]
=
-
1
;
char
str
[
256
]
=
{
0
};
size_t
size
=
sizeof
(
str
);
int
ret
=
sysctlbyname
(
"kern.osrelease"
,
str
,
&
size
,
NULL
,
0
);
if
(
ret
==
0
)
sscanf
(
str
,
"%hd.%hd.%hd"
,
&
version_
[
0
],
&
version_
[
1
],
&
version_
[
2
]);
}
memcpy
(
k
->
version
,
version_
,
sizeof
(
version_
));
}
static
int
compareKernelVersion
(
short
int
major
,
short
int
minor
,
short
int
component
)
{
/*
compare the given os version with the one installed returns:
0 if equals the installed version
positive value if less than the installed version
negative value if more than the installed version
*/
struct
kern
k
;
getKernelVersion
(
&
k
);
if
(
k
.
version
[
0
]
!=
major
)
return
k
.
version
[
0
]
-
major
;
if
(
k
.
version
[
1
]
!=
minor
)
return
k
.
version
[
1
]
-
minor
;
if
(
k
.
version
[
2
]
!=
component
)
return
k
.
version
[
2
]
-
component
;
return
0
;
}
void
ProcessList_getHostInfo
(
host_basic_info_data_t
*
p
)
{
mach_msg_type_number_t
info_size
=
HOST_BASIC_INFO_COUNT
;
if
(
0
!=
host_info
(
mach_host_self
(),
HOST_BASIC_INFO
,
(
host_info_t
)
p
,
&
info_size
))
{
CRT_fatalError
(
"Unable to retrieve host info
\n
"
);
if
(
0
!=
host_info
(
mach_host_self
(),
HOST_BASIC_INFO
,
(
host_info_t
)
p
,
&
info_size
))
{
CRT_fatalError
(
"Unable to retrieve host info
\n
"
);
}
}
void
ProcessList_freeCPULoadInfo
(
processor_cpu_load_info_t
*
p
)
{
if
(
NULL
!=
p
&&
NULL
!=
*
p
)
{
if
(
0
!=
munmap
(
*
p
,
vm_page_size
))
{
CRT_fatalError
(
"Unable to free old CPU load information
\n
"
);
}
if
(
NULL
!=
p
&&
NULL
!=
*
p
)
{
if
(
0
!=
munmap
(
*
p
,
vm_page_size
))
{
CRT_fatalError
(
"Unable to free old CPU load information
\n
"
);
}
}
*
p
=
NULL
;
...
...
@@ -94,7 +95,7 @@ unsigned ProcessList_allocateCPULoadInfo(processor_cpu_load_info_t *p) {
unsigned
cpu_count
;
// TODO Improving the accuracy of the load counts woule help a lot.
if
(
0
!=
host_processor_info
(
mach_host_self
(),
PROCESSOR_CPU_LOAD_INFO
,
&
cpu_count
,
(
processor_info_array_t
*
)
p
,
&
info_size
))
{
if
(
0
!=
host_processor_info
(
mach_host_self
(),
PROCESSOR_CPU_LOAD_INFO
,
&
cpu_count
,
(
processor_info_array_t
*
)
p
,
&
info_size
))
{
CRT_fatalError
(
"Unable to retrieve CPU info
\n
"
);
}
...
...
@@ -102,10 +103,10 @@ unsigned ProcessList_allocateCPULoadInfo(processor_cpu_load_info_t *p) {
}
void
ProcessList_getVMStats
(
vm_statistics_t
p
)
{
mach_msg_type_number_t
info_size
=
HOST_VM_INFO_COUNT
;
mach_msg_type_number_t
info_size
=
HOST_VM_INFO_COUNT
;
if
(
host_statistics
(
mach_host_self
(),
HOST_VM_INFO
,
(
host_info_t
)
p
,
&
info_size
)
!=
0
)
CRT_fatalError
(
"Unable to retrieve VM statistics
\n
"
);
if
(
host_statistics
(
mach_host_self
(),
HOST_VM_INFO
,
(
host_info_t
)
p
,
&
info_size
)
!=
0
)
CRT_fatalError
(
"Unable to retrieve VM statistics
\n
"
);
}
struct
kinfo_proc
*
ProcessList_getKInfoProcs
(
size_t
*
count
)
{
...
...
@@ -160,65 +161,65 @@ void ProcessList_delete(ProcessList* this) {
}
void
ProcessList_goThroughEntries
(
ProcessList
*
super
)
{
DarwinProcessList
*
dpl
=
(
DarwinProcessList
*
)
super
;
bool
preExisting
=
true
;
struct
kinfo_proc
*
ps
;
size_t
count
;
DarwinProcess
*
proc
;
struct
timeval
tv
;
gettimeofday
(
&
tv
,
NULL
);
/* Start processing time */
/* Update the global data (CPU times and VM stats) */
ProcessList_freeCPULoadInfo
(
&
dpl
->
prev_load
);
dpl
->
prev_load
=
dpl
->
curr_load
;
ProcessList_allocateCPULoadInfo
(
&
dpl
->
curr_load
);
ProcessList_getVMStats
(
&
dpl
->
vm_stats
);
/* Get the time difference */
dpl
->
global_diff
=
0
;
for
(
int
i
=
0
;
i
<
dpl
->
super
.
cpuCount
;
++
i
)
{
for
(
size_t
j
=
0
;
j
<
CPU_STATE_MAX
;
++
j
)
{
dpl
->
global_diff
+=
dpl
->
curr_load
[
i
].
cpu_ticks
[
j
]
-
dpl
->
prev_load
[
i
].
cpu_ticks
[
j
];
}
}
/* Clear the thread counts */
super
->
kernelThreads
=
0
;
super
->
userlandThreads
=
0
;
super
->
totalTasks
=
0
;
super
->
runningTasks
=
0
;
/* We use kinfo_procs for initial data since :
*
* 1) They always succeed.
* 2) The contain the basic information.
*
* We attempt to fill-in additional information with libproc.
*/
ps
=
ProcessList_getKInfoProcs
(
&
count
);
for
(
size_t
i
=
0
;
i
<
count
;
++
i
)
{
proc
=
(
DarwinProcess
*
)
ProcessList_getProcess
(
super
,
ps
[
i
].
kp_proc
.
p_pid
,
&
preExisting
,
(
Process_New
)
DarwinProcess_new
);
DarwinProcess_setFromKInfoProc
(
&
proc
->
super
,
&
ps
[
i
],
tv
.
tv_sec
,
preExisting
);
DarwinProcess_setFromLibprocPidinfo
(
proc
,
dpl
);
// Disabled for High Sierra due to bug in macOS High Sierra
bool
isScanThreadSupported
=
!
(
C
ompareKernelVersion
(
17
,
0
,
0
)
>=
0
&&
C
ompareKernelVersion
(
17
,
5
,
0
)
<
0
);
if
(
isScanThreadSupported
){
DarwinProcess_scanThreads
(
proc
);
}
super
->
totalTasks
+=
1
;
if
(
!
preExisting
)
{
proc
->
super
.
user
=
UsersTable_getRef
(
super
->
usersTable
,
proc
->
super
.
st_uid
);
ProcessList_add
(
super
,
&
proc
->
super
);
}
}
free
(
ps
);
DarwinProcessList
*
dpl
=
(
DarwinProcessList
*
)
super
;
bool
preExisting
=
true
;
struct
kinfo_proc
*
ps
;
size_t
count
;
DarwinProcess
*
proc
;
struct
timeval
tv
;
gettimeofday
(
&
tv
,
NULL
);
/* Start processing time */
/* Update the global data (CPU times and VM stats) */
ProcessList_freeCPULoadInfo
(
&
dpl
->
prev_load
);
dpl
->
prev_load
=
dpl
->
curr_load
;
ProcessList_allocateCPULoadInfo
(
&
dpl
->
curr_load
);
ProcessList_getVMStats
(
&
dpl
->
vm_stats
);
/* Get the time difference */
dpl
->
global_diff
=
0
;
for
(
int
i
=
0
;
i
<
dpl
->
super
.
cpuCount
;
++
i
)
{
for
(
size_t
j
=
0
;
j
<
CPU_STATE_MAX
;
++
j
)
{
dpl
->
global_diff
+=
dpl
->
curr_load
[
i
].
cpu_ticks
[
j
]
-
dpl
->
prev_load
[
i
].
cpu_ticks
[
j
];
}
}
/* Clear the thread counts */
super
->
kernelThreads
=
0
;
super
->
userlandThreads
=
0
;
super
->
totalTasks
=
0
;
super
->
runningTasks
=
0
;
/* We use kinfo_procs for initial data since :
*
* 1) They always succeed.
* 2) The contain the basic information.
*
* We attempt to fill-in additional information with libproc.
*/
ps
=
ProcessList_getKInfoProcs
(
&
count
);
for
(
size_t
i
=
0
;
i
<
count
;
++
i
)
{
proc
=
(
DarwinProcess
*
)
ProcessList_getProcess
(
super
,
ps
[
i
].
kp_proc
.
p_pid
,
&
preExisting
,
(
Process_New
)
DarwinProcess_new
);
DarwinProcess_setFromKInfoProc
(
&
proc
->
super
,
&
ps
[
i
],
tv
.
tv_sec
,
preExisting
);
DarwinProcess_setFromLibprocPidinfo
(
proc
,
dpl
);
// Disabled for High Sierra due to bug in macOS High Sierra
bool
isScanThreadSupported
=
!
(
c
ompareKernelVersion
(
17
,
0
,
0
)
>=
0
&&
c
ompareKernelVersion
(
17
,
5
,
0
)
<
0
);
if
(
isScanThreadSupported
){
DarwinProcess_scanThreads
(
proc
);
}
super
->
totalTasks
+=
1
;
if
(
!
preExisting
)
{
proc
->
super
.
user
=
UsersTable_getRef
(
super
->
usersTable
,
proc
->
super
.
st_uid
);
ProcessList_add
(
super
,
&
proc
->
super
);
}
}
free
(
ps
);
}
darwin/DarwinProcessList.h
View file @
657836a2
...
...
@@ -26,6 +26,7 @@ typedef struct DarwinProcessList_ {
}
DarwinProcessList
;
void
ProcessList_getHostInfo
(
host_basic_info_data_t
*
p
);
void
ProcessList_freeCPULoadInfo
(
processor_cpu_load_info_t
*
p
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment