[Pkg-clamav-commits] [SCM] Debian repository for ClamAV branch, debian/unstable, updated. debian/0.95+dfsg-1-6156-g094ec9b
aCaB
acab at clamav.net
Sun Apr 4 01:07:34 UTC 2010
The following commit has been merged in the debian/unstable branch:
commit cf06996428dfc5e0d569c2045d6a08f3c376016e
Author: aCaB <acab at clamav.net>
Date: Sat Oct 10 16:04:55 2009 +0200
fmap: do not use flexible bitmap array, inline minimal funcs
diff --git a/libclamav/fmap.c b/libclamav/fmap.c
index 591ff81..5a2f675 100644
--- a/libclamav/fmap.c
+++ b/libclamav/fmap.c
@@ -72,20 +72,21 @@ pthread_mutex_t fmap_mutex = PTHREAD_MUTEX_INITIALIZER;
#define fmap_unlock
#endif
+#define fmap_bitmap (&m->placeholder_for_bitmap)
/* pread proto here in order to avoid the use of XOPEN and BSD_SOURCE
which may in turn prevent some mmap constants to be defined */
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
-static unsigned int fmap_align_items(unsigned int sz, unsigned int al) {
+static inline unsigned int fmap_align_items(unsigned int sz, unsigned int al) {
return sz / al + (sz % al != 0);
}
-static unsigned int fmap_align_to(unsigned int sz, unsigned int al) {
+static inline unsigned int fmap_align_to(unsigned int sz, unsigned int al) {
return al * fmap_align_items(sz, al);
}
-static unsigned int fmap_which_page(fmap_t *m, size_t at) {
+static inline unsigned int fmap_which_page(fmap_t *m, size_t at) {
return at / m->pgsz;
}
@@ -114,7 +115,7 @@ fmap_t *fmap(int fd, off_t offset, size_t len) {
return NULL;
}
pages = fmap_align_items(len, pgsz);
- hdrsz = fmap_align_to(sizeof(fmap_t) + pages * sizeof(uint32_t), pgsz);
+ hdrsz = fmap_align_to(sizeof(fmap_t) + (pages-1) * sizeof(uint32_t), pgsz); /* fmap_t includes 1 bitmap slot, hence (pages-1) */
mapsz = pages * pgsz + hdrsz;
fmap_lock;
#if HAVE_MMAP
@@ -133,7 +134,7 @@ fmap_t *fmap(int fd, off_t offset, size_t len) {
return NULL;
}
/* fault the header while we still have the lock - we DO context switch here a lot here :@ */
- memset(m->bitmap, 0, sizeof(uint32_t) * pages);
+ memset(fmap_bitmap, 0, sizeof(uint32_t) * pages);
fmap_unlock;
m->fd = fd;
m->dumb = dumb;
@@ -162,10 +163,10 @@ static void fmap_aging(fmap_t *m) {
unsigned int i, avail = 0, freeme[2048], maxavail = MIN(sizeof(freeme)/sizeof(*freeme), m->paged - UNPAGE_THRSHLD_LO / m->pgsz) - 1;
for(i=0; i<m->pages; i++) {
- uint32_t s = m->bitmap[i];
+ uint32_t s = fmap_bitmap[i];
if((s & (FM_MASK_PAGED | FM_MASK_LOCKED)) == FM_MASK_PAGED ) {
/* page is paged and not locked: dec age */
- if(s & FM_MASK_COUNT) m->bitmap[i]--;
+ if(s & FM_MASK_COUNT) fmap_bitmap[i]--;
/* and make it available for unpaging */
if(!avail) {
@@ -173,9 +174,9 @@ static void fmap_aging(fmap_t *m) {
avail++;
} else {
/* Insert sort onto a stack'd array - same performance as quickselect */
- unsigned int insert_to = MIN(maxavail, avail) - 1, age = m->bitmap[i] & FM_MASK_COUNT;
- if(avail <= maxavail || (m->bitmap[freeme[maxavail]] & FM_MASK_COUNT) > age) {
- while((m->bitmap[freeme[insert_to]] & FM_MASK_COUNT) > age) {
+ unsigned int insert_to = MIN(maxavail, avail) - 1, age = fmap_bitmap[i] & FM_MASK_COUNT;
+ if(avail <= maxavail || (fmap_bitmap[freeme[maxavail]] & FM_MASK_COUNT) > age) {
+ while((fmap_bitmap[freeme[insert_to]] & FM_MASK_COUNT) > age) {
freeme[insert_to + 1] = freeme[insert_to];
if(!insert_to--) break;
}
@@ -189,7 +190,7 @@ static void fmap_aging(fmap_t *m) {
for(i=0; i<avail; i++) {
char *pptr = (char *)m + i * m->pgsz + m->hdrsz;
/* we mark the page as seen */
- m->bitmap[freeme[i]] = FM_MASK_SEEN;
+ fmap_bitmap[freeme[i]] = FM_MASK_SEEN;
/* and we mmap the page over so the kernel knows there's nothing good in there */
fmap_lock;
if(mmap(pptr, m->pgsz, PROT_READ | PROT_WRITE, MAP_FIXED|MAP_PRIVATE|ANONYMOUS_MAP, -1, 0) == MAP_FAILED)
@@ -234,7 +235,7 @@ static int fmap_readpage(fmap_t *m, unsigned int first_page, unsigned int count,
/* we count one page too much to flush pending reads */
if(!pptr) return 0; /* if we have any */
force_read = 1;
- } else if((s=m->bitmap[page]) & FM_MASK_PAGED) {
+ } else if((s=fmap_bitmap[page]) & FM_MASK_PAGED) {
/* page already paged */
if(lock) {
/* we want locking */
@@ -246,14 +247,14 @@ static int fmap_readpage(fmap_t *m, unsigned int first_page, unsigned int count,
return 1;
}
/* acceptable lock count: inc lock count */
- m->bitmap[page]++;
+ fmap_bitmap[page]++;
} else /* page not currently locked: set lock count = 1 */
- m->bitmap[page] = 1 | FM_MASK_LOCKED | FM_MASK_PAGED;
+ fmap_bitmap[page] = 1 | FM_MASK_LOCKED | FM_MASK_PAGED;
} else {
/* we don't want locking */
if(!(s & FM_MASK_LOCKED)) {
/* page is not locked: we reset aging to max */
- m->bitmap[page] = FM_MASK_PAGED | FM_MASK_COUNT;
+ fmap_bitmap[page] = FM_MASK_PAGED | FM_MASK_COUNT;
}
}
if(!pptr) continue;
@@ -264,7 +265,7 @@ static int fmap_readpage(fmap_t *m, unsigned int first_page, unsigned int count,
/* we have some pending reads to perform */
unsigned int j;
for(j=first_page; j<page; j++) {
- if(m->bitmap[j] & FM_MASK_SEEN) {
+ if(fmap_bitmap[j] & FM_MASK_SEEN) {
/* page we've seen before: check mtime */
struct stat st;
if(fstat(m->fd, &st)) {
@@ -303,9 +304,9 @@ static int fmap_readpage(fmap_t *m, unsigned int first_page, unsigned int count,
else
readsz += m->pgsz;
if(lock) /* lock requested: set paged, lock page and set lock count to 1 */
- m->bitmap[page] = FM_MASK_PAGED | FM_MASK_LOCKED | 1;
+ fmap_bitmap[page] = FM_MASK_PAGED | FM_MASK_LOCKED | 1;
else /* no locking: set paged and set aging to max */
- m->bitmap[page] = FM_MASK_PAGED | FM_MASK_COUNT;
+ fmap_bitmap[page] = FM_MASK_PAGED | FM_MASK_COUNT;
m->paged++;
}
return 0;
@@ -361,7 +362,7 @@ void *fmap_need_str(fmap_t *m, void *ptr, size_t len_hint) {
}
static void fmap_unneed_page(fmap_t *m, unsigned int page) {
- uint32_t s = m->bitmap[page];
+ uint32_t s = fmap_bitmap[page];
if((s & (FM_MASK_PAGED | FM_MASK_LOCKED)) == (FM_MASK_PAGED | FM_MASK_LOCKED)) {
/* page is paged and locked: check lock count */
@@ -370,9 +371,9 @@ static void fmap_unneed_page(fmap_t *m, unsigned int page) {
m->page_unlocks ++;
#endif
if(s > 1) /* locked more than once: dec lock count */
- m->bitmap[page]--;
+ fmap_bitmap[page]--;
else if (s == 1) /* only one lock left: unlock and begin aging */
- m->bitmap[page] = FM_MASK_COUNT | FM_MASK_PAGED;
+ fmap_bitmap[page] = FM_MASK_COUNT | FM_MASK_PAGED;
else
cli_errmsg("fmap_unneed: inconsistent map state\n");
return;
diff --git a/libclamav/fmap.h b/libclamav/fmap.h
index 9686a79..52df35c 100644
--- a/libclamav/fmap.h
+++ b/libclamav/fmap.h
@@ -42,7 +42,7 @@ typedef struct {
unsigned int page_unlocks;
unsigned int page_unmaps;
#endif
- uint32_t bitmap[]; /* FIXME: do not use flexible arrays */
+ uint32_t placeholder_for_bitmap;
} fmap_t;
fmap_t *fmap(int fd, off_t offset, size_t len);
--
Debian repository for ClamAV
More information about the Pkg-clamav-commits
mailing list