spilt find_tests and create_test_proc_files, add workquue for loading tests
This commit is contained in:
@@ -7,6 +7,7 @@ project (${module_name})
|
||||
if(NOT KERNEL_DIR)
|
||||
Set(KERNEL_DIR "/lib/modules/${CMAKE_SYSTEM_VERSION}/build" )
|
||||
endif()
|
||||
|
||||
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror -pedantic -Weverything")
|
||||
|
||||
file(GLOB module_src_files
|
||||
|
||||
@@ -67,7 +67,7 @@ struct seq_file* test_proc_file;
|
||||
|
||||
//{ global function implements region
|
||||
|
||||
result_code_e create_proc_test_file(/* inout */ ptr_test_list_item_s list_item)
|
||||
result_code_e create_proc_test_file(/* in */ const ptr_test_list_item_s list_item)
|
||||
{
|
||||
char buffer[MAX_FILE_NAME_LEN];
|
||||
const char * file_name = &buffer[0];
|
||||
|
||||
@@ -16,7 +16,7 @@ extern "C" {
|
||||
|
||||
//{ function region
|
||||
|
||||
extern result_code_e create_proc_test_file(/* inout */ ptr_test_list_item_s list_item);
|
||||
extern result_code_e create_proc_test_file(/* in */ const ptr_test_list_item_s list_item);
|
||||
|
||||
//}
|
||||
|
||||
|
||||
@@ -11,8 +11,6 @@
|
||||
|
||||
//{ local include region
|
||||
|
||||
#include "kunity_proc_test_file_handler.h"
|
||||
|
||||
//}
|
||||
|
||||
//{ local define region
|
||||
@@ -45,7 +43,7 @@ static result_code_e create_test_list(/* out */ ptr_test_list_s* test_list_locat
|
||||
|
||||
static result_code_e destroy_test(/* in */ ptr_test_s* test_location);
|
||||
|
||||
static result_code_e destroy_test_list_item(/* in */ ptr_test_list_item_s* test_list_item_location, /* out */ ptr_test_list_item_s* next_test_item_location);
|
||||
static result_code_e destroy_test_list_item(/* in */ const ptr_test_list_item_s test_list_item);
|
||||
|
||||
static result_code_e add_test_list_item(/* in */ ptr_test_list_item_s test_item, /* in */ ptr_test_list_s test_list);
|
||||
|
||||
@@ -86,6 +84,27 @@ result_code_e find_tests(/* in */ const ptr_test_query_s query)
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
result_code_e iterate_test_list(/* in */ const ptr_test_list_s test_list, test_list_iterator item_function)
|
||||
{
|
||||
ptr_test_list_item_s tmp_test_item = NULL;
|
||||
if (test_list == NULL || item_function == NULL) {
|
||||
return ERROR_NULL_ARGUMENT;
|
||||
}
|
||||
|
||||
tmp_test_item = test_list->head;
|
||||
while (tmp_test_item != NULL) {
|
||||
const ptr_test_list_item_s tmp_next_test_item = tmp_test_item->next;
|
||||
result_code_e result = item_function(tmp_test_item);
|
||||
if (result != OK) {
|
||||
return result;
|
||||
}
|
||||
|
||||
tmp_test_item = tmp_next_test_item;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
//}
|
||||
|
||||
//{ local function implements region
|
||||
@@ -131,12 +150,6 @@ static result_code_e create_test_list_item(/* in */ const ptr_test_s test, /* ou
|
||||
|
||||
tmp_test_item->test = test;
|
||||
tmp_test_item->next = NULL;
|
||||
if (create_proc_test_file(tmp_test_item) != OK) {
|
||||
pr_info ("fail");
|
||||
destroy_test_list_item(&tmp_test_item, NULL);
|
||||
return ERROR_INVALID_OPERATION;
|
||||
}
|
||||
pr_info ("ok");
|
||||
*test_list_item_location = tmp_test_item;
|
||||
return OK;
|
||||
}
|
||||
@@ -174,43 +187,28 @@ static result_code_e destroy_test(/* in */ ptr_test_s* test_location)
|
||||
return OK;
|
||||
}
|
||||
|
||||
static result_code_e destroy_test_list_item(/* in */ ptr_test_list_item_s* test_list_item_location, /* out */ ptr_test_list_item_s* next_test_item_location)
|
||||
static result_code_e destroy_test_list_item(/* in */ const ptr_test_list_item_s test_list_item)
|
||||
{
|
||||
ptr_test_list_item_s tmp_list_item = NULL;
|
||||
if (test_list_item_location == NULL || *test_list_item_location == NULL) {
|
||||
if (test_list_item == NULL) {
|
||||
return ERROR_NULL_ARGUMENT;
|
||||
}
|
||||
|
||||
tmp_list_item = *test_list_item_location;
|
||||
if (next_test_item_location != NULL) {
|
||||
*next_test_item_location = tmp_list_item->next;
|
||||
}
|
||||
|
||||
destroy_test(&tmp_list_item->test);
|
||||
kfree(tmp_list_item);
|
||||
*test_list_item_location = NULL;
|
||||
test_list_item->next = NULL;
|
||||
destroy_test(&test_list_item->test);
|
||||
kfree(test_list_item);
|
||||
return OK;
|
||||
}
|
||||
|
||||
result_code_e destroy_test_list(/* in */ ptr_test_list_s* test_list_location)
|
||||
{
|
||||
ptr_test_list_s tmp_list = NULL;
|
||||
ptr_test_list_item_s tmp_test_item = NULL;
|
||||
if (test_list_location == NULL || *test_list_location == NULL) {
|
||||
return ERROR_NULL_ARGUMENT;
|
||||
}
|
||||
|
||||
tmp_list = *test_list_location;
|
||||
tmp_test_item = tmp_list->head;
|
||||
while (tmp_test_item != NULL) {
|
||||
ptr_test_list_item_s tmp_next_test_item = NULL;
|
||||
if (destroy_test_list_item(&tmp_test_item, &tmp_next_test_item) != OK) {
|
||||
break;
|
||||
}
|
||||
|
||||
tmp_test_item = tmp_next_test_item;
|
||||
}
|
||||
|
||||
iterate_test_list(tmp_list, destroy_test_list_item);
|
||||
tmp_list->head = NULL;
|
||||
kfree(tmp_list);
|
||||
*test_list_location = NULL;
|
||||
return OK;
|
||||
@@ -257,7 +255,7 @@ static int find_test_for_each(void* data, const char* namebuf, struct module* mo
|
||||
}
|
||||
|
||||
if (add_test_list_item(test_item, query->result_list) != OK) {
|
||||
destroy_test_list_item(&test_item, NULL);
|
||||
destroy_test_list_item(test_item);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -18,6 +18,7 @@ extern result_code_e find_tests(/* in */ const ptr_test_query_s query);
|
||||
|
||||
extern result_code_e destroy_test_list(/* in */ ptr_test_list_s* test_list_location);
|
||||
|
||||
extern result_code_e iterate_test_list (/* in */ const ptr_test_list_s test_list, test_list_iterator item_function);
|
||||
//}
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -54,6 +54,8 @@ typedef struct test_query_sTag {
|
||||
ptr_test_list_s result_list;
|
||||
} test_query_s, *ptr_test_query_s;
|
||||
|
||||
typedef result_code_e (*test_list_iterator) (/* in */ const ptr_test_list_item_s);
|
||||
|
||||
//}
|
||||
|
||||
#endif // KUNITY_TEST_FINDER_T_H
|
||||
|
||||
@@ -3,11 +3,13 @@
|
||||
#include <kunity_t.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
//}
|
||||
|
||||
//{ local include region
|
||||
|
||||
#include "kunity_proc_test_file_handler.h"
|
||||
#include "kunity_test_finder.h"
|
||||
|
||||
//}
|
||||
@@ -34,18 +36,25 @@
|
||||
|
||||
//{ local function prototype region
|
||||
|
||||
static void init_tests(struct work_struct* work);
|
||||
static int kunity_init(void);
|
||||
static void kunity_exit(void);
|
||||
|
||||
//}
|
||||
|
||||
//{ global variabel implements region
|
||||
extern struct proc_dir_entry * proc_dir;
|
||||
|
||||
extern struct proc_dir_entry* proc_dir;
|
||||
|
||||
//}
|
||||
|
||||
//{ local variabel implements region
|
||||
|
||||
static test_query_s query = { KUNITY_DEFAULT_TEST_NAME_FITER_STR, "*"};
|
||||
static struct workqueue_struct* queue;
|
||||
|
||||
DECLARE_WORK(work, init_tests);
|
||||
|
||||
static test_query_s query = { KUNITY_DEFAULT_TEST_NAME_FITER_STR, "*" };
|
||||
//}
|
||||
|
||||
//{ global function implements region
|
||||
@@ -54,16 +63,36 @@ static test_query_s query = { KUNITY_DEFAULT_TEST_NAME_FITER_STR, "*"};
|
||||
|
||||
//{ local function implements region
|
||||
|
||||
static void init_tests(struct work_struct* work)
|
||||
{
|
||||
pr_info("init tests");
|
||||
proc_dir = proc_mkdir("kunity_test", NULL);
|
||||
if (proc_dir == NULL || find_tests(&query) != OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
iterate_test_list(query.result_list, &create_proc_test_file);
|
||||
}
|
||||
|
||||
static int kunity_init()
|
||||
{
|
||||
pr_info("init kunity_test_runner_module");
|
||||
proc_dir = proc_mkdir("kunity_test", NULL);
|
||||
return -find_tests(&query);
|
||||
queue = create_workqueue("test_runner_work_queue");
|
||||
if (queue == NULL) {
|
||||
return -ERROR_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
return !queue_work(queue, &work);
|
||||
}
|
||||
|
||||
static void kunity_exit()
|
||||
{
|
||||
pr_info("init kunity_test_runner_module");
|
||||
pr_info("exit kunity_test_runner_module");
|
||||
if (queue == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
destroy_workqueue(queue);
|
||||
destroy_test_list(&query.result_list);
|
||||
proc_remove(proc_dir);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user