Sindbad~EG File Manager
/**
@file
@brief Process (aka task) info storage
@details Copyright (c) 2017-2021 Acronis International GmbH
@author Ivan Matveev (ivan.matveev@acronis.com)
@since $Id: $
*/
#pragma once
#include "transport_protocol.h" // task_status_t
#include <linux/path.h>
#include <linux/rbtree.h>
#include <linux/spinlock.h>
#include <linux/types.h> // bool
typedef struct {
struct rb_node rb_node;
pid_t pid;
atomic_t ref_cnt;
spinlock_t spinlock;
task_status_t status;
struct path exe_path;
struct list_head exited_list_item;
} task_info_t;
const char *task_status_to_string(task_status_t status);
task_info_t *task_info_ref(task_info_t *info);
void task_info_unref(task_info_t *info);
int task_info_map_init(void);
void task_info_map_down(void);
void task_info_map_clear(void);
// if not found return NULL
task_info_t *task_info_lookup(pid_t pid);
task_info_t *task_info_get(pid_t pid);
// errors:
// 1. ENOMEM - alloc failed
// 2. EINVAL - task_info with sutch pid already exist
// on success return 0
int task_info_map_add(pid_t pid, task_status_t status, struct path exe_path);
// Same as task_info_map_add(), but before call should call 'task_info_map_lock()'
int task_info_map_add_impl(pid_t pid, task_status_t status, struct path exe_path);
int task_info_map_del(pid_t pid);
// ========================= useful wrappers ========================= //
// if pid not found return TS_UNKNOWN
task_status_t task_info_status_get(pid_t pid);
// create task_info struct if needed
// errors:
// 1. ENOMEM - alloc failed
// 2. ENOENT - no such pid or task_struct without executable file
// 3. EINVAL - task_info with sutch pid already exist - synchronisation broken
int task_info_status_set(pid_t pid, task_status_t status);
void task_info_map_delete_exited(void);
void task_info_map_on_exit_event(pid_t tgid, pid_t pid);
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists