struct mail_cache *cache;
struct mail_transaction_log *log;
+ unsigned int open_count;
enum mail_index_open_flags flags;
enum mail_index_sync_type fsync_mask;
mode_t mode;
unsigned int nodiskspace:1;
unsigned int index_lock_timeout:1;
- unsigned int opened:1;
unsigned int index_delete_requested:1; /* next sync sets it deleted */
unsigned int index_deleted:1; /* no changes allowed anymore */
unsigned int log_locked:1;
struct mail_index *index = *_index;
*_index = NULL;
- mail_index_close(index);
+
+ i_assert(index->open_count == 0);
mail_transaction_log_free(&index->log);
hash_table_destroy(&index->keywords_hash);
{
int ret;
- if (index->opened) {
- if (index->map != NULL &&
- (index->map->hdr.flags &
- MAIL_INDEX_HDR_FLAG_CORRUPTED) != 0) {
- /* corrupted, reopen files */
- mail_index_close(index);
- } else {
- i_assert(index->map != NULL);
- return 1;
- }
+ if (index->open_count > 0) {
+ i_assert(index->map != NULL);
+ index->open_count++;
+ return 1;
}
index->filepath = MAIL_INDEX_IS_IN_MEMORY(index) ?
(flags & MAIL_INDEX_OPEN_FLAG_MMAP_DISABLE) == 0)
i_fatal("nfs flush requires mmap_disable=yes");
+ index->open_count++;
if ((ret = mail_index_open_files(index, flags)) <= 0) {
/* doesn't exist and create flag not used */
mail_index_close(index);
}
i_assert(index->map != NULL);
- index->opened = TRUE;
mail_index_alloc_cache_index_opened(index);
return 1;
}
void mail_index_close(struct mail_index *index)
{
+ i_assert(index->open_count > 0);
+ if (--index->open_count > 0)
+ return;
+
if (index->map != NULL)
mail_index_unmap(&index->map);
i_free_and_null(index->filepath);
index->indexid = 0;
- index->opened = FALSE;
}
int mail_index_unlink(struct mail_index *index)