Skip to content
Snippets Groups Projects
Commit b6f47683 authored by Leandre Lacourt's avatar Leandre Lacourt
Browse files

mise en place d'un fichier para vide si compilé sans tâche

parent acce0ecc
No related branches found
No related tags found
No related merge requests found
...@@ -31,144 +31,145 @@ let main () = ...@@ -31,144 +31,145 @@ let main () =
(* creates the files *) (* creates the files *)
let cfile = open_out ("para.c") in let cfile = open_out ("para.c") in
let hfile = open_out ("para.h") in
(* includes *)
fprintf cfile "#include <stdio.h>\n";
fprintf cfile "#include <pthread.h>\n";
fprintf cfile "#include <semaphore.h>\n";
fprintf cfile "#include <errno.h>\n";
fprintf cfile "#include <time.h>\n";
fprintf cfile "#include <sys/time.h>\n";
fprintf cfile "#include \"%s.h\"\n" !Parser.name;
fprintf cfile "\n";
(* semaphores macro *)
fprintf cfile "/* Initialize the semaphore with the given count. */\n";
fprintf cfile "#define SEM_INIT(sem, v, max_v) sem_init(&(sem), 0, (v))\n";
fprintf cfile "/* wait for the semaphore to be active (i.e. equal to 1) and then decrement it by one. */\n";
fprintf cfile "#define SEM_WAIT(sem) while (sem_wait(&sem) != 0 && errno == EINTR) continue\n";
fprintf cfile "/* make the semaphore active (i.e. equal to 1) */\n";
fprintf cfile "#define SEM_SIGNAL(sem) sem_post(&(sem))\n";
fprintf cfile "\n";
fprintf cfile "/* task structures */\n";
let print_task_structs task =
fprintf cfile "typedef struct {\n";
fprintf cfile "\t%s_ctx_type ctx;\n" task.name;
fprintf cfile "\tsem_t sem_start;\n";
fprintf cfile "\tsem_t sem_join;\n";
fprintf cfile "pthread_t thr;\n}";
fprintf cfile "%s_TASK_struct;" task.name;
fprintf cfile "\n\n"
in
List.iter print_task_structs !tasks;
fprintf cfile "/* runners */\n";
let print_task_runners task =
fprintf cfile "void* %s_runner(void* cd) {\n" task.name;
fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) cd;\n" task.name task.name;
fprintf cfile "\twhile(1){\n";
fprintf cfile "\t\tSEM_WAIT(ts->sem_start);\n";
fprintf cfile "\t\t%s_step(&ts->ctx);\n" task.name;
fprintf cfile "\t\tSEM_SIGNAL(ts->sem_join);\n";
fprintf cfile "\t}\n";
fprintf cfile "}\n\n"
in
List.iter print_task_runners !tasks;
fprintf cfile "/* task Initializers */\n";
let print_task_inits task =
fprintf cfile "%s_TASK_type %s_TASK_init() {\n" task.name task.name;
fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*)calloc(1, sizeof(%s_TASK_struct));\n" task.name task.name task.name;
if task.memory then fprintf cfile "\t%s_ctx_init(&ts->ctx);\n" task.name;
fprintf cfile "\tSEM_INIT(ts->sem_start, 0, 1);\n";
fprintf cfile "\tSEM_INIT(ts->sem_join, 0, 1);\n";
fprintf cfile "\tpthread_create(&(ts->thr), NULL, %s_runner, ts);\n" task.name;
fprintf cfile "\treturn (void*) ts;\n";
fprintf cfile "}\n\n"
in
List.iter print_task_inits !tasks;
fprintf cfile "/* task resets */\n";
let print_task_resets task =
if task.memory then
(fprintf cfile "void %s_TASK_reset(%s_TASK_type tD) {\n" task.name task.name;
fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" task.name task.name;
fprintf cfile "\t%s_ctx_reset(&ts->ctx);\n" task.name;
fprintf cfile "}\n\n")
else
(fprintf cfile "void %s_TASK_reset(%s_TASK_type tD) {\n" task.name task.name;
fprintf cfile "}\n\n")
in
List.iter print_task_resets !tasks;
fprintf cfile "/* task start */\n";
let print_task_starts task =
fprintf cfile "void %s_TASK_START(%s_TASK_type tD) {\n" task.name task.name;
fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" task.name task.name;
fprintf cfile "\tSEM_SIGNAL(ts->sem_start);\n";
fprintf cfile "}\n\n"
in
List.iter print_task_starts !tasks;
fprintf cfile "/* task join */\n";
let print_task_joins task =
fprintf cfile "void %s_TASK_JOIN(%s_TASK_type tD) {\n" task.name task.name;
fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" task.name task.name;
fprintf cfile "\tSEM_WAIT(ts->sem_join);\n";
fprintf cfile "}\n\n"
in
List.iter print_task_joins !tasks;
fprintf cfile "/* task inputs */\n"; if((List.length !tasks) > 0) then
let print_task_inputs task = (* includes *)
let (print_var_inputs : string -> variable -> unit) = fprintf cfile "#include <stdio.h>\n";
fun name var -> fprintf cfile "#include <pthread.h>\n";
fprintf cfile "void %s_TASK_setin_%s(%s_TASK_type tD, %s %s) {\n" name var.name name var.var_type var.name; fprintf cfile "#include <semaphore.h>\n";
fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" name name; fprintf cfile "#include <errno.h>\n";
fprintf cfile "\tts->ctx.%s = %s;\n" var.name var.name; fprintf cfile "#include <time.h>\n";
fprintf cfile "}\n\n"; fprintf cfile "#include <sys/time.h>\n";
fprintf cfile "#include \"%s.h\"\n" !Parser.name;
fprintf cfile "\n";
(* semaphores macro *)
fprintf cfile "/* Initialize the semaphore with the given count. */\n";
fprintf cfile "#define SEM_INIT(sem, v, max_v) sem_init(&(sem), 0, (v))\n";
fprintf cfile "/* wait for the semaphore to be active (i.e. equal to 1) and then decrement it by one. */\n";
fprintf cfile "#define SEM_WAIT(sem) while (sem_wait(&sem) != 0 && errno == EINTR) continue\n";
fprintf cfile "/* make the semaphore active (i.e. equal to 1) */\n";
fprintf cfile "#define SEM_SIGNAL(sem) sem_post(&(sem))\n";
fprintf cfile "\n";
fprintf cfile "/* task structures */\n";
let print_task_structs task =
fprintf cfile "typedef struct {\n";
fprintf cfile "\t%s_ctx_type ctx;\n" task.name;
fprintf cfile "\tsem_t sem_start;\n";
fprintf cfile "\tsem_t sem_join;\n";
fprintf cfile "pthread_t thr;\n}";
fprintf cfile "%s_TASK_struct;" task.name;
fprintf cfile "\n\n"
in
List.iter print_task_structs !tasks;
fprintf cfile "/* runners */\n";
let print_task_runners task =
fprintf cfile "void* %s_runner(void* cd) {\n" task.name;
fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) cd;\n" task.name task.name;
fprintf cfile "\twhile(1){\n";
fprintf cfile "\t\tSEM_WAIT(ts->sem_start);\n";
fprintf cfile "\t\t%s_step(&ts->ctx);\n" task.name;
fprintf cfile "\t\tSEM_SIGNAL(ts->sem_join);\n";
fprintf cfile "\t}\n";
fprintf cfile "}\n\n"
in in
List.iter (print_var_inputs task.name) task.var_in; List.iter print_task_runners !tasks;
in
List.iter print_task_inputs !tasks; fprintf cfile "/* task Initializers */\n";
let print_task_inits task =
fprintf cfile "/* task outputs */\n"; fprintf cfile "%s_TASK_type %s_TASK_init() {\n" task.name task.name;
let print_task_outputs task = fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*)calloc(1, sizeof(%s_TASK_struct));\n" task.name task.name task.name;
let (print_var_outputs : string -> variable -> unit) = if task.memory then fprintf cfile "\t%s_ctx_init(&ts->ctx);\n" task.name;
fun name var -> fprintf cfile "\tSEM_INIT(ts->sem_start, 0, 1);\n";
fprintf cfile "void %s_TASK_getout_%s(%s_TASK_type tD, %s* p%s) {\n" name var.name name var.var_type var.name; fprintf cfile "\tSEM_INIT(ts->sem_join, 0, 1);\n";
fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" name name; fprintf cfile "\tpthread_create(&(ts->thr), NULL, %s_runner, ts);\n" task.name;
fprintf cfile "\t*p%s = ts->ctx.%s;\n" var.name var.name; fprintf cfile "\treturn (void*) ts;\n";
fprintf cfile "}\n\n"; fprintf cfile "}\n\n"
in in
List.iter (print_var_outputs task.name) task.var_out; List.iter print_task_inits !tasks;
in
List.iter print_task_outputs !tasks; fprintf cfile "/* task resets */\n";
let print_task_resets task =
if task.memory then
(fprintf cfile "void %s_TASK_reset(%s_TASK_type tD) {\n" task.name task.name;
fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" task.name task.name;
fprintf cfile "\t%s_ctx_reset(&ts->ctx);\n" task.name;
fprintf cfile "}\n\n")
else
(fprintf cfile "void %s_TASK_reset(%s_TASK_type tD) {\n" task.name task.name;
fprintf cfile "}\n\n")
in
List.iter print_task_resets !tasks;
let hfile = open_out ("para.h") in fprintf cfile "/* task start */\n";
fprintf hfile "#ifndef _PARA_H\n#define _PARA_H\n\n"; let print_task_starts task =
fprintf cfile "void %s_TASK_START(%s_TASK_type tD) {\n" task.name task.name;
let print_h_tasks task = fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" task.name task.name;
fprintf hfile "typedef void* %s_TASK_type;\n" task.name; fprintf cfile "\tSEM_SIGNAL(ts->sem_start);\n";
fprintf hfile "extern %s_TASK_type %s_TASK_init();\n" task.name task.name; fprintf cfile "}\n\n"
fprintf hfile "extern void %s_TASK_reset(%s_TASK_type tD);\n" task.name task.name; in
fprintf hfile "extern void %s_TASK_START(%s_TASK_type tD);\n" task.name task.name; List.iter print_task_starts !tasks;
fprintf hfile "extern void %s_TASK_JOIN(%s_TASK_type tD);\n" task.name task.name;
let (print_h_task_inputs : Types.variable -> unit) = fun var -> fprintf cfile "/* task join */\n";
fprintf hfile "extern void %s_TASK_setin_%s(%s_TASK_type tD, %s %s);\n" task.name var.name task.name var.var_type var.name let print_task_joins task =
fprintf cfile "void %s_TASK_JOIN(%s_TASK_type tD) {\n" task.name task.name;
fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" task.name task.name;
fprintf cfile "\tSEM_WAIT(ts->sem_join);\n";
fprintf cfile "}\n\n"
in
List.iter print_task_joins !tasks;
fprintf cfile "/* task inputs */\n";
let print_task_inputs task =
let (print_var_inputs : string -> variable -> unit) =
fun name var ->
fprintf cfile "void %s_TASK_setin_%s(%s_TASK_type tD, %s %s) {\n" name var.name name var.var_type var.name;
fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" name name;
fprintf cfile "\tts->ctx.%s = %s;\n" var.name var.name;
fprintf cfile "}\n\n";
in
List.iter (print_var_inputs task.name) task.var_in;
in in
List.iter print_h_task_inputs task.var_in; List.iter print_task_inputs !tasks;
let (print_h_task_outputs : Types.variable -> unit) = fun var ->
fprintf hfile "extern void %s_TASK_getout_%s(%s_TASK_type td, %s* %s);\n" task.name var.name task.name var.var_type var.name fprintf cfile "/* task outputs */\n";
let print_task_outputs task =
let (print_var_outputs : string -> variable -> unit) =
fun name var ->
fprintf cfile "void %s_TASK_getout_%s(%s_TASK_type tD, %s* p%s) {\n" name var.name name var.var_type var.name;
fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" name name;
fprintf cfile "\t*p%s = ts->ctx.%s;\n" var.name var.name;
fprintf cfile "}\n\n";
in
List.iter (print_var_outputs task.name) task.var_out;
in in
List.iter print_h_task_outputs task.var_out List.iter print_task_outputs !tasks;
in
List.iter print_h_tasks !tasks; fprintf hfile "#ifndef _PARA_H\n#define _PARA_H\n\n";
fprintf hfile "#endif";
let print_h_tasks task =
fprintf hfile "typedef void* %s_TASK_type;\n" task.name;
fprintf hfile "extern %s_TASK_type %s_TASK_init();\n" task.name task.name;
fprintf hfile "extern void %s_TASK_reset(%s_TASK_type tD);\n" task.name task.name;
fprintf hfile "extern void %s_TASK_START(%s_TASK_type tD);\n" task.name task.name;
fprintf hfile "extern void %s_TASK_JOIN(%s_TASK_type tD);\n" task.name task.name;
let (print_h_task_inputs : Types.variable -> unit) = fun var ->
fprintf hfile "extern void %s_TASK_setin_%s(%s_TASK_type tD, %s %s);\n" task.name var.name task.name var.var_type var.name
in
List.iter print_h_task_inputs task.var_in;
let (print_h_task_outputs : Types.variable -> unit) = fun var ->
fprintf hfile "extern void %s_TASK_getout_%s(%s_TASK_type td, %s* %s);\n" task.name var.name task.name var.var_type var.name
in
List.iter print_h_task_outputs task.var_out
in
List.iter print_h_tasks !tasks;
fprintf hfile "#endif";
......
...@@ -83,19 +83,17 @@ let (save_variable_attributes : Types.variable -> (string * Yaml.value) -> unit) ...@@ -83,19 +83,17 @@ let (save_variable_attributes : Types.variable -> (string * Yaml.value) -> unit)
|_ -> assert false |_ -> assert false
let (save_variables_in : Types.task -> Yaml.value -> unit) = fun task x -> let (save_variables_in : Types.task -> Yaml.value -> unit) = fun task x ->
let v = {name = ""; var_type = ""}::[] let v = {name = ""; var_type = ""}::[] in
in
match x with match x with
|`O l -> |`O l -> assert (v <> []);
List.iter (save_variable_attributes (List.hd v)) l; List.iter (save_variable_attributes (List.hd v)) l;
task.var_in <- v @ task.var_in task.var_in <- v @ task.var_in
|_ -> assert false |_ -> assert false
let (save_variables_out : Types.task -> Yaml.value -> unit) = fun task x -> let (save_variables_out : Types.task -> Yaml.value -> unit) = fun task x ->
let v = {name = ""; var_type = ""}::[] let v = {name = ""; var_type = ""}::[] in
in
match x with match x with
|`O l -> |`O l -> assert (v <> []);
List.iter (save_variable_attributes (List.hd v)) l; List.iter (save_variable_attributes (List.hd v)) l;
task.var_out <- v @ task.var_out task.var_out <- v @ task.var_out
|_ -> assert false |_ -> assert false
...@@ -119,7 +117,7 @@ let (save_data_task : Types.task -> (string * Yaml.value) -> unit) = ...@@ -119,7 +117,7 @@ let (save_data_task : Types.task -> (string * Yaml.value) -> unit) =
let (save_data_tasks : Yaml.value -> unit) = fun x -> let (save_data_tasks : Yaml.value -> unit) = fun x ->
let task = {name = ""; var_in = []; var_out = []; memory = true}::[] in let task = {name = ""; var_in = []; var_out = []; memory = true}::[] in
match x with match x with
|`O l -> |`O l -> assert (task <> []);
List.iter (save_data_task (List.hd task)) l; List.iter (save_data_task (List.hd task)) l;
tasks := !tasks @ task tasks := !tasks @ task
|_ -> assert false |_ -> assert false
...@@ -127,6 +125,7 @@ let (save_data_tasks : Yaml.value -> unit) = fun x -> ...@@ -127,6 +125,7 @@ let (save_data_tasks : Yaml.value -> unit) = fun x ->
let (save_data : (string * Yaml.value) -> unit) = fun (key, value) -> let (save_data : (string * Yaml.value) -> unit) = fun (key, value) ->
match (key, value) with match (key, value) with
|"all_para_nodes", `A l -> List.iter save_data_tasks l; |"all_para_nodes", `A l -> List.iter save_data_tasks l;
|"all_para_nodes", `Null -> assert true
|"main_node", `String n -> name := n |"main_node", `String n -> name := n
|_ -> assert false |_ -> assert false
......
...@@ -95,7 +95,9 @@ let (f : Soc.key -> Soc.tbl -> string -> unit) = fun sk stbl basename -> ...@@ -95,7 +95,9 @@ let (f : Soc.key -> Soc.tbl -> string -> unit) = fun sk stbl basename ->
in in
let (main2yaml : unit -> unit) = fun () -> let (main2yaml : unit -> unit) = fun () ->
let s = "main_node: " ^ basename in let (name, _, _) = main_soc.key in
let main_name = Str.replace_first (Str.regexp "::") "_" name in
let s = "main_node: " ^ main_name in
fprintf yaml_file "\n%s" s fprintf yaml_file "\n%s" s
in in
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment