comparison dmres.c @ 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 e9f562f07cb0
comparison
equal deleted inserted replaced
26:2f463a59d732 27:21c14afbf63d
30 #endif 30 #endif
31 31
32 32
33 DMResource *dmres_new(const char *filename, int flags, size_t size) 33 DMResource *dmres_new(const char *filename, int flags, size_t size)
34 { 34 {
35 DMResource *res = dmMalloc0(sizeof(DMResource)); 35 DMResource *node = dmMalloc0(sizeof(DMResource));
36 if (res == NULL) 36 if (node == NULL)
37 return NULL; 37 return NULL;
38 38
39 res->filename = dm_strdup(filename); 39 node->filename = dm_strdup(filename);
40 res->flags = flags; 40 node->flags = flags;
41 res->dataSize = size; 41 node->dataSize = size;
42 42
43 return res; 43 return node;
44 } 44 }
45 45
46 46
47 void dmres_free(DMResource *res) 47 void dmres_free_res_data(DMResource *node)
48 { 48 {
49 if (res != NULL) 49 if (node->rdata != NULL &&
50 { 50 node->rops != NULL &&
51 if (res->rdata != NULL && 51 node->rops->free != NULL)
52 res->rops != NULL && 52 {
53 res->rops->free != NULL) 53 node->rops->free(node);
54 { 54 }
55 res->rops->free(res); 55
56 res->rdata = NULL; 56 node->rdata = NULL;
57 } 57 node->flags &= !DMF_LOADED_RES;
58 58 }
59 dmFree(res->filename); 59
60 dmFree(res->data); 60
61 dmFree(res); 61 void dmres_free_raw_data(DMResource *node)
62 {
63 dmFree(node->data);
64 node->data = NULL;
65 node->flags &= !DMF_LOADED_RAW;
66 }
67
68
69 void dmres_purge_raw_data(DMResource *node)
70 {
71 if ((node->flags & DMF_PRELOAD_RAW) == 0 &&
72 (node->flags & DMF_LOADED_RAW) &&
73 node->data != NULL)
74 dmres_free_raw_data(node);
75 }
76
77
78 void dmres_free(DMResource *node)
79 {
80 if (node != NULL)
81 {
82 dmres_free_res_data(node);
83 dmres_free_raw_data(node);
84 dmFree(node->filename);
85 dmFree(node);
62 } 86 }
63 } 87 }
64 88
65 89
66 void dmres_insert(DMResource * node) 90 void dmres_insert(DMResource * node)
688 f->atime = time(NULL); 712 f->atime = time(NULL);
689 return f->fops->fread(ptr, size, nmemb, f); 713 return f->fops->fread(ptr, size, nmemb, f);
690 } 714 }
691 715
692 716
693 int dmres_ref(DMResource *res) 717 int dmres_ref(DMResource *node)
694 { 718 {
695 DMRES_LOCK(); 719 DMRES_LOCK();
696 res->atime = time(NULL); 720 node->atime = time(NULL);
697 res->refcount++; 721 node->refcount++;
698 DMRES_UNLOCK(); 722 DMRES_UNLOCK();
699 723
700 return res->refcount; 724 return node->refcount;
701 } 725 }
702 726
703 727
704 int dmres_unref(DMResource *res) 728 int dmres_unref(DMResource *node)
705 { 729 {
706 DMRES_LOCK(); 730 DMRES_LOCK();
707 res->refcount--; 731 node->refcount--;
708 DMRES_UNLOCK(); 732 DMRES_UNLOCK();
709 733
710 return res->refcount; 734 return node->refcount;
711 } 735 }
712 736
713 737
714 int dmres_load_resfile(const char *filename) 738 int dmres_load_resfile(const char *filename)
715 { 739 {
918 } 942 }
919 else 943 else
920 if (dfPreload != NULL) 944 if (dfPreload != NULL)
921 { 945 {
922 // Check if the raw resource wants to be preloaded 946 // Check if the raw resource wants to be preloaded
923 if (((dfPreload->flags & DMF_PRELOAD_RAW) || (dfResFlags & DRF_PRELOAD_ALL)) && 947 if (((dfPreload->flags & DMF_PRELOAD_RAW) ||
948 (dfResFlags & DRF_PRELOAD_ALL)) &&
924 (dfPreload->flags & DMF_LOADED_RAW) == 0) 949 (dfPreload->flags & DMF_LOADED_RAW) == 0)
925 { 950 {
926 dmf_init_fops(dfPreload); 951 dmf_init_fops(dfPreload);
927 if (dfPreload->fops->preload != NULL) 952 if (dfPreload->fops->preload != NULL)
928 { 953 {
936 goto error; 961 goto error;
937 } 962 }
938 } 963 }
939 964
940 // Preload actual resource, if requested 965 // Preload actual resource, if requested
941 if (((dfPreload->flags & DMF_PRELOAD_RES) || (dfResFlags & DRF_PRELOAD_RES)) && 966 if (((dfPreload->flags & DMF_PRELOAD_RES) ||
967 (dfResFlags & DRF_PRELOAD_RES)) &&
942 (dfPreload->flags & DMF_LOADED_RES) == 0 && 968 (dfPreload->flags & DMF_LOADED_RES) == 0 &&
943 dfPreload->rops != NULL && 969 dfPreload->rops != NULL &&
944 dfPreload->rops->load != NULL) 970 dfPreload->rops->load != NULL)
945 { 971 {
946 dmf_init_fops(dfPreload); 972 dmf_init_fops(dfPreload);
981 if (((flags & DMPRUNE_ATIME) && 1007 if (((flags & DMPRUNE_ATIME) &&
982 currtime - node->atime >= agems) || 1008 currtime - node->atime >= agems) ||
983 ((flags & DMPRUNE_MTIME) && 1009 ((flags & DMPRUNE_MTIME) &&
984 currtime - node->mtime >= agems)) 1010 currtime - node->mtime >= agems))
985 { 1011 {
986 // Check if resource data is loaded 1012 dmres_free_res_data(node);
987 if (node->rdata != NULL && 1013 dmres_free_raw_data(node);
988 node->rops != NULL &&
989 node->rops->free != NULL)
990 {
991 node->rops->free(node);
992 node->flags &= !DMF_LOADED_RES;
993 }
994
995 // Check if raw data is loaded
996 if (node->flags & DMF_LOADED_RAW)
997 {
998 dmFree(node->data);
999 node->data = NULL;
1000 node->flags &= !DMF_LOADED_RAW;
1001 }
1002 } 1014 }
1003 } 1015 }
1004 } 1016 }
1005 1017
1006 DMRES_UNLOCK(); 1018 DMRES_UNLOCK();