Mercurial > hg > dmlib
changeset 27:21c14afbf63d
Modularize the resource system a bit.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sat, 29 Sep 2012 06:00:26 +0300 |
parents | 2f463a59d732 |
children | 920fb22cffcf |
files | dmres.c |
diffstat | 1 files changed, 56 insertions(+), 44 deletions(-) [+] |
line wrap: on
line diff
--- a/dmres.c Sat Sep 29 05:29:38 2012 +0300 +++ b/dmres.c Sat Sep 29 06:00:26 2012 +0300 @@ -32,33 +32,57 @@ DMResource *dmres_new(const char *filename, int flags, size_t size) { - DMResource *res = dmMalloc0(sizeof(DMResource)); - if (res == NULL) + DMResource *node = dmMalloc0(sizeof(DMResource)); + if (node == NULL) return NULL; - res->filename = dm_strdup(filename); - res->flags = flags; - res->dataSize = size; + node->filename = dm_strdup(filename); + node->flags = flags; + node->dataSize = size; - return res; + return node; +} + + +void dmres_free_res_data(DMResource *node) +{ + if (node->rdata != NULL && + node->rops != NULL && + node->rops->free != NULL) + { + node->rops->free(node); + } + + node->rdata = NULL; + node->flags &= !DMF_LOADED_RES; } -void dmres_free(DMResource *res) +void dmres_free_raw_data(DMResource *node) +{ + dmFree(node->data); + node->data = NULL; + node->flags &= !DMF_LOADED_RAW; +} + + +void dmres_purge_raw_data(DMResource *node) { - if (res != NULL) + if ((node->flags & DMF_PRELOAD_RAW) == 0 && + (node->flags & DMF_LOADED_RAW) && + node->data != NULL) + dmres_free_raw_data(node); +} + + +void dmres_free(DMResource *node) +{ + if (node != NULL) { - if (res->rdata != NULL && - res->rops != NULL && - res->rops->free != NULL) - { - res->rops->free(res); - res->rdata = NULL; - } - - dmFree(res->filename); - dmFree(res->data); - dmFree(res); + dmres_free_res_data(node); + dmres_free_raw_data(node); + dmFree(node->filename); + dmFree(node); } } @@ -690,24 +714,24 @@ } -int dmres_ref(DMResource *res) +int dmres_ref(DMResource *node) { DMRES_LOCK(); - res->atime = time(NULL); - res->refcount++; + node->atime = time(NULL); + node->refcount++; DMRES_UNLOCK(); - return res->refcount; + return node->refcount; } -int dmres_unref(DMResource *res) +int dmres_unref(DMResource *node) { DMRES_LOCK(); - res->refcount--; + node->refcount--; DMRES_UNLOCK(); - return res->refcount; + return node->refcount; } @@ -920,7 +944,8 @@ if (dfPreload != NULL) { // Check if the raw resource wants to be preloaded - if (((dfPreload->flags & DMF_PRELOAD_RAW) || (dfResFlags & DRF_PRELOAD_ALL)) && + if (((dfPreload->flags & DMF_PRELOAD_RAW) || + (dfResFlags & DRF_PRELOAD_ALL)) && (dfPreload->flags & DMF_LOADED_RAW) == 0) { dmf_init_fops(dfPreload); @@ -938,7 +963,8 @@ } // Preload actual resource, if requested - if (((dfPreload->flags & DMF_PRELOAD_RES) || (dfResFlags & DRF_PRELOAD_RES)) && + if (((dfPreload->flags & DMF_PRELOAD_RES) || + (dfResFlags & DRF_PRELOAD_RES)) && (dfPreload->flags & DMF_LOADED_RES) == 0 && dfPreload->rops != NULL && dfPreload->rops->load != NULL) @@ -983,22 +1009,8 @@ ((flags & DMPRUNE_MTIME) && currtime - node->mtime >= agems)) { - // Check if resource data is loaded - if (node->rdata != NULL && - node->rops != NULL && - node->rops->free != NULL) - { - node->rops->free(node); - node->flags &= !DMF_LOADED_RES; - } - - // Check if raw data is loaded - if (node->flags & DMF_LOADED_RAW) - { - dmFree(node->data); - node->data = NULL; - node->flags &= !DMF_LOADED_RAW; - } + dmres_free_res_data(node); + dmres_free_raw_data(node); } } }