From 79b12613f574cd1a7c9d407b7041e662f02e8700 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Mon, 12 Jan 2015 15:25:26 +0100 Subject: [PATCH] legacy_drivers: convert to BOpenHashTable. --- .../kernel/device_manager/legacy_drivers.cpp | 103 ++++++++---------- 1 file changed, 46 insertions(+), 57 deletions(-) diff --git a/src/system/kernel/device_manager/legacy_drivers.cpp b/src/system/kernel/device_manager/legacy_drivers.cpp index f71c902fbd..602e1a26c7 100644 --- a/src/system/kernel/device_manager/legacy_drivers.cpp +++ b/src/system/kernel/device_manager/legacy_drivers.cpp @@ -226,7 +226,6 @@ static status_t unload_driver(legacy_driver *driver); static status_t load_driver(legacy_driver *driver); -static hash_table* sDriverHash; static DriverWatcher sDriverWatcher; static int32 sDriverEventsPending; static DriverEventList sDriverEvents; @@ -241,27 +240,35 @@ static bool sWatching; // #pragma mark - driver private -static uint32 -driver_entry_hash(void *_driver, const void *_key, uint32 range) -{ - legacy_driver *driver = (legacy_driver *)_driver; - const char *key = (const char *)_key; +struct DriverHash { + typedef const char* KeyType; + typedef legacy_driver ValueType; - if (driver != NULL) - return hash_hash_string(driver->name) % range; + size_t HashKey(KeyType key) const + { + return hash_hash_string(key); + } - return hash_hash_string(key) % range; -} + size_t Hash(ValueType* driver) const + { + return HashKey(driver->name); + } + + bool Compare(KeyType key, ValueType* driver) const + { + return strcmp(driver->name, key) == 0; + } + + ValueType*& GetLink(ValueType* value) const + { + return value->next; + } +}; + +typedef BOpenHashTable DriverTable; -static int -driver_entry_compare(void *_driver, const void *_key) -{ - legacy_driver *driver = (legacy_driver *)_driver; - const char *key = (const char *)_key; - - return strcmp(driver->name, key); -} +static DriverTable* sDriverHash; /*! Collects all published devices of a driver, compares them to what the @@ -543,18 +550,14 @@ get_leaf(const char *path) static legacy_driver * find_driver(dev_t device, ino_t node) { - hash_iterator iterator; - hash_open(sDriverHash, &iterator); - legacy_driver *driver; - while (true) { - driver = (legacy_driver *)hash_next(sDriverHash, &iterator); - if (driver == NULL - || (driver->device == device && driver->node == node)) - break; + DriverTable::Iterator iterator(sDriverHash); + while (iterator.HasNext()) { + legacy_driver *driver = iterator.Next(); + if (driver->device == device && driver->node == node) + return driver; } - hash_close(sDriverHash, &iterator, false); - return driver; + return NULL; } @@ -579,8 +582,7 @@ add_driver(const char *path, image_id image) RecursiveLocker _(sLock); - legacy_driver *driver = (legacy_driver *)hash_lookup(sDriverHash, - get_leaf(path)); + legacy_driver *driver = sDriverHash->Lookup(get_leaf(path)); if (driver != NULL) { // we know this driver if (strcmp(driver->path, path) != 0) { @@ -638,7 +640,7 @@ add_driver(const char *path, image_id image) driver->uninit_hardware = NULL; new(&driver->devices) DeviceList; - hash_insert(sDriverHash, driver); + sDriverHash->Insert(driver); if (stat.st_dev > 0) change_driver_watcher(stat.st_dev, stat.st_ino, true); @@ -715,7 +717,7 @@ handle_driver_events(void */*_fs*/, int /*iteration*/) RecursiveLocker locker(sLock); TRACE((" add driver %p\n", event->path)); - legacy_driver* driver = (legacy_driver*)hash_lookup(sDriverHash, + legacy_driver* driver = sDriverHash->Lookup( get_leaf(event->path)); if (driver == NULL) legacy_driver_add(event->path); @@ -730,7 +732,7 @@ handle_driver_events(void */*_fs*/, int /*iteration*/) RecursiveLocker locker(sLock); TRACE((" remove driver %p\n", event->path)); - legacy_driver* driver = (legacy_driver*)hash_lookup(sDriverHash, + legacy_driver* driver = sDriverHash->Lookup( get_leaf(event->path)); if (driver != NULL && get_priority(event->path) >= driver->priority) @@ -760,13 +762,10 @@ handle_driver_events(void */*_fs*/, int /*iteration*/) RecursiveLocker locker(sLock); - hash_iterator iterator; - hash_open(sDriverHash, &iterator); - legacy_driver *driver; - while (true) { - driver = (legacy_driver *)hash_next(sDriverHash, &iterator); - if (driver == NULL) - break; + DriverTable::Iterator iterator(sDriverHash); + while (iterator.HasNext()) { + legacy_driver *driver = iterator.Next(); + if (!driver->binary_updated || driver->devices_used != 0) continue; @@ -774,7 +773,6 @@ handle_driver_events(void */*_fs*/, int /*iteration*/) reload_driver(driver); } - hash_close(sDriverHash, &iterator, false); locker.Unlock(); } @@ -876,13 +874,9 @@ dump_driver(int argc, char** argv) if (argc < 2) { // print list of all drivers kprintf("address image used publ. pri name\n"); - hash_iterator iterator; - hash_open(sDriverHash, &iterator); - while (true) { - legacy_driver* driver = (legacy_driver*)hash_next(sDriverHash, - &iterator); - if (driver == NULL) - break; + DriverTable::Iterator iterator(sDriverHash); + while (iterator.HasNext()) { + legacy_driver* driver = iterator.Next(); kprintf("%p %5" B_PRId32 " %3" B_PRIu32 " %5" B_PRId32 " %c " "%3" B_PRId32 " %s\n", driver, @@ -892,7 +886,6 @@ dump_driver(int argc, char** argv) driver->name); } - hash_close(sDriverHash, &iterator, false); return 0; } @@ -901,7 +894,7 @@ dump_driver(int argc, char** argv) return 0; } - legacy_driver* driver = (legacy_driver*)hash_lookup(sDriverHash, argv[1]); + legacy_driver* driver = sDriverHash->Lookup(argv[1]); if (driver == NULL) { kprintf("Driver named \"%s\" not found.\n", argv[1]); return 0; @@ -1458,8 +1451,7 @@ legacy_driver_rescan(const char* driverName) { RecursiveLocker locker(sLock); - legacy_driver* driver = (legacy_driver*)hash_lookup(sDriverHash, - driverName); + legacy_driver* driver = sDriverHash->Lookup(driverName); if (driver == NULL) return B_ENTRY_NOT_FOUND; @@ -1518,11 +1510,8 @@ legacy_driver_probe(const char* subPath) extern "C" status_t legacy_driver_init(void) { - legacy_driver dummyDriver; - sDriverHash = hash_init(DRIVER_HASH_SIZE, - offset_of_member(dummyDriver, next), &driver_entry_compare, - &driver_entry_hash); - if (sDriverHash == NULL) + sDriverHash = new DriverTable(); + if (sDriverHash == NULL || sDriverHash->Init(DRIVER_HASH_SIZE) != B_OK) return B_NO_MEMORY; recursive_lock_init(&sLock, "legacy driver");