[dovecot-cvs] dovecot/src/lib-storage/index index-storage.c,1.33,1.34 index-storage.h,1.38,1.39

cras at procontrol.fi cras at procontrol.fi
Mon Jul 7 02:55:24 EEST 2003


Update of /home/cvs/dovecot/src/lib-storage/index
In directory danu:/tmp/cvs-serv16212/lib-storage/index

Modified Files:
	index-storage.c index-storage.h 
Log Message:
Destroy all unused indexes 10 seconds after use. Before we destroyed them
only when opening a new index.



Index: index-storage.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-storage.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -d -r1.33 -r1.34
--- index-storage.c	15 Jun 2003 02:20:12 -0000	1.33
+++ index-storage.c	6 Jul 2003 22:55:22 -0000	1.34
@@ -29,6 +29,21 @@
 };
 
 static struct index_list *indexes = NULL;
+static struct timeout *to_index = NULL;
+static int index_storage_refcount = 0;
+
+void index_storage_init(struct mail_storage *storage __attr_unused__)
+{
+	index_storage_refcount++;
+}
+
+void index_storage_deinit(struct mail_storage *storage __attr_unused__)
+{
+	if (--index_storage_refcount > 0)
+		return;
+
+        index_storage_destroy_unrefed();
+}
 
 void index_storage_add(struct mail_index *index)
 {
@@ -83,30 +98,15 @@
 	return match;
 }
 
-void index_storage_unref(struct mail_index *index)
-{
-	struct index_list *list;
-
-	for (list = indexes; list != NULL; list = list->next) {
-		if (list->index == index) {
-			i_assert(list->refcount > 0);
-			list->refcount--;
-			list->destroy_time = ioloop_time + INDEX_CACHE_TIMEOUT;
-			return;
-		}
-	}
-
-	i_unreached();
-}
-
-void index_storage_destroy_unrefed(void)
+static void destroy_unrefed(int all)
 {
 	struct index_list **list, *rec;
 
 	for (list = &indexes; *list != NULL;) {
 		rec = *list;
 
-		if (rec->refcount == 0) {
+		if (rec->refcount == 0 &&
+		    (all || rec->destroy_time <= ioloop_time)) {
 			rec->index->free(rec->index);
 			*list = rec->next;
 			i_free(rec);
@@ -114,6 +114,39 @@
 			list = &(*list)->next;
 		}
 	}
+
+	if (indexes == NULL && to_index != NULL) {
+		timeout_remove(to_index);
+		to_index = NULL;
+	}
+}
+
+static void index_removal_timeout(void *context __attr_unused__)
+{
+	destroy_unrefed(FALSE);
+}
+
+void index_storage_unref(struct mail_index *index)
+{
+	struct index_list *list;
+
+	for (list = indexes; list != NULL; list = list->next) {
+		if (list->index == index)
+			break;
+	}
+
+	i_assert(list != NULL);
+	i_assert(list->refcount > 0);
+
+	list->refcount--;
+	list->destroy_time = ioloop_time + INDEX_CACHE_TIMEOUT;
+	if (to_index == NULL)
+		to_index = timeout_add(1000, index_removal_timeout, NULL);
+}
+
+void index_storage_destroy_unrefed(void)
+{
+	destroy_unrefed(TRUE);
 }
 
 static enum mail_data_field get_data_fields(const char *fields)
@@ -264,9 +297,9 @@
 }
 
 struct index_mailbox *
-index_storage_init(struct mail_storage *storage, struct mailbox *box,
-		   struct mail_index *index, const char *name,
-		   int readonly, int fast)
+index_storage_mailbox_init(struct mail_storage *storage, struct mailbox *box,
+			   struct mail_index *index, const char *name,
+			   int readonly, int fast)
 {
 	struct index_mailbox *ibox;
 	enum mail_index_open_flags flags;
@@ -327,11 +360,11 @@
 	} while (0);
 
 	mail_storage_set_index_error(ibox);
-	index_storage_close(&ibox->box);
+	index_storage_mailbox_free(&ibox->box);
 	return NULL;
 }
 
-int index_storage_close(struct mailbox *box)
+int index_storage_mailbox_free(struct mailbox *box)
 {
 	struct index_mailbox *ibox = (struct index_mailbox *) box;
 

Index: index-storage.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-storage.h,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- index-storage.h	15 Jun 2003 03:42:29 -0000	1.38
+++ index-storage.h	6 Jul 2003 22:55:22 -0000	1.39
@@ -46,11 +46,14 @@
 void index_storage_unref(struct mail_index *index);
 void index_storage_destroy_unrefed(void);
 
+void index_storage_init(struct mail_storage *storage);
+void index_storage_deinit(struct mail_storage *storage);
+
 struct index_mailbox *
-index_storage_init(struct mail_storage *storage, struct mailbox *box,
-		   struct mail_index *index, const char *name,
-		   int readonly, int fast);
-int index_storage_close(struct mailbox *box);
+index_storage_mailbox_init(struct mail_storage *storage, struct mailbox *box,
+			   struct mail_index *index, const char *name,
+			   int readonly, int fast);
+int index_storage_mailbox_free(struct mailbox *box);
 
 int index_storage_sync_and_lock(struct index_mailbox *ibox,
 				int sync_size, int minimal_sync,



More information about the dovecot-cvs mailing list