myxce/src/worker/include/process_manager.h

131 lines
3.5 KiB
C

#ifndef PROCESS_MANAGER_H
#define PROCESS_MANAGER_H
#include <stdbool.h>
#include <stddef.h>
#ifdef _WIN32
#include <windows.h>
typedef HANDLE process_handle_t;
#else
#include <pthread.h>
#include <unistd.h>
typedef pid_t process_handle_t;
#endif
#include "sqlite3.h"
typedef struct {
process_handle_t handle;
char* command; // command line
char* work_dir; // working directory
int status; // process status (0: stopped, 1: running)
int exit_code; // exit code
int output_fd; // output file descriptor
char* log_file; // log file path
#ifdef _WIN32
HANDLE pipe_read; // pipe read handle
HANDLE monitor_thread; // monitor thread handle
bool monitor_active; // monitor thread active flag
#endif
} process_info_t;
typedef struct process_manager {
process_info_t* processes;
size_t process_count;
int update_interval;
bool running;
bool initialized;
#ifdef _WIN32
HANDLE thread;
CRITICAL_SECTION lock;
#else
pthread_t thread;
pthread_mutex_t lock;
#endif
} process_manager_t;
/**
* @brief initialize process info structure
* @param proc process info structure
* @return void
*/
void process_info_init(process_info_t* proc);
/**
* @brief initialize process info structure
* @return process_manager_t* if success, NULL if failed
*/
process_manager_t* process_manager_create(void);
/**
* @brief start a new process
* @param manager process manager without resource limits
* @param command command with arguments
* @return 0 if success, -1 if failed
*/
int process_manager_start_process(process_manager_t* manager,
const char* command);
/**
* @brief get the number of processes
* @param manager process manager
* @return the number of processes
*/
int get_process_count(process_manager_t* manager);
/**
* @brief get the current process pid
* @param manager process manager
* @return the current process pid
*/
int get_current_process_pid(process_manager_t* manager);
/**
* @brief update the process status in the list
* @param manager process manager
* @return true if success, false if failed
*/
bool process_manager_update(process_manager_t* manager);
/**
* @brief get process info by handle
* @param manager process manager
* @param handle process handle
* @return process_info_t* if success, NULL if failed
*/
process_info_t* process_manager_get_process_info(process_manager_t* manager,
process_handle_t handle);
/**
* @brief terminate a process
* @param manager process manager
* @param handle process handle
* @return 0 if success, -1 if failed
*/
int process_manager_terminate_process(process_manager_t* manager,
process_handle_t handle);
/**
* @brief destroy process manager
* @param manager process manager
* @return void
*/
void process_manager_destroy(process_manager_t* manager);
/**
* @brief remove a process from the list
* @param manager process manager
* @param handle process handle
* @return 0 if success, -1 if failed
*/
int process_manager_remove_process(process_manager_t* manager,
process_handle_t handle);
/**
* @brief free process manager
* @param manager process manager
* @return void
*/
void process_manager_free(process_manager_t* manager);
#endif // PROCESS_MANAGER_H