From: J S. <zw...@us...> - 2005-01-15 22:43:43
|
Update of /cvsroot/emc/emc2/src/hal In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5350 Modified Files: Tag: halrefactor-0-1 hal_lib.c hal_priv.h hal_procfs.c hal_procfs.h Log Message: More changes, mostly allowing for dynamic registration of modules and block_types in kernel space using kernel space structures. Also some early work on the mechanism for creating blocks. This should build hal_lib.o and blocks.o successfully for testing. Index: hal_priv.h =================================================================== RCS file: /cvsroot/emc/emc2/src/hal/hal_priv.h,v retrieving revision 1.9.4.1 retrieving revision 1.9.4.2 diff -C2 -d -r1.9.4.1 -r1.9.4.2 *** hal_priv.h 15 Jan 2005 11:31:39 -0000 1.9.4.1 --- hal_priv.h 15 Jan 2005 22:43:30 -0000 1.9.4.2 *************** *** 136,140 **** --- 136,142 ---- int shmem_bot; /* bottom of free shmem (first free byte) */ int shmem_top; /* top of free shmem (1 past last free) */ + int comp_list_ptr; /* root of linked list of components */ + int pin_list_ptr; /* root of linked list of pins */ int sig_list_ptr; /* root of linked list of signals */ *************** *** 144,147 **** --- 146,150 ---- long base_period; /* timer period for realtime tasks */ int threads_running; /* non-zero if threads are started */ + int comp_free_ptr; /* list of free component structs */ int pin_free_ptr; /* list of free pin structs */ *************** *** 153,161 **** } hal_data_t; typedef struct hal_block_list_t { ! hal_block_type_info block; ! struct hal_block_list_t *next; /* linked list to next item in list */ } hal_block_list_t; /** HAL 'component' data structure. --- 156,233 ---- } hal_data_t; + /* This struct is being used to stage data that I suspect + can live just in the kernel... + TODO: Remove everything in this struct from the struct above + after John tells me I got them right + */ + + typedef struct { + unsigned long mutex; /* Mutexes may actually go completely away? */ + int comp_list_ptr; /* root of linked list of components */ + + /* If the kernel does all of the manipulation of connections, then + the list of free pointers doesn't need to be in shared memory: */ + + int comp_free_ptr; /* list of free component structs */ + int pin_free_ptr; /* list of free pin structs */ + int sig_free_ptr; /* list of free signal structs */ + int param_free_ptr; /* list of free parameter structs */ + int funct_free_ptr; /* list of free function structs */ + hal_list_t funct_entry_free; /* list of free funct entry structs */ + int thread_free_ptr; /* list of free thread structs */ + } hal_kernel_data_t; + + /* + * Private structures for managing module info and block_type info + * within the kernel + * (RTAI only) + */ + + typedef struct hal_block_type_list_t { + hal_block_type_info block; + struct hal_block_type_list_t + *next; /* linked list to next item in list */ + } hal_block_type_list_t; + + typedef struct hal_module_list_t { + hal_module_info module; + struct hal_module_list_t *next; /* linked list to next item in list */ + hal_block_type_list_t + *block_types; /* Types this module can create*/ + int module_id; /* module identifier */ + } hal_module_list_t; + typedef struct hal_block_list_t { ! int block_id; /* Unique block id */ ! hal_module_list_t *module; /* owning module */ ! hal_block_type_list_t *block_type; /* module type */ ! struct hal_block_list_t *next; /* next instance */ } hal_block_list_t; + /* and some utilities for use on these structures... */ + + + hal_block_list_t *alloc_block_list(void); + + hal_block_type_list_t *alloc_block_type_list(void); + + void free_block_type_list(hal_block_type_list_t *l); + void free_block_list(hal_block_list_t *l); + + int copy_block_type(int client_id, hal_block_type_info *dest, + const hal_block_type_info *src); + + hal_module_list_t *alloc_module_list(void); + void free_module_list(hal_module_list_t *m); + void copy_module_info(hal_module_info *dest, + const hal_module_info *src); + + + void free_module_list(hal_module_list_t *p); + void copy_module_info(hal_module_info *dest, const hal_module_info *src); + + hal_module_list_t *find_module_by_id(int id); + hal_module_list_t *find_module_by_name(const char *name); + /** HAL 'component' data structure. *************** *** 174,184 **** /* HAL REFACTOR I think we want a dynamic name without fixed length? */ ! hal_module_info module_info; /* Our private copy of what the module ! registered with */ ! hal_block_list_t *block_types; /* linked list of types this module ! knows how to create */ } hal_comp_t; --- 246,258 ---- /* HAL REFACTOR I think we want a dynamic name without fixed length? + But... this probably doesn't belong in shared memory. It's + meta data? */ ! // hal_module_info module_info; /* Our private copy of what the module ! // registered with */ ! // hal_block_type_list_t *block_types; /* linked list of types this module ! // knows how to create */ } hal_comp_t; Index: hal_lib.c =================================================================== RCS file: /cvsroot/emc/emc2/src/hal/hal_lib.c,v retrieving revision 1.22.4.2 retrieving revision 1.22.4.3 diff -C2 -d -r1.22.4.2 -r1.22.4.3 *** hal_lib.c 15 Jan 2005 11:31:39 -0000 1.22.4.2 --- hal_lib.c 15 Jan 2005 22:43:29 -0000 1.22.4.3 *************** *** 109,114 **** realtime modules.. */ ! hal_block_list_t *global_block_list=0; ! #endif --- 109,115 ---- realtime modules.. */ ! hal_module_list_t *global_module_list=0; ! hal_block_list_t *global_block_list=0; /* List of every object */ ! int global_block_id=0; #endif *************** *** 203,210 **** - void free_block_list_struct(hal_block_list_t *l); - int copy_block_struct(int client_id, hal_block_type_info *dest, - const hal_block_type_info *src); - hal_block_list_t *alloc_block_list_struct(void); /*********************************************************************** --- 204,207 ---- *************** *** 212,215 **** --- 209,214 ---- ************************************************************************/ + #ifdef RTAPI + /* REFACTOR In process... hal_init to be replaced by hal_register_module *************** *** 258,262 **** } /* get HAL shared memory block from RTAPI */ - /* TODO ... should this be postponed? */ mem_id = rtapi_shmem_new(HAL_KEY, comp_id, HAL_SIZE); --- 257,260 ---- *************** *** 319,324 **** --- 317,346 ---- rtapi_print_msg(RTAPI_MSG_DBG, "HAL: component '%s' initialized, ID = %02d\n", hal_name, comp_id); + + /* HAL REFACTOR + Much stuff being moved to kernel memory... */ + + hal_module_list_t *newmodule; + hal_module_list_t **module_handle; + + newmodule=alloc_module_list(); + /* It may be silly to copy this data here... Will it usually + be a static block in the calling kernel module? Is this wasteful? */ + copy_module_info(&newmodule->module, mb); + + newmodule->next=0; + newmodule->block_types=0; + newmodule->module_id=comp_id; // Store the component id for later + + /* Walk the linked list of module_list_t's until we reach the end... */ + for (module_handle=&global_module_list; *module_handle; + module_handle=&( (*module_handle)->next ) ); + + *module_handle=newmodule; + return comp_id; } + + #endif int hal_init(char *name) *************** *** 534,543 **** int hal_register_block_type(int module_id, hal_block_type_info *block_info) { ! hal_block_list_t *p; ! hal_block_list_t **block_list_handle; int result; ! p= alloc_block_list_struct(); if (!p) { --- 556,581 ---- int hal_register_block_type(int module_id, hal_block_type_info *block_info) { ! hal_block_type_list_t *p; ! hal_block_type_list_t **block_list_handle; int result; + hal_module_list_t *module; ! module=find_module_by_id(module_id); ! if (!module) ! { ! rtapi_print_msg(RTAPI_MSG_DBG, ! "HAL: hal_register_block_type() failed - INVALID module_id! (%d)", ! module_id); ! return HAL_INVAL; ! } ! ! /* ! TODO: Evaluate if it makes sense to copy all this data... ! Most of the time it's likely to be setup in static structs ! in the kernel module. Perhaps that's reasonable, and we ! should just use the kernel module's copy ! */ ! p= alloc_block_type_list(); if (!p) { *************** *** 547,554 **** } ! result=copy_block_struct(module_id, &p->block, block_info); if (result!=HAL_SUCCESS) { ! free_block_list_struct(p); rtapi_print_msg(RTAPI_MSG_DBG, "HAL: hal_register_block_type() failed - NOMEM! (1)"); --- 585,592 ---- } ! result=copy_block_type(module_id, &p->block, block_info); if (result!=HAL_SUCCESS) { ! free_block_type_list(p); rtapi_print_msg(RTAPI_MSG_DBG, "HAL: hal_register_block_type() failed - NOMEM! (1)"); *************** *** 558,565 **** p->next=0; ! /* Walk the linked list of block_lists until we reach the end... */ ! for (block_list_handle=&global_block_list; *block_list_handle; block_list_handle=&( (*block_list_handle)->next ) ); --- 596,604 ---- p->next=0; ! /* TODO: /end */ ! /* Walk the linked list of block_lists until we reach the end... */ ! for (block_list_handle=&module->block_types; *block_list_handle; block_list_handle=&( (*block_list_handle)->next ) ); *************** *** 570,573 **** --- 609,679 ---- return HAL_SUCCESS; } + + + /* + Create a new block using the module pointed to by module and the + block_type pointed to by block_type + */ + + int hal_create_block(hal_module_list_t *module, + hal_block_type_list_t *block_type) + { + hal_block_list_t *newblock=0; + int result; + hal_block_list_t **block_list_handle; + + + if (!module) + { + rtapi_print_msg(RTAPI_MSG_ERR, + "HAL: hal_create_block: attempted to create a block without a module\n"); + return HAL_INVAL; + } + + if (!block_type) + { + rtapi_print_msg(RTAPI_MSG_ERR, + "HAL: hal_create_block: attempted to create a block without a block type\n"); + return HAL_INVAL; + } + + newblock=alloc_block_list(); + + if (!newblock) + { + rtapi_print_msg(RTAPI_MSG_ERR, + "HAL: hal_create_block: out of memory!\n"); + return HAL_NOMEM; + } + newblock->module=module; + newblock->block_type=block_type; + + result=block_type->block.create(global_block_id, + block_type->block.block_type_id); + + if (result!=HAL_SUCCESS) + { + free_block_list(newblock); + rtapi_print_msg(RTAPI_MSG_ERR, + "HAL: hal_create function failed: %d!\n", result); + return result; + } + + newblock->block_id=global_block_id; + global_block_id++; + + /* Walk the linked list of block_lists until we reach the end... */ + for (block_list_handle=&global_block_list; *block_list_handle; + block_list_handle=&( (*block_list_handle)->next ) ); + + *block_list_handle=newblock; + + rtapi_print_msg(RTAPI_MSG_DBG, + "HAL: hal_create_block: created new block %s\n", newblock->block_id); + + return HAL_SUCCESS; + } + + #endif // RTAPI *************** *** 2366,2376 **** } ! hal_block_list_t * ! alloc_block_list_struct() { ! hal_block_list_t *p; ! p = shmalloc_dn(sizeof(hal_block_list_t)); if (p) { /* make sure it's empty */ --- 2472,2483 ---- } + #ifdef RTAPI ! hal_block_type_list_t * ! alloc_block_type_list() { ! hal_block_type_list_t *p; ! p = shmalloc_dn(sizeof(hal_block_type_list_t)); if (p) { /* make sure it's empty */ *************** *** 2384,2407 **** } ! void free_block_list_struct(hal_block_list_t *l) { ! /* TODO ... make this free shared memory or whatever... ! ! if (l->block.type_name) ! free(l->block.type_name) ! if (l->block.short_description) ! free(l->block.short_description) ! free(l); ! */ return; } ! ! ! ! int ! copy_block_struct(int client_id, hal_block_type_info *dest, const hal_block_type_info *src) { --- 2491,2508 ---- } ! void free_block_type_list(hal_block_type_list_t *l) { ! kfree(l); return; } ! void free_block_list(hal_block_list_t *l) ! { ! kfree(l); ! return; ! } int ! copy_block_type(int client_id, hal_block_type_info *dest, const hal_block_type_info *src) { *************** *** 2425,2430 **** --- 2526,2630 ---- } + char *kstrdup(const char *string) + { + char *newstring; + int length=strlen(string); + + newstring=kmalloc(length+1, GFP_KERNEL); + + if (newstring) + { + memcpy(newstring, string, length); + newstring[length]=0; + } + + return newstring; + } + + + + hal_module_list_t *alloc_module_list(void) + { + hal_module_list_t *p; + + p = kmalloc(sizeof(hal_module_list_t), GFP_KERNEL); + if (p) { + /* make sure it's empty */ + p->next = 0; + p->block_types=0; + + p->module.module_name=0; + p->module.author=0; + p->module.short_description=0; + p->module.info_link=0; + } + return p; + } + + void free_module_list(hal_module_list_t *p) + { + if (p) + { + if (p->module.module_name) + kfree(p->module.module_name); + if (p->module.author) + kfree(p->module.author); + if (p->module.short_description) + kfree(p->module.short_description); + if (p->module.info_link) + kfree(p->module.info_link); + kfree(p); + } + } + void copy_module_info(hal_module_info *dest, + const hal_module_info *src) + { + if (src->module_name) + dest->module_name=kstrdup(src->module_name); + if (src->author) + dest->author=kstrdup(src->author); + if (src->short_description) + dest->short_description=kstrdup(src->short_description); + if (src->info_link) + dest->info_link=kstrdup(src->info_link); + } + + + hal_block_list_t *alloc_block_list(void) + { + hal_block_list_t *p; + + p = kmalloc(sizeof(hal_block_list_t), GFP_KERNEL); + if (p) { + /* make sure it's empty */ + p->block_id=0; + p->next = 0; + p->module=0; + p->block_type=0; + } + return p; + } + + hal_module_list_t *find_module_by_id(int id) + { + hal_module_list_t *p; + for (p=global_module_list; p && (p->module_id!=id); p=p->next); + + return p; + } + + hal_module_list_t *find_module_by_name(const char *name) + { + hal_module_list_t *p; + for (p=global_module_list; + p && strcmp(p->module.module_name, name); + p=p->next); + + return p; + } + + #endif static hal_pin_t *alloc_pin_struct(void) Index: hal_procfs.h =================================================================== RCS file: /cvsroot/emc/emc2/src/hal/Attic/hal_procfs.h,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -C2 -d -r1.1.2.1 -r1.1.2.2 *** hal_procfs.h 15 Jan 2005 11:31:39 -0000 1.1.2.1 --- hal_procfs.h 15 Jan 2005 22:43:30 -0000 1.1.2.2 *************** *** 5,11 **** #ifdef RTAPI #ifdef PROCFS ! int hal_init_procfs(); ! void hal_shutdown_procfs(); #endif //RTAPI --- 5,11 ---- #ifdef RTAPI #ifdef PROCFS ! int hal_init_procfs(void); ! void hal_shutdown_procfs(void); #endif //RTAPI Index: hal_procfs.c =================================================================== RCS file: /cvsroot/emc/emc2/src/hal/Attic/hal_procfs.c,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -C2 -d -r1.1.2.1 -r1.1.2.2 *** hal_procfs.c 15 Jan 2005 11:31:39 -0000 1.1.2.1 --- hal_procfs.c 15 Jan 2005 22:43:30 -0000 1.1.2.2 *************** *** 15,21 **** int len=0; ! ! ! hal_data->comp_list_ptr; len+=snprintf(page+off, count-len, "%s", "test"); --- 15,19 ---- int len=0; ! // hal_data->comp_list_ptr; len+=snprintf(page+off, count-len, "%s", "test"); |