00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00023 #ifndef MESH_KERNEL_H
00024 #define MESH_KERNEL_H
00025
00026 #include <string.h>
00027 #include <trash_stack.h>
00028 #include <stdarg.h>
00029 #include <gpriq.h>
00030
00031
00032 extern pthread_key_t buffer_key;
00033 extern mesh_thread *kernel_thread;
00034
00035
00036 extern trash_stack *feature_stack;
00037
00038 #define mesh_new_feature_array() mesh_trash_stack_alloc0(feature_stack)
00039 #define mesh_free_feature_array(array) mesh_trash_stack_free(feature_stack, array)
00040
00041
00042 extern trash_stack *SR_slice_stack;
00043
00044 #define mesh_new_SR_slice() mesh_trash_stack_alloc0(SR_slice_stack)
00045 #define mesh_free_SR_slice(slice) mesh_trash_stack_free(SR_slice_stack, slice)
00046
00047
00048 typedef gint (*GPFunc)(gpointer, gpointer);
00049
00059 void g_slist_vsplit(GSList **src, GPFunc f, gpointer arg, int N, ...);
00060
00071 void g_slist_split(GSList **src, GPFunc f, gpointer arg, int N, GSList *dest[]);
00072
00080 void mesh_init(gint verbose);
00081
00088 void mesh_load_config_file(gchar* config_file);
00089
00090
00091 void mesh_mem_model_init();
00092
00099 void mesh_kernel();
00100
00106 mesh_feature_list *mesh_create_feature_list();
00107
00108
00109 gint mesh_feature_nosplit(gchar *feature);
00110
00121 mesh_feature_list *mesh_feature_add(mesh_feature_list *cfl, gchar *feature, double power);
00122
00129 gint mesh_get_feature_index_by_name(gchar *name);
00130
00131 mesh_mem_controller *mesh_create_mem_controller(gchar *name,
00132 gint (*schedule_mem)(gint res_id, gint block_id));
00133
00134
00135
00136 void mesh_register_mem_controller(mesh_resource *cr,
00137 mesh_mem_controller *memc);
00138
00139 mesh_mem_resource *mesh_create_mem_resource(gchar *name,
00140 double time_per_access,
00141 float (*contention_model)(mesh_access_statistics *),
00142 void (*arbitration_model)(float, GPriq *),
00143 gint resource_id);
00144
00145
00161 mesh_resource *mesh_create_resource(gchar *name,
00162 mesh_feature_list *cfl,
00163 mesh_scheduler *cs,
00164
00165 double (*timing_resolution)(mesh_resource *, GSList *),
00166 double default_power
00167 );
00168
00188 mesh_resource *mesh_create_shared_resource(gchar *name,
00189 mesh_feature_list *cfl,
00190 double (*timing_resolution)
00191 (mesh_resource*,double *),
00192 void (*contention)
00193 (mesh_resource *, GSList *, mesh_time),
00194 double default_power);
00195
00204 mesh_scheduler *mesh_create_scheduler(gchar *name,
00205
00206 GSList * (*execute_scheduler)(mesh_scheduler *));
00207
00219 mesh_scheduler *mesh_set_sched_resource(mesh_scheduler *cs, mesh_resource *cr);
00220
00221
00222
00231 mesh_scheduler *mesh_create_shared_scheduler(gchar *name,
00232
00233 void (*execute_shared)(mesh_scheduler *,GSList *,mesh_time));
00234
00235
00246 mesh_thread *mesh_define_thread(gchar *name,
00247 mesh_scheduler *execution_scheduler,
00248 void *(*thread)(void *),
00249 void *arg
00250 );
00251
00257 void mesh_start_thread(mesh_thread *thread);
00258
00264 void mesh_start_thread_delayed(mesh_thread *thread);
00265
00270 mesh_thread *mesh_create_thread(gchar *name,
00271 mesh_scheduler *execution_scheduler,
00272 void *(*thread)(void *),
00273 void *arg
00274 );
00275
00280 mesh_thread *mesh_create_thread_delayed(gchar *name,
00281 mesh_scheduler *execution_scheduler,
00282 void *(*thread)(void *),
00283 void *arg
00284 );
00285
00293 void mesh_squash_thread(mesh_thread *ct);
00294
00301 mesh_scheduler * mesh_get_scheduler_by_name(gchar *name);
00302
00303
00304 mesh_resource *mesh_get_sr_by_name(gchar *name);
00305
00312 mesh_thread * mesh_get_thread_by_name(gchar *name);
00313
00318 void mesh_cleanup();
00319
00325 mesh_time mesh_getTime();
00326
00327
00328
00329
00330
00331
00332
00333 mesh_time process_shared_resource_data(GSList **shared_contention_list,
00334 mesh_consume_data *cc,
00335 mesh_resource *resource);
00336
00343 void mesh_set_label_watch_output(gchar *filename);
00344
00354 void mesh_label_watch(gchar *name);
00355
00362 void mesh_set_error(mesh_time error);
00363
00372 void mesh_print_blocked_threads(gboolean flag);
00373
00385 void mesh_print_not_completed_threads(gboolean flag);
00386
00394 void mesh_print_thread_usage(gboolean flag);
00395
00405 void mesh_execute_at_commit(void (*function)(mesh_consume_data *));
00406
00413 void mesh_execute_at_stall(void (*function)(mesh_resource *, mesh_thread *));
00414
00422 void mesh_execute_at_finish(void (*function)(mesh_resource *, mesh_thread *));
00423
00428 void mesh_execute_at_interrupt(void (*function)(mesh_resource *, mesh_thread *));
00429
00437 void mesh_execute_at_squash(void (*function)(mesh_resource *, mesh_thread *));
00438
00446 void mesh_scheduler_is_eligible(mesh_scheduler *cs);
00447
00454 void mesh_thread_is_eligible(mesh_thread *mt);
00455
00461 void mesh_thread_is_not_eligible(mesh_thread *mt);
00462
00468 inline static mesh_thread *mesh_kernel_thread() {
00469 return kernel_thread;
00470 }
00471
00478 mesh_time mesh_thread_created_at(mesh_thread *ct);
00479
00486 mesh_time mesh_thread_finished_at(mesh_thread *ct);
00487
00493 inline static mesh_thread *mesh_current_thread() {
00494 return pthread_getspecific(buffer_key);
00495 }
00496
00508 void mesh_create_interrupt(mesh_resource *resource, gchar *name, gboolean maskable,
00509 void *(*isr)(void *), void *arg);
00510
00520 void mesh_set_interrupt_controller(mesh_resource *resource,
00521 char* (*)(void *, GSList **p),
00522 void *arg);
00523
00532 void mesh_raise_interrupt(mesh_resource *cr, gchar *name);
00533
00541 void mesh_disable_interrupt(gchar *name);
00542
00551 void mesh_enable_interrupt(gchar *name);
00552
00560 gboolean mesh_is_interrupt_enabled(gchar *name, gboolean explicit, mesh_thread *thread);
00561
00562
00563 void mesh_free_feature_list(mesh_feature_list *cfl);
00564
00565
00566 mesh_feature_list *mesh_copy_feature_list(mesh_feature_list *cfl);
00567
00568
00569 void mesh_insert_consume(mesh_resource *cr, mesh_consume_data *cc);
00570
00571
00572 mesh_thread *mesh_create_untimed_thread(gchar *name,
00573 void *(*thread)(void *),
00574 void *arg,
00575 gboolean trace_visible);
00576
00577
00578
00579
00580
00581 void __mesh_local_to_kernel(mesh_pthread *pt, gboolean should_block);
00582
00583
00584
00585 mesh_synchronization *mesh_create_synchronization(gint type);
00586 gint mesh_destroy_synchronization(mesh_synchronization *cs);
00587 gint mesh_synchronization_wakeup_delayed(mesh_thread *mt, mesh_synchronization *cs);
00588 gint mesh_synchronization_wakeup(mesh_synchronization *cs);
00589 gint mesh_synchronization_add_to_wait_list(mesh_synchronization *cs, mesh_thread *ct);
00590
00591
00592 #endif