diff --git a/linux/LinuxProcess.c b/linux/LinuxProcess.c index 39b5647e6fc08f4f89e77f7e793a186f844d3ce1..09ccbe13c564cd4f8dd69eefd0f63e580e02429f 100644 --- a/linux/LinuxProcess.c +++ b/linux/LinuxProcess.c @@ -93,6 +93,7 @@ typedef enum LinuxProcessFields { typedef struct LinuxProcess_ { Process super; + bool isKernelThread; IOPriority ioPriority; unsigned long int cminflt; unsigned long int cmajflt; @@ -142,7 +143,7 @@ typedef struct LinuxProcess_ { } LinuxProcess; #ifndef Process_isKernelThread -#define Process_isKernelThread(_process) (_process->pgrp == 0) +#define Process_isKernelThread(_process) ((LinuxProcess*)(_process)->isKernelThread) #endif #ifndef Process_isUserlandThread diff --git a/linux/LinuxProcess.h b/linux/LinuxProcess.h index 9400d7be50771e6a34037025075d193e4c90c20c..d75fe89db05e579b6ab709cd56bf9b890d323733 100644 --- a/linux/LinuxProcess.h +++ b/linux/LinuxProcess.h @@ -85,6 +85,7 @@ typedef enum LinuxProcessFields { typedef struct LinuxProcess_ { Process super; + bool isKernelThread; IOPriority ioPriority; unsigned long int cminflt; unsigned long int cmajflt; @@ -134,7 +135,7 @@ typedef struct LinuxProcess_ { } LinuxProcess; #ifndef Process_isKernelThread -#define Process_isKernelThread(_process) (_process->pgrp == 0) +#define Process_isKernelThread(_process) (((LinuxProcess*)(_process))->isKernelThread) #endif #ifndef Process_isUserlandThread diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c index 158a7ea2d0a5d5104827380b8ab11efe90bc184c..2edd0425d5daa3f2b66fa815f106b4a4c27d6544 100644 --- a/linux/LinuxProcessList.c +++ b/linux/LinuxProcessList.c @@ -677,9 +677,6 @@ static void setCommand(Process* process, const char* command, int len) { } static bool LinuxProcessList_readCmdlineFile(Process* process, const char* dirname, const char* name) { - if (Process_isKernelThread(process)) - return true; - char filename[MAX_NAME+1]; xSnprintf(filename, MAX_NAME, "%s/%s/cmdline", dirname, name); int fd = open(filename, O_RDONLY); @@ -691,7 +688,10 @@ static bool LinuxProcessList_readCmdlineFile(Process* process, const char* dirna close(fd); int tokenEnd = 0; int lastChar = 0; - if (amtRead <= 0) { + if (amtRead == 0) { + ((LinuxProcess*)process)->isKernelThread = true; + return true; + } else if (amtRead < 0) { return false; } for (int i = 0; i < amtRead; i++) {