diff options
author | Oliver Schwaneberg <oliver.schwaneberg@gmail.com> | 2018-01-18 20:38:19 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2018-01-27 12:23:47 -0800 |
commit | 8accd087159f60e9de3d60538bed867519196147 (patch) | |
tree | ca7cb041a79978e14c76ef52f7e00bc08e6ad406 /core/uemis-downloader.c | |
parent | 75cf43b0b93b519a38c9cd01cf9090c2edefef20 (diff) | |
download | subsurface-8accd087159f60e9de3d60538bed867519196147.tar.gz |
uemis: speed up synchronisation of same divesites
uemis-downloader downloads the dive spot for each dive, even if the same
location was already downloaded before within the ongoing synchronization run.
I modified the function "get_uemis_divespot" to remember all requested
divespot_ids and their mapping to uuids.
New helper functions:
- static void erase_divespot_mapping()
- static void add_to_divespot_mapping(int divespot_id,
uint32_t dive_site_uuid)
- static bool is_divespot_mappable(int divespot_id)
- static uint32_t get_dive_site_uuid_by_divespot_id(int divespot_id)
The memory leak is removed through the call of erade_divespot_mapping().
Signed-off-by: Oliver Schwaneberg <oliver.schwaneberg@gmail.com>
Diffstat (limited to 'core/uemis-downloader.c')
-rw-r--r-- | core/uemis-downloader.c | 67 |
1 files changed, 65 insertions, 2 deletions
diff --git a/core/uemis-downloader.c b/core/uemis-downloader.c index 1587f9f5f..2939b3cf6 100644 --- a/core/uemis-downloader.c +++ b/core/uemis-downloader.c @@ -76,6 +76,65 @@ static int dive_to_read = 0; static int max_deleted_seen = -1; +/* Linked list to remember already executed divespot download requests */ +struct divespot_mapping { + int divespot_id; + uint32_t dive_site_uuid; + struct divespot_mapping *next; +}; +static struct divespot_mapping *divespot_mapping = NULL; + +static void erase_divespot_mapping() +{ + struct divespot_mapping *tmp; + while (divespot_mapping != NULL) { + tmp = divespot_mapping; + divespot_mapping = tmp->next; + free(tmp); + } + divespot_mapping = NULL; +} + +static void add_to_divespot_mapping(int divespot_id, uint32_t dive_site_uuid) +{ + struct divespot_mapping *ndm = (struct divespot_mapping*)calloc(1, sizeof(struct divespot_mapping)); + struct divespot_mapping **pdm = &divespot_mapping; + struct divespot_mapping *cdm = *pdm; + + while (cdm && cdm->next) + cdm = cdm->next; + + ndm->divespot_id = divespot_id; + ndm->dive_site_uuid = dive_site_uuid; + ndm->next = NULL; + if (cdm) + cdm->next = ndm; + else + cdm = *pdm = ndm; +} + +static bool is_divespot_mappable(int divespot_id) +{ + struct divespot_mapping *dm = divespot_mapping; + while (dm) { + if (dm->divespot_id == divespot_id) + return true; + dm = dm->next; + } + return false; +} + +static uint32_t get_dive_site_uuid_by_divespot_id(int divespot_id) +{ + struct divespot_mapping *dm = divespot_mapping; + while (dm) { + if (dm->divespot_id == divespot_id) + return dm->dive_site_uuid; + dm = dm->next; + } + return 0; +} + /* helper function to parse the Uemis data structures */ static void uemis_ts(char *buffer, void *_when) { @@ -243,7 +302,7 @@ static bool uemis_init(const char *path) { char *ans_path; int i; - + erase_divespot_mapping(); if (!path) return false; /* let's check if this is indeed a Uemis DC */ @@ -1117,7 +1176,10 @@ static bool load_uemis_divespot(const char *mountpath, int divespot_id) static void get_uemis_divespot(const char *mountpath, int divespot_id, struct dive *dive) { struct dive_site *nds = get_dive_site_by_uuid(dive->dive_site_uuid); - if (nds && nds->name && strstr(nds->name,"from Uemis")) { + + if (is_divespot_mappable(divespot_id)) { + dive->dive_site_uuid = get_dive_site_uuid_by_divespot_id(divespot_id); + } else if (nds && nds->name && strstr(nds->name,"from Uemis")) { if (load_uemis_divespot(mountpath, divespot_id)) { /* get the divesite based on the diveid, this should give us * the newly created site @@ -1135,6 +1197,7 @@ static void get_uemis_divespot(const char *mountpath, int divespot_id, struct di dive->dive_site_uuid = ods->uuid; } } + add_to_divespot_mapping(divespot_id, dive->dive_site_uuid); } else { /* if we can't load the dive site details, delete the site we * created in process_raw_buffer |