changes to procstat malloc behavior
This commit is contained in:
parent
4118ea7292
commit
1606be8556
3 changed files with 24 additions and 11 deletions
|
|
@ -25,7 +25,7 @@ void print_status(procstat_status_t* proc)
|
|||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
// test test
|
||||
// map test
|
||||
{
|
||||
procstat_map_t* maps;
|
||||
size_t map_count;
|
||||
|
|
@ -64,14 +64,14 @@ int main(int argc, char** argv)
|
|||
if (procstat_get_threads(parent->pid, &threads, &thread_count))
|
||||
{
|
||||
fputs("failed to obtain process threads\n", stderr);
|
||||
free(list);
|
||||
procstat_free_status_list(list, count);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (procstat_find_active(threads, thread_count, &active))
|
||||
{
|
||||
// no active threads - free list and continue
|
||||
free(threads);
|
||||
procstat_free_status_list(threads, thread_count);
|
||||
usleep(500*1000);
|
||||
}
|
||||
else
|
||||
|
|
@ -96,8 +96,8 @@ int main(int argc, char** argv)
|
|||
{
|
||||
fprintf(stderr, "failed to attach: %s\n", strerror(errno));
|
||||
|
||||
free(threads);
|
||||
free(list);
|
||||
procstat_free_status_list(threads, thread_count);
|
||||
procstat_free_status_list(list, count);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -116,8 +116,8 @@ int main(int argc, char** argv)
|
|||
|
||||
process_detach_all(threads, thread_count);
|
||||
|
||||
free(threads);
|
||||
free(list);
|
||||
procstat_free_status_list(threads, thread_count);
|
||||
procstat_free_status_list(list, count);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -25,6 +25,8 @@ int procstat_parse_status(pid_t pid, procstat_status_t* status)
|
|||
|
||||
if (rd < 1) return 1;
|
||||
|
||||
memset(status, '\0', sizeof(procstat_status_t));
|
||||
|
||||
char* lineptr = NULL, *line = strtok_r(buffer, "\n", &lineptr);
|
||||
while (line != NULL)
|
||||
{
|
||||
|
|
@ -33,7 +35,9 @@ int procstat_parse_status(pid_t pid, procstat_status_t* status)
|
|||
const char* value = (const char*)strtok_r(NULL, ":\t", &fieldptr);
|
||||
|
||||
if (!strcmp(key, "Name"))
|
||||
strncpy(status->name, value, MAX_PROCESS_NAME);
|
||||
{
|
||||
if (value) status->name = strdup(value);
|
||||
}
|
||||
else if (!strcmp(key, "Umask"))
|
||||
status->umask = (unsigned int)strtoul(value, NULL, 8);
|
||||
else if (!strcmp(key, "State"))
|
||||
|
|
@ -59,6 +63,13 @@ int procstat_parse_status(pid_t pid, procstat_status_t* status)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void procstat_free_status_list(procstat_status_t* list, size_t count)
|
||||
{
|
||||
for (unsigned i = 0; i < count; i++)
|
||||
if (list[i].name) free(list[i].name);
|
||||
free(list);
|
||||
}
|
||||
|
||||
static int is_numeric(const char* str)
|
||||
{
|
||||
for (const char* p = str; *p; p++)
|
||||
|
|
@ -310,7 +321,7 @@ int procstat_parse_maps(pid_t pid, procstat_map_t** maps, size_t* count)
|
|||
// path
|
||||
if (pathname) map->path = strdup(pathname);
|
||||
|
||||
TRACE("map v_start %lx v_end %lx prot %x flags %x f_offset %x dev_major %u dev_minor %u inode %lu path %s\n",
|
||||
TRACE("map v_start %lx v_end %lx prot %x flags %x f_offset %lx dev_major %u dev_minor %u inode %lu path %s\n",
|
||||
map->v_start, map->v_end,
|
||||
map->prot, map->flags,
|
||||
map->f_offset,
|
||||
|
|
|
|||
|
|
@ -15,9 +15,8 @@ typedef enum {
|
|||
ZOMBIE = 'Z'
|
||||
} procstat_state_t;
|
||||
|
||||
#define MAX_PROCESS_NAME 256
|
||||
typedef struct {
|
||||
char name[MAX_PROCESS_NAME];
|
||||
char* name;
|
||||
mode_t umask;
|
||||
procstat_state_t state;
|
||||
pid_t tgid;
|
||||
|
|
@ -33,6 +32,9 @@ typedef struct {
|
|||
// error information obtain from errno
|
||||
int procstat_parse_status(pid_t pid, procstat_status_t* status);
|
||||
|
||||
// free all procstat status list entries
|
||||
void procstat_free_status_list(procstat_status_t* list, size_t count);
|
||||
|
||||
// find any process that matches name, case insensitive.
|
||||
// list pointer must point to NULL-initialized pointer, and count pointer must pount to initialized 0
|
||||
// will skip any process which status couldn't be parsed
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue