diff --git a/src/remote_device_db_memory.c b/src/remote_device_db_memory.c index 8e21740ae..67768b40c 100644 --- a/src/remote_device_db_memory.c +++ b/src/remote_device_db_memory.c @@ -107,25 +107,32 @@ static void delete_link_key(bd_addr_t bd_addr){ static void put_link_key(bd_addr_t bd_addr, link_key_t link_key, link_key_type_t link_key_type){ - db_mem_device_link_key_t * existingRecord = (db_mem_device_link_key_t *) get_item(db_mem_link_keys, bd_addr); - - if (existingRecord){ - memcpy(existingRecord->link_key, link_key, LINK_KEY_LEN); - return; + + // check for existing record and remove if found + db_mem_device_link_key_t * record = (db_mem_device_link_key_t *) get_item(db_mem_link_keys, bd_addr); + if (record){ + linked_list_remove(&db_mem_link_keys, (linked_item_t*) record); } - - // Record not found, create new one for this device - db_mem_device_link_key_t * newItem = btstack_memory_db_mem_device_link_key_get(); - if (!newItem){ - newItem = (db_mem_device_link_key_t*)linked_list_get_last_item(&db_mem_link_keys); + + // record not found, get new one from memory pool + if (!record) { + record = btstack_memory_db_mem_device_link_key_get(); } + + // if none left, re-use last item and remove from list + if (!record){ + record = (db_mem_device_link_key_t*)linked_list_get_last_item(&db_mem_link_keys); + if (record) { + linked_list_remove(&db_mem_link_keys, (linked_item_t*) record); + } + } + + if (!record) return; - if (!newItem) return; - - memcpy(newItem->device.bd_addr, bd_addr, sizeof(bd_addr_t)); - memcpy(newItem->link_key, link_key, LINK_KEY_LEN); - newItem->link_key_type = link_key_type; - linked_list_add(&db_mem_link_keys, (linked_item_t *) newItem); + memcpy(record->device.bd_addr, bd_addr, sizeof(bd_addr_t)); + memcpy(record->link_key, link_key, LINK_KEY_LEN); + record->link_key_type = link_key_type; + linked_list_add(&db_mem_link_keys, (linked_item_t *) record); } static void delete_name(bd_addr_t bd_addr){ @@ -138,24 +145,31 @@ static void delete_name(bd_addr_t bd_addr){ } static void put_name(bd_addr_t bd_addr, device_name_t *device_name){ - db_mem_device_name_t * existingRecord = (db_mem_device_name_t *) get_item(db_mem_names, bd_addr); - - if (existingRecord){ - strncpy(existingRecord->device_name, (const char*) device_name, MAX_NAME_LEN); - return; - } - - // Record not found, create a new one for this device - db_mem_device_name_t * newItem = btstack_memory_db_mem_device_name_get(); - if (!newItem) { - newItem = (db_mem_device_name_t*)linked_list_get_last_item(&db_mem_names); - }; - if (!newItem) return; + // check for existing record and remove if found + db_mem_device_name_t * record = (db_mem_device_name_t *) get_item(db_mem_names, bd_addr); + if (record){ + linked_list_remove(&db_mem_names, (linked_item_t*) record); + } + + // record not found, get new one from memory pool + if (!record) { + record = btstack_memory_db_mem_device_name_get(); + } + + // if none left, re-use last item and remove from list + if (!record){ + record = (db_mem_device_name_t*)linked_list_get_last_item(&db_mem_names); + if (record) { + linked_list_remove(&db_mem_names, (linked_item_t*) record); + } + } + + if (!record) return; - memcpy(newItem->device.bd_addr, bd_addr, sizeof(bd_addr_t)); - strncpy(newItem->device_name, (const char*) device_name, MAX_NAME_LEN); - linked_list_add(&db_mem_names, (linked_item_t *) newItem); + memcpy(record->device.bd_addr, bd_addr, sizeof(bd_addr_t)); + strncpy(record->device_name, (const char*) device_name, MAX_NAME_LEN); + linked_list_add(&db_mem_names, (linked_item_t *) record); } diff --git a/test/btstack-config.h b/test/btstack-config.h index 64c0fde02..a0aba8e8e 100644 --- a/test/btstack-config.h +++ b/test/btstack-config.h @@ -24,7 +24,7 @@ #define MAX_NO_BNEP_SERVICES 1 #define MAX_NO_BNEP_CHANNELS MAX_SPP_CONNECTIONS #define MAX_NO_DB_MEM_DEVICE_LINK_KEYS 2 -#define MAX_NO_DB_MEM_DEVICE_NAMES 10 +#define MAX_NO_DB_MEM_DEVICE_NAMES 2 #define MAX_NO_DB_MEM_SERVICES 1 #define HAVE_MALLOC diff --git a/test/remote_device_db/remote_device_db_memory_test.c b/test/remote_device_db/remote_device_db_memory_test.c index d80a65366..52ca4b6df 100644 --- a/test/remote_device_db/remote_device_db_memory_test.c +++ b/test/remote_device_db/remote_device_db_memory_test.c @@ -17,12 +17,13 @@ extern linked_list_t db_mem_names ; void dump(linked_list_t list){ printf("dump:\n"); + int i; linked_item_t *it; - for (it = (linked_item_t *) list; it ; it = it->next){ + for (it = (linked_item_t *) list, i = 1; it ; it = it->next, i++){ db_mem_device_t * item = (db_mem_device_t *) it; db_mem_device_name_t * item1 = (db_mem_device_name_t *) it; db_mem_device_link_key_t * item2 = (db_mem_device_link_key_t *) it; - printf("%s + %s + %u\n", item1->device_name, item2->link_key, item->bd_addr[5]); + printf("%u. %s + %s + %u\n", i, item1->device_name, item2->link_key, item->bd_addr[5]); } } @@ -66,13 +67,14 @@ TEST(RemoteDeviceDB, SinglePutGetDeleteName){ } TEST(RemoteDeviceDB, SortByLastUsedName){ - sprintf((char*)device_name, "%d", 10); - remote_device_db_memory.put_name(addr1, &device_name); - sprintf((char*)device_name, "%d", 20); - remote_device_db_memory.put_name(addr2, &device_name); - sprintf((char*)device_name, "%d", 30); - remote_device_db_memory.put_name(addr3, &device_name); + remote_device_db_memory.put_name(addr1, (device_name_t*) "10"); + // dump(db_mem_names); + remote_device_db_memory.put_name(addr2, (device_name_t*) "20"); + // dump(db_mem_names); + remote_device_db_memory.put_name(addr3, (device_name_t*) "30"); + // dump(db_mem_names); + CHECK(!remote_device_db_memory.get_name(addr1, &device_name)); CHECK(remote_device_db_memory.get_name(addr2, &device_name)); //get first element of the list db_mem_device_name_t * item = (db_mem_device_name_t *) db_mem_names; @@ -102,6 +104,7 @@ TEST(RemoteDeviceDB, SortByLastUsedKey){ remote_device_db_memory.put_link_key(addr3, link_key, link_key_type); // dump(db_mem_link_keys); + CHECK(!remote_device_db_memory.get_link_key(addr1, link_key, &link_key_type)); CHECK(remote_device_db_memory.get_link_key(addr2, link_key, &link_key_type)); // dump(db_mem_link_keys);