00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #ifndef _FIX_LUMPS_H
00041 #define _FIX_LUMPS_H
00042
00043
00044 inline static void free_rr_lump( struct lump **list )
00045 {
00046 struct lump *prev_lump, *lump, *a, *foo, *next;
00047 int first_shmem;
00048
00049 first_shmem=1;
00050 next=0;
00051 prev_lump=0;
00052 for(lump=*list;lump;lump=next) {
00053 next=lump->next;
00054 if (lump->type==HDR_RECORDROUTE_T) {
00055
00056
00057
00058
00059
00060
00061 a=lump->before;
00062 while(a) {
00063 foo=a; a=a->before;
00064 if (!(foo->flags&(LUMPFLAG_DUPED|LUMPFLAG_SHMEM)))
00065 free_lump(foo);
00066 if (!(foo->flags&LUMPFLAG_SHMEM))
00067 pkg_free(foo);
00068 }
00069 a=lump->after;
00070 while(a) {
00071 foo=a; a=a->after;
00072 if (!(foo->flags&(LUMPFLAG_DUPED|LUMPFLAG_SHMEM)))
00073 free_lump(foo);
00074 if (!(foo->flags&LUMPFLAG_SHMEM))
00075 pkg_free(foo);
00076 }
00077
00078 if (first_shmem && (lump->flags&LUMPFLAG_SHMEM)) {
00079
00080
00081
00082
00083
00084
00085 LOG(L_DBG, "DEBUG: free_rr_lump: lump %p" \
00086 " is left in the list\n",
00087 lump);
00088
00089 if (lump->len)
00090 LOG(L_CRIT, "BUG: free_rr_lump: lump %p" \
00091 " can not be removed, but len=%d\n",
00092 lump, lump->len);
00093
00094 prev_lump=lump;
00095 } else {
00096 if (prev_lump) prev_lump->next = lump->next;
00097 else *list = lump->next;
00098 if (!(lump->flags&(LUMPFLAG_DUPED|LUMPFLAG_SHMEM)))
00099 free_lump(lump);
00100 if (!(lump->flags&LUMPFLAG_SHMEM))
00101 pkg_free(lump);
00102 }
00103 } else {
00104
00105 prev_lump=lump;
00106 }
00107 if (first_shmem && (lump->flags&LUMPFLAG_SHMEM))
00108 first_shmem=0;
00109 }
00110 }
00111
00112 #endif