DECLARE_TEST( hashmap, lookup ) { hashmap_t* map = hashmap_allocate( 31, 0 ); char* value = (void*)(uintptr_t)1234; hash_t key = (hash_t)4321; unsigned int ikey = 0; for( ; ikey < 1024; ++ikey, ++key, ++value ) { void* prev = hashmap_insert( map, key, value ); EXPECT_EQ( prev, 0 ); } for( ikey = 0, key = (hash_t)4321, value = (void*)(uintptr_t)1234; ikey < 1024; ++ikey, ++key, ++value ) { void* prev = hashmap_lookup( map, key ); EXPECT_EQ( prev, value ); EXPECT_TRUE( hashmap_has_key( map, key ) ); hashmap_erase( map, key ); EXPECT_FALSE( hashmap_has_key( map, key ) ); } hashmap_deallocate( map ); return 0; }
DECLARE_TEST( hashmap, erase ) { hashmap_t* map = hashmap_allocate( 0, 0 ); void* prev = 0; EXPECT_EQ( hashmap_lookup( map, 0 ), 0 ); EXPECT_EQ( hashmap_size( map ), 0 ); prev = hashmap_insert( map, 0, map ); EXPECT_EQ( prev, 0 ); EXPECT_EQ( hashmap_size( map ), 1 ); EXPECT_TRUE( hashmap_has_key( map, 0 ) ); prev = hashmap_erase( map, 0 ); EXPECT_EQ( prev, map ); EXPECT_EQ( hashmap_size( map ), 0 ); EXPECT_FALSE( hashmap_has_key( map, 0 ) ); prev = hashmap_erase( map, 0 ); EXPECT_EQ( prev, 0 ); EXPECT_EQ( hashmap_size( map ), 0 ); EXPECT_FALSE( hashmap_has_key( map, 0 ) ); prev = hashmap_erase( map, (hash_t)(uintptr_t)map ); EXPECT_EQ( prev, 0 ); EXPECT_EQ( hashmap_size( map ), 0 ); EXPECT_FALSE( hashmap_has_key( map, (hash_t)(uintptr_t)map ) ); hashmap_deallocate( map ); return 0; }
/* * Loads the modules specified in the ramdisk. Loading follows this general * procedure: * * 1. Ensure the file is a valid ELF. * 2. Dynamically link with kernel functions from kernel symtab. * 3. Call module entry point */ void modules_ramdisk_load() { if(!ramdisk_loaded()) return; // Initialise some data structures loaded_module_map = hashmap_allocate(); loaded_module_names = list_allocate(); // Acquire initial placement address module_placement_addr = paging_get_memrange(kMemorySectionDrivers)[0]; module_placement_end = paging_get_memrange(kMemorySectionDrivers)[1]; // Get modules char *modulesToLoad = hal_config_get("modules"); char *moduleName = strtok(modulesToLoad, " "); void *elf; // Find all modules while(moduleName) { // Attempt to load module from ramdisk if((elf = ramdisk_fopen(moduleName))) { module_load(elf, moduleName); } moduleName = strtok(NULL, " "); } KSUCCESS("Dynamically loaded modules initialised"); }
DECLARE_TEST(hashmap, allocation) { hashmap_t* map = hashmap_allocate(0, 0); EXPECT_EQ(hashmap_size(map), 0); EXPECT_EQ(hashmap_lookup(map, 0), 0); EXPECT_EQ(hashmap_lookup(map, (hash_t)(uintptr_t)map), 0); hashmap_deallocate(map); map = hashmap_allocate(13, 127); EXPECT_EQ(hashmap_size(map), 0); EXPECT_EQ(hashmap_lookup(map, 0), 0); EXPECT_EQ(hashmap_lookup(map, (hash_t)(uintptr_t)map), 0); hashmap_deallocate(map); return 0; }
DECLARE_TEST( hashmap, insert ) { hashmap_t* map = hashmap_allocate( 0, 0 ); void* prev = 0; EXPECT_EQ( hashmap_lookup( map, 0 ), 0 ); prev = hashmap_insert( map, 0, map ); EXPECT_EQ( prev, 0 ); prev = hashmap_insert( map, 0, map ); EXPECT_EQ( prev, map ); prev = hashmap_insert( map, 0, 0 ); EXPECT_EQ( prev, map ); prev = hashmap_insert( map, 0, map ); EXPECT_EQ( prev, 0 ); prev = hashmap_insert( map, (hash_t)(uintptr_t)map, map ); EXPECT_EQ( prev, 0 ); EXPECT_EQ( hashmap_size( map ), 2 ); EXPECT_EQ( hashmap_lookup( map, 0 ), map ); EXPECT_EQ( hashmap_lookup( map, (hash_t)(uintptr_t)map ), map ); hashmap_insert( map, 0, 0 ); hashmap_insert( map, (hash_t)(uintptr_t)map, 0 ); EXPECT_EQ( hashmap_size( map ), 2 ); EXPECT_EQ( hashmap_lookup( map, 0 ), 0 ); EXPECT_EQ( hashmap_lookup( map, (hash_t)(uintptr_t)map ), 0 ); hashmap_deallocate( map ); return 0; }
int lua_symbol_initialize(void) { _lua_symbols = hashmap_allocate(BUILD_SIZE_LUA_LOOKUP_BUCKETS, 8); return 0; }
int lua_modulemap_initialize(void) { _lua_modulemap = hashmap_allocate(13, 7); _lua_modulemap_lock = mutex_allocate(STRING_CONST("lua-modulemap")); return 0; }