/**
@file     ptrace_manager.c
@brief    Manager for ptrace
@details  Copyright (c) 2026 Acronis International GmbH
@author   Bruce Wang (bruce.wang@acronis.com)
@since    $Id: $
*/

#include "ptrace_manager.h"

lru_hashtable_manager_t *global_ptrace_manager;

// MARK: Ptrace manager
int ptrace_manager_init(void)
{
	return lru_hashtable_manager_init(&global_ptrace_manager);
}

void ptrace_manager_deinit(void)
{
	lru_hashtable_manager_deinit(global_ptrace_manager);
}

void ptrace_manager_activate(void)
{
	lru_hashtable_manager_activate(global_ptrace_manager);
}

void ptrace_manager_deactivate(void)
{
	lru_hashtable_manager_deactivate(global_ptrace_manager);
}

static bool ptrace_manager_key_exist(const lru_hashtable_key_t *key)
{
	return lru_hashtable_manager_key_exist(global_ptrace_manager, key, LRU_HASHTABLE_KEY_TYPE_PTRACE);
}

bool ptrace_should_send(task_info_t *caller_task_info, task_info_t *target_task_info, unsigned int mode)
{
	lru_hashtable_key_t key;

	key.ptrace_key.access_mode = mode;
	key.ptrace_key.caller_pid_version = READ_ONCE(caller_task_info->pid_version);
	key.ptrace_key.target_pid_version = READ_ONCE(target_task_info->pid_version);

	if (ptrace_manager_key_exist(&key))
	{
		return false;
	}

	return true;
}