Changeset 204 for trunk/kernel/libk/xhtab.c
- Timestamp:
- Jul 17, 2017, 8:42:59 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/libk/xhtab.c
r188 r204 76 76 // returns true if given name matches directory entry name. 77 77 //////////////////////////////////////////////////////////////////////////////////////////// 78 static bool_t xhtab_dentry_item_match_key( xptr_t item_xp,78 static bool_t xhtab_dentry_item_match_key( xptr_t item_xp, 79 79 void * key ) 80 80 { 81 vfs_dentry_t * dentry_ptr; 82 cxy_t dentry_cxy; 83 84 char name[CONFIG_VFS_MAX_NAME_LENGTH]; 81 char name[CONFIG_VFS_MAX_NAME_LENGTH]; 85 82 86 83 // get dentry cluster and local pointer 87 dentry_cxy = GET_CXY( item_xp );88 dentry_ptr = (vfs_dentry_t *)GET_PTR( item_xp );84 cxy_t dentry_cxy = GET_CXY( item_xp ); 85 vfs_dentry_t * dentry_ptr = (vfs_dentry_t *)GET_PTR( item_xp ); 89 86 90 87 // make a local copy of directory entry name … … 94 91 return( strcmp( name , (char*)key ) == 0 ); 95 92 } 96 93 94 //////////////////////////////////////////////////////////////////////////////////////////// 95 // This function print the item key, that is the name for a vfs_entry_t, 96 //////////////////////////////////////////////////////////////////////////////////////////// 97 // @ item_xp : extended pointer on item. 98 //////////////////////////////////////////////////////////////////////////////////////////// 99 static void xhtab_dentry_item_print_key( xptr_t item_xp ) 100 { 101 char name[CONFIG_VFS_MAX_NAME_LENGTH]; 102 103 // get dentry cluster and local pointer 104 cxy_t dentry_cxy = GET_CXY( item_xp ); 105 vfs_dentry_t * dentry_ptr = (vfs_dentry_t *)GET_PTR( item_xp ); 106 107 // make a local copy of directory entry name 108 hal_remote_strcpy( XPTR( local_cxy , name ) , 109 XPTR( dentry_cxy , &dentry_ptr->name ) ); 110 111 // print dentry name 112 printk("%s , ", name ); 113 } 114 97 115 //////////////////////////////////////////////////////////////////////////////////////// 98 116 // Generic access functions … … 108 126 remote_rwlock_init( XPTR( local_cxy , &xhtab->lock) ); 109 127 110 xhtab->items = 0; 128 xhtab->items = 0; 129 xhtab->current_index = 0; 130 xhtab->current_xlist_xp = XPTR_NULL; 111 131 112 132 if( type == XHTAB_DENTRY_TYPE ) … … 115 135 xhtab->index_from_key = &xhtab_dentry_index_from_key; 116 136 xhtab->item_from_xlist = &xhtab_dentry_item_from_xlist; 137 xhtab->item_print_key = &xhtab_dentry_item_print_key; 117 138 } 118 139 else … … 134 155 void * key ) 135 156 { 136 xptr_t xlist_xp; // xlist_entry_t (iterator) 137 xptr_t item_xp; // associated item 138 xhtab_t * xhtab_ptr; // hash table local pointer 139 cxy_t xhtab_cxy; // hash table cluster 157 xptr_t xlist_xp; // xlist_entry_t (iterator) 158 xptr_t item_xp; // associated item 159 xhtab_t * xhtab_ptr; // hash table local pointer 160 cxy_t xhtab_cxy; // hash table cluster 161 item_from_xlist_t * item_from_xlist; // function pointer 162 item_match_key_t * item_match_key; // function pointer 140 163 141 164 // get hash table cluster and local pointer 142 165 xhtab_cxy = GET_CXY( xhtab_xp ); 143 166 xhtab_ptr = (xhtab_t *)GET_PTR( xhtab_xp ); 167 168 // get pointer on "item_from_xlist" function 169 item_from_xlist = (item_from_xlist_t *)hal_remote_lpt( XPTR( xhtab_cxy , 170 &xhtab_ptr->item_from_xlist ) ); 171 // get pointer on "item_match_key" function 172 item_match_key = (item_match_key_t *)hal_remote_lpt( XPTR( xhtab_cxy , 173 &xhtab_ptr->item_match_key ) ); 144 174 145 175 // scan sub-list[index] … … 147 177 { 148 178 // get extended pointer on item containing the xlist entry 149 item_xp = xhtab_ptr->item_from_xlist( xlist_xp );179 item_xp = item_from_xlist( xlist_xp ); 150 180 151 181 // check matching 152 if( xhtab_ptr->item_match_key( item_xp , key ) ) return item_xp;182 if( item_match_key( item_xp , key ) ) return item_xp; 153 183 } 154 184 155 185 // No matching item found 156 186 return XPTR_NULL; 157 } 187 188 } // end xhtab_scan() 158 189 159 190 /////////////////////////////////////// … … 162 193 xptr_t xlist_xp ) 163 194 { 164 // get xhtab cluster and local pointer 165 cxy_t xhtab_cxy = GET_CXY( xhtab_xp ); 166 xhtab_t * xhtab_ptr = (xhtab_t *)GET_PTR( xhtab_xp ); 167 195 xptr_t item_xp; 196 uint32_t index; 197 cxy_t xhtab_cxy; 198 xhtab_t * xhtab_ptr; 199 index_from_key_t * index_from_key; // function pointer 200 201 // get xhtab cluster and local pointer 202 xhtab_cxy = GET_CXY( xhtab_xp ); 203 xhtab_ptr = (xhtab_t *)GET_PTR( xhtab_xp ); 204 205 // get pointer on "index_from_key" function 206 index_from_key = (index_from_key_t *)hal_remote_lpt( XPTR( xhtab_cxy , 207 &xhtab_ptr->index_from_key ) ); 168 208 // compute index from key 169 uint32_t index = xhtab_ptr->index_from_key( key );209 index = index_from_key( key ); 170 210 171 211 // take the lock protecting hash table … … 173 213 174 214 // search a matching item 175 xptr_titem_xp = xhtab_scan( xhtab_xp , index , key );215 item_xp = xhtab_scan( xhtab_xp , index , key ); 176 216 177 217 if( item_xp != XPTR_NULL ) // error if found … … 202 242 xptr_t xlist_entry_xp ) 203 243 { 204 // get xhtab cluster and local pointer 205 cxy_t xhtab_cxy = GET_CXY( xhtab_xp ); 206 xhtab_t * xhtab_ptr = (xhtab_t *)GET_PTR( xhtab_xp ); 207 244 xptr_t item_xp; 245 uint32_t index; 246 cxy_t xhtab_cxy; 247 xhtab_t * xhtab_ptr; 248 index_from_key_t * index_from_key; // function pointer 249 250 // get xhtab cluster and local pointer 251 xhtab_cxy = GET_CXY( xhtab_xp ); 252 xhtab_ptr = (xhtab_t *)GET_PTR( xhtab_xp ); 253 254 // get pointer on "index_from_key" function 255 index_from_key = (index_from_key_t *)hal_remote_lpt( XPTR( xhtab_cxy , 256 &xhtab_ptr->index_from_key ) ); 208 257 // compute index from key 209 uint32_t index = xhtab_ptr->index_from_key( key );258 index = index_from_key( key ); 210 259 211 260 // take the lock protecting hash table … … 213 262 214 263 // get extended pointer on item to remove 215 xptr_titem_xp = xhtab_scan( xhtab_xp , index , key );264 item_xp = xhtab_scan( xhtab_xp , index , key ); 216 265 217 266 if( item_xp == XPTR_NULL ) // error if not found … … 241 290 void * key ) 242 291 { 243 xptr_t item_xp; 244 245 // get xhtab cluster and local pointer 246 cxy_t xhtab_cxy = GET_CXY( xhtab_xp ); 247 xhtab_t * xhtab_ptr = (xhtab_t *)GET_PTR( xhtab_xp ); 248 292 xptr_t item_xp; 293 uint32_t index; 294 cxy_t xhtab_cxy; 295 xhtab_t * xhtab_ptr; 296 index_from_key_t * index_from_key; // function pointer 297 298 // get xhtab cluster and local pointer 299 xhtab_cxy = GET_CXY( xhtab_xp ); 300 xhtab_ptr = (xhtab_t *)GET_PTR( xhtab_xp ); 301 302 // get pointer on "index_from_key" function 303 index_from_key = (index_from_key_t *)hal_remote_lpt( XPTR( xhtab_cxy , 304 &xhtab_ptr->index_from_key ) ); 249 305 // compute index from key 250 uint32_t index = xhtab_ptr->index_from_key( key );306 index = index_from_key( key ); 251 307 252 308 // take the lock protecting hash table … … 288 344 xptr_t xhtab_get_first( xptr_t xhtab_xp ) 289 345 { 290 uint32_t index; 291 xptr_t xlist_xp; 292 xptr_t item_xp; 293 xptr_t root_xp; 294 295 // get xhtab cluster and local pointer 296 cxy_t xhtab_cxy = GET_CXY( xhtab_xp ); 297 xhtab_t * xhtab_ptr = (xhtab_t *)GET_PTR( xhtab_xp ); 298 346 uint32_t index; 347 cxy_t xhtab_cxy; 348 xhtab_t * xhtab_ptr; 349 xptr_t xlist_xp; 350 xptr_t item_xp; 351 xptr_t root_xp; 352 item_from_xlist_t * item_from_xlist; // function pointer 353 354 // get xhtab cluster and local pointer 355 xhtab_cxy = GET_CXY( xhtab_xp ); 356 xhtab_ptr = (xhtab_t *)GET_PTR( xhtab_xp ); 357 358 // get pointer on "item_from_xlist" function 359 item_from_xlist = (item_from_xlist_t *)hal_remote_lpt( XPTR( xhtab_cxy , 360 &xhtab_ptr->item_from_xlist ) ); 299 361 //loop on subsets 300 362 for( index = 0 ; index < XHASHTAB_SIZE ; index++ ) … … 309 371 { 310 372 // get extended pointer on item containing the xlist entry 311 item_xp = xhtab_ptr->item_from_xlist( xlist_xp );373 item_xp = item_from_xlist( xlist_xp ); 312 374 313 375 // register item in hash table header … … 327 389 xptr_t xhtab_get_next( xptr_t xhtab_xp ) 328 390 { 329 uint32_t index; 330 xptr_t xlist_xp; 331 xptr_t item_xp; 332 xptr_t root_xp; 391 uint32_t index; 392 cxy_t xhtab_cxy; 393 xhtab_t * xhtab_ptr; 394 xptr_t xlist_xp; 395 xptr_t item_xp; 396 xptr_t root_xp; 397 item_from_xlist_t * item_from_xlist; // function pointer 333 398 334 399 uint32_t current_index; … … 336 401 337 402 // get xhtab cluster and local pointer 338 cxy_txhtab_cxy = GET_CXY( xhtab_xp );339 xhtab_ t * xhtab_ptr = (xhtab_t *)GET_PTR( xhtab_xp );403 xhtab_cxy = GET_CXY( xhtab_xp ); 404 xhtab_ptr = (xhtab_t *)GET_PTR( xhtab_xp ); 340 405 341 406 // get current item pointers … … 343 408 current_xlist_xp = hal_remote_lwd( XPTR( xhtab_cxy , &xhtab_ptr->current_xlist_xp ) ); 344 409 410 // get pointer on "item_from_xlist" function 411 item_from_xlist = (item_from_xlist_t *)hal_remote_lpt( XPTR( xhtab_cxy , 412 &xhtab_ptr->item_from_xlist ) ); 345 413 //loop on subsets 346 414 for( index = current_index ; index < XHASHTAB_SIZE ; index++ ) … … 350 418 351 419 // get next item 352 xlist_xp = xlist_next( root_xp , current_xlist_xp ); 420 if( index == current_index ) xlist_xp = xlist_next( root_xp , current_xlist_xp ); 421 else xlist_xp = xlist_next( root_xp , root_xp ); 353 422 354 423 if( xlist_xp != XPTR_NULL ) // next item found 355 424 { 356 425 // get extended pointer on item containing the xlist entry 357 item_xp = xhtab_ptr->item_from_xlist( xlist_xp );426 item_xp = item_from_xlist( xlist_xp ); 358 427 359 428 // register item in hash table header … … 370 439 } // end xhtab_get_next() 371 440 372 441 ///////////////////////////////////// 442 void xhtab_display( xptr_t xhtab_xp ) 443 { 444 uint32_t index; 445 cxy_t xhtab_cxy; 446 xhtab_t * xhtab_ptr; 447 xptr_t root_xp; 448 xptr_t iter_xp; 449 xptr_t item_xp; 450 item_from_xlist_t * item_from_xlist; // function pointer 451 item_print_key_t * item_print_key; // function pointer 452 453 // get xhtab cluster and local pointer 454 xhtab_cxy = GET_CXY( xhtab_xp ); 455 xhtab_ptr = (xhtab_t *)GET_PTR( xhtab_xp ); 456 457 // get pointer on "item_from_xlist" function 458 item_from_xlist = (item_from_xlist_t *)hal_remote_lpt( XPTR( xhtab_cxy , 459 &xhtab_ptr->item_from_xlist ) ); 460 // get pointer on "item_print_key" function 461 item_print_key = (item_print_key_t *)hal_remote_lpt( XPTR( xhtab_cxy , 462 &xhtab_ptr->item_print_key ) ); 463 //loop on subsets 464 for( index = 0 ; index < XHASHTAB_SIZE ; index++ ) 465 { 466 printk(" index = %d : ", index ); 467 468 // get root of subset 469 root_xp = XPTR( xhtab_cxy , &xhtab_ptr->roots[index] ); 470 471 // loop on xlist 472 XLIST_FOREACH( root_xp , iter_xp ) 473 { 474 // get item from xlist 475 item_xp = item_from_xlist( iter_xp ); 476 477 // print item identifier 478 item_print_key( item_xp ); 479 } 480 481 printk("\n"); 482 } 483 } // end xhtab_display()
Note: See TracChangeset
for help on using the changeset viewer.