From 19eddddcffe9d49fc33d89b0e624ab9eae4e9ee4 Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Tue, 4 Dec 2012 16:00:35 -0800 Subject: [PATCH] Fix for issue where history file would be read immediately on launch --- history.cpp | 31 ++++++++++++++++++++++++++----- history.h | 3 +++ signal.cpp | 2 +- signal.h | 2 +- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/history.cpp b/history.cpp index e4dd529fb..6a557d686 100644 --- a/history.cpp +++ b/history.cpp @@ -1468,14 +1468,35 @@ void history_t::clear(void) bool history_t::is_empty(void) { - bool result = false; scoped_lock locker(lock); - if (new_items.empty()) + + /* If we have new items, we're not empty */ + if (! new_items.empty()) + return false; + + bool empty = false; + if (loaded_old) { - load_old_if_needed(); - result = old_item_offsets.empty(); + /* If we've loaded old items, see if we have any offsets */ + empty = old_item_offsets.empty(); } - return result; + else + { + /* If we have not loaded old items, don't actually load them (which may be expensive); just stat the file and see if it exists and is nonempty */ + const wcstring where = history_filename(name, L""); + struct stat buf = {}; + if (wstat(where, &buf) != 0) + { + /* Access failed, assume missing */ + empty = true; + } + else + { + /* We're empty if the file is empty */ + empty = (buf.st_size == 0); + } + } + return empty; } /* Indicate whether we ought to import the bash history file into fish */ diff --git a/history.h b/history.h index e2d4612c5..296cd399b 100644 --- a/history.h +++ b/history.h @@ -159,6 +159,9 @@ private: /** Loads old if necessary */ bool load_old_if_needed(void); + + /** Memory maps the history file if necessary */ + bool mmap_if_needed(void); /** Deletes duplicates in new_items. */ void compact_new_items(); diff --git a/signal.cpp b/signal.cpp index f713b4e79..8e62f7885 100644 --- a/signal.cpp +++ b/signal.cpp @@ -694,7 +694,7 @@ void signal_unblock() // debug( 0, L"signal block level decreased to %d", block_count ); } -int signal_is_blocked() +bool signal_is_blocked() { return !!block_count; } diff --git a/signal.h b/signal.h index dcd2b6e92..fc3e7e735 100644 --- a/signal.h +++ b/signal.h @@ -55,7 +55,7 @@ void signal_unblock(); /** Returns true if signals are being blocked */ -int signal_is_blocked(); +bool signal_is_blocked(); /** Returns signals with non-default handlers