Revision: 14618
Author: adrian.chadd
Date: Sun Apr 18 07:02:18 2010
Log: Migrate the filemap code - which is basically standalone! - from src/
to libsqstore/ .
This lets me use it in various UFS storedir support programs!
http://code.google.com/p/lusca-cache/source/detail?r=14618
Added:
/branches/LUSCA_HEAD/libsqstore/filemap.c
/branches/LUSCA_HEAD/libsqstore/filemap.h
Deleted:
/branches/LUSCA_HEAD/src/filemap.c
Modified:
/branches/LUSCA_HEAD/libsqstore/Makefile.am
/branches/LUSCA_HEAD/src/Makefile.am
/branches/LUSCA_HEAD/src/defines.h
/branches/LUSCA_HEAD/src/fs/aufs/store_bitmap_aufs.c
/branches/LUSCA_HEAD/src/fs/aufs/store_dir_aufs.c
/branches/LUSCA_HEAD/src/fs/aufs/store_io_aufs.c
/branches/LUSCA_HEAD/src/fs/aufs/store_log_aufs.c
/branches/LUSCA_HEAD/src/fs/aufs/store_rebuild_aufs.c
/branches/LUSCA_HEAD/src/protos.h
/branches/LUSCA_HEAD/src/structs.h
/branches/LUSCA_HEAD/src/typedefs.h
=======================================
--- /dev/null
+++ /branches/LUSCA_HEAD/libsqstore/filemap.c Sun Apr 18 07:02:18 2010
@@ -0,0 +1,186 @@
+
+/*
+ * $Id$
+ *
+ * DEBUG: section 8 Swap File Bitmap
+ * AUTHOR: Harvest Derived
+ *
+ * SQUID Web Proxy Cache http://www.squid-cache.org/
+ * ----------------------------------------------------------
+ *
+ * Squid is the result of efforts by numerous individuals from
+ * the Internet community; see the CONTRIBUTORS file for full
+ * details. Many organizations have provided support for Squid's
+ * development; see the SPONSORS file for full details. Squid is
+ * Copyrighted (C) 2001 by the Regents of the University of
+ * California; see the COPYRIGHT file for full details. Squid
+ * incorporates software developed and/or copyrighted by other
+ * sources; see the CREDITS file for full details.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+ *
+ */
+
+#include "../include/config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#if HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "../include/util.h"
+
+#include "../libcore/varargs.h"
+#include "../libcore/debug.h"
+#include "../libcore/tools.h"
+
+#include "fileMap.h"
+
+/* Number of bits in a long */
+#if SIZEOF_LONG == 8
+#define LONG_BIT_SHIFT 6
+#define BITS_IN_A_LONG 0x40
+#define LONG_BIT_MASK 0x3F
+#define ALL_ONES (unsigned long) 0xFFFFFFFFFFFFFFFF
+#elif SIZEOF_LONG == 4
+#define LONG_BIT_SHIFT 5
+#define BITS_IN_A_LONG 0x20
+#define LONG_BIT_MASK 0x1F
+#define ALL_ONES (unsigned long) 0xFFFFFFFF
+#else
+#define LONG_BIT_SHIFT 5
+#define BITS_IN_A_LONG 0x20
+#define LONG_BIT_MASK 0x1F
+#define ALL_ONES (unsigned long) 0xFFFFFFFF
+#endif
+
+#define FM_INITIAL_NUMBER (1<<14)
+
+fileMap *
+file_map_create(void)
+{
+ fileMap *fm = xcalloc(1, sizeof(fileMap));
+ fm->max_n_files = FM_INITIAL_NUMBER;
+ fm->nwords = fm->max_n_files >> LONG_BIT_SHIFT;
+ debug(8, 3) ("file_map_create: creating space for %d files\n",
fm->max_n_files);
+ debug(8, 5) ("--> %d words of %d bytes each\n",
+ fm->nwords, (int) sizeof(*fm->file_map));
+ fm->file_map = xcalloc(fm->nwords, sizeof(*fm->file_map));
+ /* XXX account fm->file_map */
+ return fm;
+}
+
+static void
+file_map_grow(fileMap * fm)
+{
+ int old_sz = fm->nwords * sizeof(*fm->file_map);
+ void *old_map = fm->file_map;
+ fm->max_n_files <<= 1;
+ assert(fm->max_n_files <= FILEMAP_MAX_SIZE); /* swap_filen is 25 bits,
signed */
+ fm->nwords = fm->max_n_files >> LONG_BIT_SHIFT;
+ debug(8, 3) ("file_map_grow: creating space for %d files\n",
fm->max_n_files);
+ fm->file_map = xcalloc(fm->nwords, sizeof(*fm->file_map));
+ debug(8, 3) ("copying %d old bytes\n", old_sz);
+ xmemcpy(fm->file_map, old_map, old_sz);
+ xfree(old_map);
+ /* XXX account fm->file_map */
+}
+
+int
+file_map_bit_set(fileMap * fm, int file_number)
+{
+ unsigned long bitmask = (1L << (file_number & LONG_BIT_MASK));
+ while (file_number >= fm->max_n_files)
+ file_map_grow(fm);
+ fm->file_map[file_number >> LONG_BIT_SHIFT] |= bitmask;
+ fm->n_files_in_map++;
+ return file_number;
+}
+
+/*
+ * WARNING: file_map_bit_reset does not perform array bounds
+ * checking! It assumes that 'file_number' is valid, and that the
+ * bit is already set. The caller must verify both of those
+ * conditions by calling file_map_bit_test() first.
+ */
+void
+file_map_bit_reset(fileMap * fm, int file_number)
+{
+ unsigned long bitmask = (1L << (file_number & LONG_BIT_MASK));
+ fm->file_map[file_number >> LONG_BIT_SHIFT] &= ~bitmask;
+ fm->n_files_in_map--;
+}
+
+int
+file_map_bit_test(fileMap * fm, int file_number)
+{
+ unsigned long bitmask = (1L << (file_number & LONG_BIT_MASK));
+ if (file_number >= fm->max_n_files)
+ return 0;
+ /* be sure the return value is an int, not a u_long */
+ return (fm->file_map[file_number >> LONG_BIT_SHIFT] & bitmask ? 1 : 0);
+}
+
+int
+file_map_allocate(fileMap * fm, int suggestion)
+{
+ int word;
+ int bit;
+ int count;
+ if (suggestion >= fm->max_n_files)
+ suggestion = 0;
+ if (!file_map_bit_test(fm, suggestion))
+ return suggestion;
+ word = suggestion >> LONG_BIT_SHIFT;
+ for (count = 0; count < fm->nwords; count++) {
+ if (fm->file_map[word] != ALL_ONES)
+ break;
+ word = (word + 1) % fm->nwords;
+ }
+ for (bit = 0; bit < BITS_IN_A_LONG; bit++) {
+ suggestion = ((unsigned long) word << LONG_BIT_SHIFT) | bit;
+ if (!file_map_bit_test(fm, suggestion)) {
+ return suggestion;
+ }
+ }
+ debug(8, 3) ("growing from file_map_allocate\n");
+ file_map_grow(fm);
+ return file_map_allocate(fm, fm->max_n_files >> 1);
+}
+
+void
+filemapFreeMemory(fileMap * fm)
+{
+ safe_free(fm->file_map);
+ safe_free(fm);
+}
+
+#ifdef TEST
+
+#define TEST_SIZE 1<<16
+main(argc, argv)
+{
+ int i;
+
+ fm = file_map_create(TEST_SIZE);
+
+ for (i = 0; i < TEST_SIZE; ++i) {
+ file_map_bit_set(i);
+ assert(file_map_bit_test(i));
+ file_map_bit_reset(i);
+ }
+}
+#endif
=======================================
--- /dev/null
+++ /branches/LUSCA_HEAD/libsqstore/filemap.h Sun Apr 18 07:02:18 2010
@@ -0,0 +1,24 @@
+#ifndef __LUSCA_FILEMAP_H__
+#define __LUSCA_FILEMAP_H__
+
+/* swap_filen is 25 bits, signed */
+#define FILEMAP_MAX_SIZE (1<<24)
+#define FILEMAP_MAX (FILEMAP_MAX_SIZE - 65536)
+
+struct _fileMap {
+ int max_n_files;
+ int n_files_in_map;
+ int toggle;
+ int nwords;
+ unsigned long *file_map;
+};
+typedef struct _fileMap fileMap;
+
+extern fileMap *file_map_create(void);
+extern int file_map_allocate(fileMap *, int);
+extern int file_map_bit_set(fileMap *, int);
+extern int file_map_bit_test(fileMap *, int);
+extern void file_map_bit_reset(fileMap *, int);
+extern void filemapFreeMemory(fileMap *);
+
+#endif
=======================================
--- /branches/LUSCA_HEAD/src/filemap.c Mon Jul 31 03:29:45 2006
+++ /dev/null
@@ -1,172 +0,0 @@
-
-/*
- * $Id$
- *
- * DEBUG: section 8 Swap File Bitmap
- * AUTHOR: Harvest Derived
- *
- * SQUID Web Proxy Cache http://www.squid-cache.org/
- * ----------------------------------------------------------
- *
- * Squid is the result of efforts by numerous individuals from
- * the Internet community; see the CONTRIBUTORS file for full
- * details. Many organizations have provided support for Squid's
- * development; see the SPONSORS file for full details. Squid is
- * Copyrighted (C) 2001 by the Regents of the University of
- * California; see the COPYRIGHT file for full details. Squid
- * incorporates software developed and/or copyrighted by other
- * sources; see the CREDITS file for full details.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
- *
- */
-
-#include "squid.h"
-
-/* Number of bits in a long */
-#if SIZEOF_LONG == 8
-#define LONG_BIT_SHIFT 6
-#define BITS_IN_A_LONG 0x40
-#define LONG_BIT_MASK 0x3F
-#define ALL_ONES (unsigned long) 0xFFFFFFFFFFFFFFFF
-#elif SIZEOF_LONG == 4
-#define LONG_BIT_SHIFT 5
-#define BITS_IN_A_LONG 0x20
-#define LONG_BIT_MASK 0x1F
-#define ALL_ONES (unsigned long) 0xFFFFFFFF
-#else
-#define LONG_BIT_SHIFT 5
-#define BITS_IN_A_LONG 0x20
-#define LONG_BIT_MASK 0x1F
-#define ALL_ONES (unsigned long) 0xFFFFFFFF
-#endif
-
-#define FM_INITIAL_NUMBER (1<<14)
-
-fileMap *
-file_map_create(void)
-{
- fileMap *fm = xcalloc(1, sizeof(fileMap));
- fm->max_n_files = FM_INITIAL_NUMBER;
- fm->nwords = fm->max_n_files >> LONG_BIT_SHIFT;
- debug(8, 3) ("file_map_create: creating space for %d files\n",
fm->max_n_files);
- debug(8, 5) ("--> %d words of %d bytes each\n",
- fm->nwords, (int) sizeof(*fm->file_map));
- fm->file_map = xcalloc(fm->nwords, sizeof(*fm->file_map));
- /* XXX account fm->file_map */
- return fm;
-}
-
-static void
-file_map_grow(fileMap * fm)
-{
- int old_sz = fm->nwords * sizeof(*fm->file_map);
- void *old_map = fm->file_map;
- fm->max_n_files <<= 1;
- assert(fm->max_n_files <= FILEMAP_MAX_SIZE); /* swap_filen is 25 bits,
signed */
- fm->nwords = fm->max_n_files >> LONG_BIT_SHIFT;
- debug(8, 3) ("file_map_grow: creating space for %d files\n",
fm->max_n_files);
- fm->file_map = xcalloc(fm->nwords, sizeof(*fm->file_map));
- debug(8, 3) ("copying %d old bytes\n", old_sz);
- xmemcpy(fm->file_map, old_map, old_sz);
- xfree(old_map);
- /* XXX account fm->file_map */
-}
-
-int
-file_map_bit_set(fileMap * fm, int file_number)
-{
- unsigned long bitmask = (1L << (file_number & LONG_BIT_MASK));
- while (file_number >= fm->max_n_files)
- file_map_grow(fm);
- fm->file_map[file_number >> LONG_BIT_SHIFT] |= bitmask;
- fm->n_files_in_map++;
- return file_number;
-}
-
-/*
- * WARNING: file_map_bit_reset does not perform array bounds
- * checking! It assumes that 'file_number' is valid, and that the
- * bit is already set. The caller must verify both of those
- * conditions by calling file_map_bit_test() first.
- */
-void
-file_map_bit_reset(fileMap * fm, int file_number)
-{
- unsigned long bitmask = (1L << (file_number & LONG_BIT_MASK));
- fm->file_map[file_number >> LONG_BIT_SHIFT] &= ~bitmask;
- fm->n_files_in_map--;
-}
-
-int
-file_map_bit_test(fileMap * fm, int file_number)
-{
- unsigned long bitmask = (1L << (file_number & LONG_BIT_MASK));
- if (file_number >= fm->max_n_files)
- return 0;
- /* be sure the return value is an int, not a u_long */
- return (fm->file_map[file_number >> LONG_BIT_SHIFT] & bitmask ? 1 : 0);
-}
-
-int
-file_map_allocate(fileMap * fm, int suggestion)
-{
- int word;
- int bit;
- int count;
- if (suggestion >= fm->max_n_files)
- suggestion = 0;
- if (!file_map_bit_test(fm, suggestion))
- return suggestion;
- word = suggestion >> LONG_BIT_SHIFT;
- for (count = 0; count < fm->nwords; count++) {
- if (fm->file_map[word] != ALL_ONES)
- break;
- word = (word + 1) % fm->nwords;
- }
- for (bit = 0; bit < BITS_IN_A_LONG; bit++) {
- suggestion = ((unsigned long) word << LONG_BIT_SHIFT) | bit;
- if (!file_map_bit_test(fm, suggestion)) {
- return suggestion;
- }
- }
- debug(8, 3) ("growing from file_map_allocate\n");
- file_map_grow(fm);
- return file_map_allocate(fm, fm->max_n_files >> 1);
-}
-
-void
-filemapFreeMemory(fileMap * fm)
-{
- safe_free(fm->file_map);
- safe_free(fm);
-}
-
-#ifdef TEST
-
-#define TEST_SIZE 1<<16
-main(argc, argv)
-{
- int i;
-
- fm = file_map_create(TEST_SIZE);
-
- for (i = 0; i < TEST_SIZE; ++i) {
- file_map_bit_set(i);
- assert(file_map_bit_test(i));
- file_map_bit_reset(i);
- }
-}
-#endif
=======================================
--- /branches/LUSCA_HEAD/libsqstore/Makefile.am Sun Mar 28 00:33:28 2010
+++ /branches/LUSCA_HEAD/libsqstore/Makefile.am Sun Apr 18 07:02:18 2010
@@ -6,7 +6,8 @@
store_log.c \
store_file_ufs.c \
rebuild_entry.c \
- store_meta.c
+ store_meta.c \
+ filemap.c
noinst_LIBRARIES = \
libsqstore.a
=======================================
--- /branches/LUSCA_HEAD/src/Makefile.am Sat Mar 20 18:59:26 2010
+++ /branches/LUSCA_HEAD/src/Makefile.am Sun Apr 18 07:02:18 2010
@@ -132,7 +132,6 @@
errormap.c \
external_acl.c \
fd.c \
- filemap.c \
forward.c \
fqdncache.c \
ftp.c \
=======================================
--- /branches/LUSCA_HEAD/src/defines.h Tue Apr 21 02:25:02 2009
+++ /branches/LUSCA_HEAD/src/defines.h Sun Apr 18 07:02:18 2010
@@ -229,10 +229,6 @@
#define _WIN_SQUID_RUN_MODE_SERVICE 1
#endif
-/* swap_filen is 25 bits, signed */
-#define FILEMAP_MAX_SIZE (1<<24)
-#define FILEMAP_MAX (FILEMAP_MAX_SIZE - 65536)
-
#define LOGFILE_SEQNO(n) ( (n)->sequence_number )
#define storeSwapTLVFree tlv_free
=======================================
--- /branches/LUSCA_HEAD/src/fs/aufs/store_bitmap_aufs.c Sun May 3
16:17:56 2009
+++ /branches/LUSCA_HEAD/src/fs/aufs/store_bitmap_aufs.c Sun Apr 18
07:02:18 2010
@@ -34,6 +34,7 @@
*/
#include "squid.h"
+#include "../../libsqstore/filemap.h"
#include "store_asyncufs.h"
#include "store_rebuild_aufs.h"
=======================================
--- /branches/LUSCA_HEAD/src/fs/aufs/store_dir_aufs.c Tue May 5 03:03:00
2009
+++ /branches/LUSCA_HEAD/src/fs/aufs/store_dir_aufs.c Sun Apr 18 07:02:18
2010
@@ -37,6 +37,7 @@
#include "../../libasyncio/aiops.h"
#include "../../libasyncio/async_io.h"
+#include "../../libsqstore/filemap.h"
#include "store_asyncufs.h"
#include "store_bitmap_aufs.h"
#include "store_rebuild_aufs.h"
=======================================
--- /branches/LUSCA_HEAD/src/fs/aufs/store_io_aufs.c Fri Jul 17 17:05:17
2009
+++ /branches/LUSCA_HEAD/src/fs/aufs/store_io_aufs.c Sun Apr 18 07:02:18
2010
@@ -33,6 +33,7 @@
*/
#include "squid.h"
+#include "../../libsqstore/filemap.h"
#include "../../libasyncio/aiops.h"
#include "../../libasyncio/async_io.h"
#include "store_asyncufs.h"
=======================================
--- /branches/LUSCA_HEAD/src/fs/aufs/store_log_aufs.c Mon Mar 22 19:59:06
2010
+++ /branches/LUSCA_HEAD/src/fs/aufs/store_log_aufs.c Sun Apr 18 07:02:18
2010
@@ -34,6 +34,7 @@
*/
#include "squid.h"
+#include "../../libsqstore/filemap.h"
#include "../../libasyncio/aiops.h"
#include "../../libasyncio/async_io.h"
=======================================
--- /branches/LUSCA_HEAD/src/fs/aufs/store_rebuild_aufs.c Wed Mar 24
02:38:22 2010
+++ /branches/LUSCA_HEAD/src/fs/aufs/store_rebuild_aufs.c Sun Apr 18
07:02:18 2010
@@ -34,6 +34,7 @@
*/
#include "squid.h"
+#include "../../libsqstore/filemap.h"
#include "../../libasyncio/aiops.h"
#include "../../libasyncio/async_io.h"
=======================================
--- /branches/LUSCA_HEAD/src/protos.h Sat Apr 3 06:47:46 2010
+++ /branches/LUSCA_HEAD/src/protos.h Sun Apr 18 07:02:18 2010
@@ -151,14 +151,6 @@
/* event.c */
extern void eventLocalInit(void);
-extern fileMap *file_map_create(void);
-extern int file_map_allocate(fileMap *, int);
-extern int file_map_bit_set(fileMap *, int);
-extern int file_map_bit_test(fileMap *, int);
-extern void file_map_bit_reset(fileMap *, int);
-extern void filemapFreeMemory(fileMap *);
-
-
extern void fqdncache_local_params(void);
extern void fqdncache_init_local(void);
extern void fqdnStats(StoreEntry *);
=======================================
--- /branches/LUSCA_HEAD/src/structs.h Thu Apr 1 23:26:01 2010
+++ /branches/LUSCA_HEAD/src/structs.h Sun Apr 18 07:02:18 2010
@@ -846,14 +846,6 @@
int weak; /* true if it is a weak validator */
};
-struct _fileMap {
- int max_n_files;
- int n_files_in_map;
- int toggle;
- int nwords;
- unsigned long *file_map;
-};
-
/* see Packer.c for description */
struct _Packer {
/* protected, use interface functions instead */
=======================================
--- /branches/LUSCA_HEAD/src/typedefs.h Thu Apr 1 23:26:01 2010
+++ /branches/LUSCA_HEAD/src/typedefs.h Sun Apr 18 07:02:18 2010
@@ -74,7 +74,6 @@
typedef struct _SquidConfig SquidConfig;
typedef struct _SquidConfig2 SquidConfig2;
typedef struct _ETag ETag;
-typedef struct _fileMap fileMap;
typedef struct _HttpStateData HttpStateData;
typedef struct _icpUdpData icpUdpData;
typedef struct _clientHttpRequest clientHttpRequest;
--
You received this message because you are subscribed to the Google Groups
"lusca-commit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/lusca-commit?hl=en.