4 * Copyright (c) 2009-2011 project bchan
6 * This software is provided 'as-is', without any express or implied
7 * warranty. In no event will the authors be held liable for any damages
8 * arising from the use of this software.
10 * Permission is granted to anyone to use this software for any purpose,
11 * including commercial applications, and to alter it and redistribute it
12 * freely, subject to the following restrictions:
14 * 1. The origin of this software must not be misrepresented; you must not
15 * claim that you wrote the original software. If you use this software
16 * in a product, an acknowledgment in the product documentation would be
17 * appreciated but is not required.
19 * 2. Altered source versions must be plainly marked as such, and must not be
20 * misrepresented as being the original software.
22 * 3. This notice may not be removed or altered from any source
32 #include <btron/btron.h>
33 #include <bsys/queue.h>
36 #include "residhash.h"
37 #include "resindexhash.h"
40 typedef struct datcache_data_t_ datcache_data_t;
42 struct datcache_data_t_ {
48 #define DATCACHE_FLAG_DATAPPENDED 0x00000001
49 #define DATCACHE_FLAG_DATRESETED 0x00000002
50 #define DATCACHE_FLAG_IDINFOUPDATED 0x00000004
51 #define DATCACHE_FLAG_INDEXINFOUPDATED 0x00000008
52 #define DATCACHE_FLAG_LATESTHEADERUPDATED 0x00000010
53 #define DATCACHE_FLAG_NGWORDINFOUPDATED 0x00000020
60 datcache_data_t datalist;
63 datcache_datareadcontext_t *context;
74 residhash_t residhash;
75 resindexhash_t resindexhash;
76 wordlist_t ngwordlist;
79 struct datcache_datareadcontext_t_ {
81 datcache_data_t *current;
85 struct datcache_ngwordreadcontext_t_ {
86 wordlist_iterator_t iter;
89 LOCAL datcache_data_t* datcache_data_next(datcache_data_t *data)
91 return (datcache_data_t*)data->queue.next;
94 LOCAL datcache_data_t* datcache_data_new(UB *data, W len)
96 datcache_data_t *cache_data;
98 cache_data = malloc(sizeof(datcache_data_t));
99 if (cache_data == NULL) {
102 cache_data->data = malloc(sizeof(UB)*len);
103 if (cache_data->data == NULL) {
107 memcpy(cache_data->data, data, len);
108 cache_data->len = len;
113 LOCAL VOID datcache_data_delete(datcache_data_t *cache_data)
115 QueRemove(&(cache_data->queue));
116 if (cache_data->data != NULL) {
117 free(cache_data->data);
122 LOCAL VOID datcache_setappendedflag(datcache_t *cache)
124 cache->flag = cache->flag | DATCACHE_FLAG_DATAPPENDED;
127 LOCAL VOID datcache_clearappendedflag(datcache_t *cache)
129 cache->flag = cache->flag & ~DATCACHE_FLAG_DATAPPENDED;
132 LOCAL Bool datcache_issetappendedflag(datcache_t *cache)
134 if ((cache->flag & DATCACHE_FLAG_DATAPPENDED) == 0) {
140 LOCAL VOID datcache_setresetedflag(datcache_t *cache)
142 cache->flag = cache->flag | DATCACHE_FLAG_DATRESETED;
145 LOCAL Bool datcache_issetresetedflag(datcache_t *cache)
147 if ((cache->flag & DATCACHE_FLAG_DATRESETED) == 0) {
153 LOCAL VOID datcache_setidinfoupdatedflag(datcache_t *cache)
155 cache->flag = cache->flag | DATCACHE_FLAG_IDINFOUPDATED;
158 LOCAL Bool datcache_issetidinfoupdatedflag(datcache_t *cache)
160 if ((cache->flag & DATCACHE_FLAG_IDINFOUPDATED) == 0) {
166 LOCAL VOID datcache_setindexinfoupdatedflag(datcache_t *cache)
168 cache->flag = cache->flag | DATCACHE_FLAG_INDEXINFOUPDATED;
171 LOCAL Bool datcache_issetindexinfoupdatedflag(datcache_t *cache)
173 if ((cache->flag & DATCACHE_FLAG_INDEXINFOUPDATED) == 0) {
179 LOCAL VOID datcache_setngwordinfoupdatedflag(datcache_t *cache)
181 cache->flag = cache->flag | DATCACHE_FLAG_NGWORDINFOUPDATED;
184 LOCAL Bool datcache_issetngwordinfoupdatedflag(datcache_t *cache)
186 if ((cache->flag & DATCACHE_FLAG_NGWORDINFOUPDATED) == 0) {
192 LOCAL VOID datcache_setlatestheaderupdatedflag(datcache_t *cache)
194 cache->flag = cache->flag | DATCACHE_FLAG_LATESTHEADERUPDATED;
197 LOCAL Bool datcache_issetlatestheaderupdatedflag(datcache_t *cache)
199 if ((cache->flag & DATCACHE_FLAG_LATESTHEADERUPDATED) == 0) {
205 EXPORT W datcache_appenddata(datcache_t *cache, UB *data, W len)
207 datcache_data_t *cache_data;
210 err = wai_sem(cache->semid, T_FOREVER);
215 if (cache->context != NULL) {
216 sig_sem(cache->semid);
220 cache_data = datcache_data_new(data, len);
221 if (cache_data == NULL) {
222 sig_sem(cache->semid);
223 return -1; /* TODO */
225 QueInsert(&(cache_data->queue), &(cache->datalist.queue));
226 cache->s_datsize += len;
228 datcache_setappendedflag(cache);
230 sig_sem(cache->semid);
235 EXPORT VOID datcache_cleardata(datcache_t *cache)
237 datcache_data_t *cache_data;
241 err = wai_sem(cache->semid, T_FOREVER);
246 if (cache->context != NULL) {
247 sig_sem(cache->semid);
252 ok = isQueEmpty(&(cache->datalist.queue));
256 cache_data = (datcache_data_t*)cache->datalist.queue.next;
257 datcache_data_delete(cache_data);
259 free(cache->datalist.data);
261 cache->datalist.data = NULL;
262 cache->datalist.len = 0;
263 cache->s_datsize = 0;
265 datcache_clearappendedflag(cache);
266 datcache_setresetedflag(cache);
268 sig_sem(cache->semid);
271 EXPORT Bool datcache_datareadcontext_nextdata(datcache_datareadcontext_t *context, UB **bin, W *len)
273 datcache_data_t *next;
275 if (context->current == NULL) {
279 *bin = context->current->data + context->index;
280 *len = context->current->len - context->index;
282 next = datcache_data_next(context->current);
283 if (next == &(context->datcache->datalist)) {
286 context->current = next;
292 LOCAL datcache_datareadcontext_t* datcache_datareadcontext_new(datcache_t *cache)
294 datcache_datareadcontext_t *context;
296 context = malloc(sizeof(datcache_datareadcontext_t*));
297 if (context == NULL) {
300 context->datcache = cache;
305 LOCAL VOID datcache_datareadcontext_delete(datcache_datareadcontext_t *context)
310 EXPORT datcache_datareadcontext_t* datcache_startdataread(datcache_t *cache, W start)
312 datcache_datareadcontext_t *context;
313 datcache_data_t *cache_data;
316 err = wai_sem(cache->semid, T_FOREVER);
321 if (cache->context != NULL) {
322 sig_sem(cache->semid);
326 context = datcache_datareadcontext_new(cache);
327 if (context == NULL) {
330 cache->context = context;
332 if (start >= cache->s_datsize) {
333 context->current = NULL;
338 cache_data = &(cache->datalist);
341 if (dest < cache_data->len) {
344 dest -= cache_data->len;
345 cache_data = datcache_data_next(cache_data);
348 context->current = cache_data;
349 context->index = dest;
354 EXPORT VOID datcache_enddataread(datcache_t *cache, datcache_datareadcontext_t *context)
356 cache->context = NULL;
357 datcache_datareadcontext_delete(context);
359 sig_sem(cache->semid);
362 EXPORT VOID datcache_getlatestheader(datcache_t *cache, UB **header, W *len)
364 *header = cache->latestheader;
365 *len = cache->latestheader_len;
368 EXPORT W datcache_updatelatestheader(datcache_t *cache, UB *header, W len)
372 latestheader0 = realloc(cache->latestheader, len + 1);
373 if (latestheader0 == NULL) {
377 cache->latestheader = latestheader0;
378 memcpy(cache->latestheader, header, len);
379 cache->latestheader_len = len;
380 cache->latestheader[cache->latestheader_len] = '\0';
382 datcache_setlatestheaderupdatedflag(cache);
387 EXPORT VOID datcache_gethost(datcache_t *cache, UB **host, W *len)
390 *len = cache->host_len;
393 EXPORT VOID datcache_getborad(datcache_t *cache, UB **borad, W *len)
395 *borad = cache->board;
396 *len = cache->board_len;
399 EXPORT VOID datcache_getthread(datcache_t *cache, UB **thread, W *len)
401 *thread = cache->thread;
402 *len = cache->thread_len;
405 LOCAL VOID datcache_setupretrinfo(datcache_t *cache, UB *retrinfo, W len)
409 cache->retrinfo = retrinfo;
410 cache->retrinfo_len = len;
414 cache->board_len = 0;
415 cache->thread = NULL;
416 cache->thread_len = 0;
418 if (cache->retrinfo == NULL) {
422 cache->host = cache->retrinfo;
423 for (; i < len; i++) {
424 if (cache->retrinfo[i] == '\n') {
431 cache->board = cache->retrinfo + i;
432 for (; i < len; i++) {
433 if (cache->retrinfo[i] == '\n') {
440 cache->thread = cache->retrinfo + i;
441 for (; i < len; i++) {
442 if (cache->retrinfo[i] == '\n') {
449 LOCAL W datcache_preparerec_forwritefile(W fd, W rectype, W subtype, Bool need_truncute)
453 err = fnd_rec(fd, F_TOPEND, 1 << rectype, subtype, NULL);
455 err = ins_rec(fd, NULL, 0, rectype, subtype, 0);
459 err = see_rec(fd, -1, 0, NULL);
463 } else if (err < 0) {
464 return -1; /* TODO */
466 if (need_truncute == True) {
467 err = trc_rec(fd, 0);
477 LOCAL W datcache_deleterec_forwritefile(W fd, W rectype, W subtype)
481 err = fnd_rec(fd, F_TOPEND, 1 << rectype, subtype, NULL);
484 } else if (err < 0) {
485 return -1; /* TODO */
490 return -1; /* TODO */
496 EXPORT W datcache_datasize(datcache_t *cache)
498 return cache->s_datsize;
501 LOCAL W datcache_writefile_latestheader(datcache_t *cache)
505 if (cache->latestheader_len <= 0) {
509 err = datcache_preparerec_forwritefile(cache->fd, DATCACHE_RECORDTYPE_INFO, DATCACHE_RECORDSUBTYPE_HEADER, True);
513 err = wri_rec(cache->fd, -1, cache->latestheader, cache->latestheader_len, NULL, NULL, 0);
521 LOCAL W datcache_writefile_residhash(datcache_t *cache)
525 residhash_iterator_t iter;
532 updated = datcache_issetidinfoupdatedflag(cache);
533 if (updated == False) {
537 len = residhash_datanum(&cache->residhash);
539 err = datcache_preparerec_forwritefile(cache->fd, DATCACHE_RECORDTYPE_INFO, DATCACHE_RECORDSUBTYPE_RESIDINFO, True);
543 residhash_iterator_initialize(&iter, &cache->residhash);
545 cont = residhash_iterator_next(&iter, &idstr, &idstr_len, &attr, &color);
549 *(UH*)bin = idstr_len * 2;
550 err = wri_rec(cache->fd, -1, bin, 2, NULL, NULL, 0);
554 err = wri_rec(cache->fd, -1, (UB*)idstr, idstr_len * 2, NULL, NULL, 0);
559 *(UW*)(bin + 2) = attr;
560 *(COLOR*)(bin + 2 + 4) = color;
561 err = wri_rec(cache->fd, -1, bin, 10, NULL, NULL, 0);
566 residhash_iterator_finalize(&iter);
568 err = datcache_deleterec_forwritefile(cache->fd, DATCACHE_RECORDTYPE_INFO, DATCACHE_RECORDSUBTYPE_RESIDINFO);
577 LOCAL W datcache_writefile_resindexhash(datcache_t *cache)
581 resindexhash_iterator_t iter;
586 updated = datcache_issetindexinfoupdatedflag(cache);
587 if (updated == False) {
591 len = resindexhash_datanum(&cache->resindexhash);
593 err = datcache_preparerec_forwritefile(cache->fd, DATCACHE_RECORDTYPE_INFO, DATCACHE_RECORDSUBTYPE_RESINDEXINFO, True);
597 resindexhash_iterator_initialize(&iter, &cache->resindexhash);
599 cont = resindexhash_iterator_next(&iter, &index, &attr, &color);
607 err = wri_rec(cache->fd, -1, bin, 2, NULL, NULL, 0);
611 *(UH*)bin = index & 0xFFFF;
612 err = wri_rec(cache->fd, -1, bin, 2, NULL, NULL, 0);
617 *(UW*)(bin + 2) = attr;
618 *(COLOR*)(bin + 2 + 4) = color;
619 err = wri_rec(cache->fd, -1, bin, 10, NULL, NULL, 0);
624 resindexhash_iterator_finalize(&iter);
626 err = datcache_deleterec_forwritefile(cache->fd, DATCACHE_RECORDTYPE_INFO, DATCACHE_RECORDSUBTYPE_RESINDEXINFO);
635 LOCAL W datcache_writefile_ngwordlist(datcache_t *cache)
637 Bool cont, updated, empty;
639 wordlist_iterator_t iter;
644 updated = datcache_issetngwordinfoupdatedflag(cache);
645 if (updated == False) {
649 empty = wordlist_isempty(&cache->ngwordlist);
650 if (empty == False) {
651 err = datcache_preparerec_forwritefile(cache->fd, DATCACHE_RECORDTYPE_INFO, DATCACHE_RECORDSUBTYPE_NGWORDINFO, True);
653 wordlist_iterator_finalize(&iter);
657 wordlist_iterator_initialize(&iter, &cache->ngwordlist);
659 cont = wordlist_iterator_next(&iter, &str, &str_len);
664 *(UH*)bin = str_len * 2;
665 err = wri_rec(cache->fd, -1, bin, 2, NULL, NULL, 0);
669 err = wri_rec(cache->fd, -1, (UB*)str, str_len * 2, NULL, NULL, 0);
675 err = wri_rec(cache->fd, -1, bin, 4, NULL, NULL, 0);
680 wordlist_iterator_finalize(&iter);
682 err = datcache_deleterec_forwritefile(cache->fd, DATCACHE_RECORDTYPE_INFO, DATCACHE_RECORDSUBTYPE_NGWORDINFO);
691 LOCAL W datcache_writedat_appended(datcache_t *cache)
695 datcache_data_t *cache_data;
697 err = datcache_preparerec_forwritefile(cache->fd, DATCACHE_RECORDTYPE_MAIN, 0, False);
702 err = loc_rec(cache->fd, F_LOCK);
707 err = ofl_sts(cache->fd, NULL, &fstate, NULL);
709 loc_rec(cache->fd, F_UNLOCK);
712 if (cache->mtime_open != fstate.f_mtime) {
713 loc_rec(cache->fd, F_UNLOCK);
716 err = rea_rec(cache->fd, 0, NULL, 0, &size, NULL);
718 loc_rec(cache->fd, F_UNLOCK);
721 if (cache->recsize_open != size) {
722 loc_rec(cache->fd, F_UNLOCK);
726 cache_data = datcache_data_next(&(cache->datalist));
728 if (cache_data == &(cache->datalist)) {
732 err = wri_rec(cache->fd, -1, cache_data->data, cache_data->len, NULL, NULL, 0);
734 loc_rec(cache->fd, F_UNLOCK);
738 cache_data = datcache_data_next(cache_data);
741 loc_rec(cache->fd, F_UNLOCK);
746 LOCAL W datcache_writedat_allupdateded(datcache_t *cache)
749 datcache_data_t *cache_data;
751 if (cache->s_datsize <= 0) {
755 err = datcache_preparerec_forwritefile(cache->fd, DATCACHE_RECORDTYPE_MAIN, 0, True);
760 err = loc_rec(cache->fd, F_LOCK);
765 cache_data = &(cache->datalist);
767 err = wri_rec(cache->fd, -1, cache_data->data, cache_data->len, NULL, NULL, 0);
769 loc_rec(cache->fd, F_UNLOCK);
772 cache_data = datcache_data_next(cache_data);
773 if (cache_data == &(cache->datalist)) {
778 loc_rec(cache->fd, F_UNLOCK);
783 EXPORT W datcache_writefile(datcache_t *cache)
786 Bool appended, reseted, header_updated;
788 appended = datcache_issetappendedflag(cache);
789 reseted = datcache_issetresetedflag(cache);
790 header_updated = datcache_issetlatestheaderupdatedflag(cache);
792 if (appended == True) {
793 if (reseted == True) {
794 err = datcache_writedat_allupdateded(cache);
796 err = datcache_writedat_appended(cache);
803 if (header_updated == True) {
804 err = datcache_writefile_latestheader(cache);
810 err = datcache_writefile_residhash(cache);
814 err = datcache_writefile_resindexhash(cache);
818 err = datcache_writefile_ngwordlist(cache);
826 EXPORT W datcache_addresiddata(datcache_t *cache, TC *idstr, W idstr_len, UW attr, COLOR color)
828 datcache_setidinfoupdatedflag(cache);
829 return residhash_adddata(&cache->residhash, idstr, idstr_len, attr, color);
832 EXPORT W datcache_searchresiddata(datcache_t *cache, TC *idstr, W idstr_len, UW *attr, COLOR *color)
834 return residhash_searchdata(&cache->residhash, idstr, idstr_len, attr, color);
837 EXPORT VOID datcache_removeresiddata(datcache_t *cache, TC *idstr, W idstr_len)
839 datcache_setidinfoupdatedflag(cache);
840 residhash_removedata(&cache->residhash, idstr, idstr_len);
843 EXPORT W datcache_addresindexdata(datcache_t *cache, W index, UW attr, COLOR color)
845 datcache_setindexinfoupdatedflag(cache);
846 return resindexhash_adddata(&cache->resindexhash, index, attr, color);
849 EXPORT W datcache_searchresindexdata(datcache_t *cache, W index, UW *attr, COLOR *color)
851 return resindexhash_searchdata(&cache->resindexhash, index, attr, color);
854 EXPORT VOID datcache_removeresindexdata(datcache_t *cache, W index)
856 datcache_setindexinfoupdatedflag(cache);
857 resindexhash_removedata(&cache->resindexhash, index);
860 EXPORT W datcache_appendngword(datcache_t *cache, TC *str, W len)
862 datcache_setngwordinfoupdatedflag(cache);
863 return wordlist_appendword(&cache->ngwordlist, str, len);
866 EXPORT VOID datcache_removengword(datcache_t *cache, TC *str, W len)
868 datcache_setngwordinfoupdatedflag(cache);
869 wordlist_removeword(&cache->ngwordlist, str, len);
872 EXPORT Bool datcache_checkngwordexist(datcache_t *cache, TC *str, W len)
874 return wordlist_checkexistbyword(&cache->ngwordlist, str, len);
877 EXPORT datcache_ngwordreadcontext_t* datcache_startngwordread(datcache_t *cache)
879 datcache_ngwordreadcontext_t *context;
881 context = malloc(sizeof(datcache_ngwordreadcontext_t));
882 if (context == NULL) {
885 wordlist_iterator_initialize(&context->iter, &cache->ngwordlist);
889 EXPORT VOID datcache_endngwordread(datcache_t *cache, datcache_ngwordreadcontext_t *context)
891 wordlist_iterator_finalize(&context->iter);
895 EXPORT Bool datcache_ngwordreadcontext_nextdata(datcache_ngwordreadcontext_t *context, TC **str, W *len)
897 return wordlist_iterator_next(&context->iter, str, len);
900 LOCAL W datcache_getrec_fromfile(W fd, W rectype, W subtype, UB **data, W *size)
905 err = fnd_rec(fd, F_TOPEND, 1 << rectype, subtype, NULL);
912 return -1; /* TODO */
914 err = rea_rec(fd, 0, NULL, 0, &size0, NULL);
916 return -1; /* TODO */
923 data0 = malloc(size0);
925 return -1; /* TODO */
927 err = rea_rec(fd, 0, data0, size0, NULL, NULL);
930 return -1; /* TODO */
939 LOCAL W datcache_getdat_fromfile(W fd, UB **data, W *size)
941 return datcache_getrec_fromfile(fd, DATCACHE_RECORDTYPE_MAIN, 0, data, size);
944 LOCAL W datcache_getretrinfo_fromfile(W fd, UB **data, W *size)
946 return datcache_getrec_fromfile(fd, DATCACHE_RECORDTYPE_INFO, DATCACHE_RECORDSUBTYPE_RETRIEVE, data, size);
949 LOCAL W datcache_getheader_fromfile(W fd, UB **data, W *size)
951 return datcache_getrec_fromfile(fd, DATCACHE_RECORDTYPE_INFO, DATCACHE_RECORDSUBTYPE_HEADER, data, size);
954 LOCAL W datcache_readresidinfo(datcache_t *cache)
957 W recsize, err = 0, idstr_len, i;
963 err = datcache_getrec_fromfile(cache->fd, DATCACHE_RECORDTYPE_INFO, DATCACHE_RECORDSUBTYPE_RESIDINFO, &recdata, &recsize);
972 for (i = 0; i < recsize; ) {
973 chunksize = *(UH*)(recdata + i);
975 idstr = (TC*)(recdata + i);
976 idstr_len = chunksize / 2;
978 chunksize = *(UH*)(recdata + i);
980 if (chunksize >= 4) {
981 attr = *(UW*)(recdata + i);
982 if (chunksize >= 8) {
983 color = *(COLOR*)(recdata + i + 4);
987 err = residhash_adddata(&cache->residhash, idstr, idstr_len, attr, color);
1000 LOCAL W datcache_readresindexinfo(datcache_t *cache)
1003 W recsize, err = 0, i, index;
1008 err = datcache_getrec_fromfile(cache->fd, DATCACHE_RECORDTYPE_INFO, DATCACHE_RECORDSUBTYPE_RESINDEXINFO, &recdata, &recsize);
1014 return 0; /* TODO */
1017 for (i = 0; i < recsize; ) {
1018 chunksize = *(UH*)(recdata + i);
1020 index = *(UH*)(recdata + i);
1022 chunksize = *(UH*)(recdata + i);
1024 if (chunksize >= 4) {
1025 attr = *(UW*)(recdata + i);
1026 if (chunksize >= 8) {
1027 color = *(COLOR*)(recdata + i + 4);
1031 err = resindexhash_adddata(&cache->resindexhash, index, attr, color);
1044 LOCAL W datcache_readngwordinfo(datcache_t *cache)
1047 W recsize, err = 0, str_len, i;
1051 err = datcache_getrec_fromfile(cache->fd, DATCACHE_RECORDTYPE_INFO, DATCACHE_RECORDSUBTYPE_NGWORDINFO, &recdata, &recsize);
1057 return 0; /* TODO */
1060 for (i = 0; i < recsize; ) {
1061 chunksize = *(UH*)(recdata + i);
1063 str = (TC*)(recdata + i);
1064 str_len = chunksize / 2;
1066 chunksize = *(UH*)(recdata + i);
1068 err = wordlist_appendword(&cache->ngwordlist, str, str_len);
1080 EXPORT datcache_t* datcache_new(VID vid)
1085 W size, retrinfo_len, header_len;
1086 UB *rawdat, *retrinfo, *header;
1089 fd = oopn_obj(vid, NULL, F_READ|F_WRITE, NULL);
1093 err = ofl_sts(fd, NULL, &fstate, NULL);
1097 semid = cre_sem(1, SEM_EXCL|DELEXIT);
1102 err = datcache_getdat_fromfile(fd, &rawdat, &size);
1108 err = datcache_getretrinfo_fromfile(fd, &retrinfo, &retrinfo_len);
1110 if (rawdat != NULL) {
1117 err = datcache_getheader_fromfile(fd, &header, &header_len);
1119 if (retrinfo != NULL) {
1122 if (rawdat != NULL) {
1130 cache = (datcache_t*)malloc(sizeof(datcache_t));
1131 if (cache == NULL) {
1140 cache->mtime_open = fstate.f_mtime;
1141 cache->semid = semid;
1142 QueInit(&(cache->datalist.queue));
1143 cache->datalist.data = rawdat;
1144 cache->datalist.len = size;
1145 cache->s_datsize = size;
1146 cache->recsize_open = size;
1147 cache->context = NULL;
1149 datcache_setupretrinfo(cache, retrinfo, retrinfo_len);
1150 cache->latestheader = header;
1151 cache->latestheader_len = header_len;
1153 err = residhash_initialize(&cache->residhash);
1162 err = resindexhash_initialize(&cache->resindexhash);
1164 residhash_finalize(&cache->residhash);
1172 err = wordlist_initialize(&cache->ngwordlist);
1174 resindexhash_finalize(&cache->resindexhash);
1175 residhash_finalize(&cache->residhash);
1184 err = datcache_readresidinfo(cache);
1186 wordlist_finalize(&cache->ngwordlist);
1187 resindexhash_finalize(&cache->resindexhash);
1188 residhash_finalize(&cache->residhash);
1196 err = datcache_readresindexinfo(cache);
1198 wordlist_finalize(&cache->ngwordlist);
1199 resindexhash_finalize(&cache->resindexhash);
1200 residhash_finalize(&cache->residhash);
1208 err = datcache_readngwordinfo(cache);
1210 wordlist_finalize(&cache->ngwordlist);
1211 resindexhash_finalize(&cache->resindexhash);
1212 residhash_finalize(&cache->residhash);
1224 EXPORT VOID datcache_delete(datcache_t *cache)
1226 datcache_data_t *cache_data;
1229 wordlist_finalize(&cache->ngwordlist);
1230 resindexhash_finalize(&cache->resindexhash);
1231 residhash_finalize(&cache->residhash);
1233 if (cache->latestheader != NULL) {
1234 free(cache->latestheader);
1236 if (cache->retrinfo != NULL) {
1237 free(cache->retrinfo);
1241 ok = isQueEmpty(&(cache->datalist.queue));
1245 cache_data = datcache_data_next(&cache->datalist);
1246 datcache_data_delete(cache_data);
1248 free(cache->datalist.data);
1249 del_sem(cache->semid);