libbb: make history saving/loading concurrent-safe

* all history writers always append (not overwrite) history files
* they reload history if they detect that file length has changed since last
write
* they trim history file only when it grows 4 times longer than MAXLINES
* they do this atomically by creating new file and renaming it to old

Unfortunately, this comes at a price:

function                                             old     new   delta
load_history                                           -     346    +346
read_line_input                                     3155    3358    +203
new_line_input_t                                      17      31     +14
...irrelevant small jitter...
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 5/5 up/down: 573/-13)           Total: 560 bytes
This commit is contained in:
Denis Vlasenko
2009-03-22 19:00:05 +00:00
parent 3fd1046300
commit 57abf9e947
2 changed files with 117 additions and 35 deletions

View File

@ -1187,9 +1187,9 @@ unsigned long long bb_makedev(unsigned int major, unsigned int minor) FAST_FUNC;
#if ENABLE_FEATURE_EDITING
/* It's NOT just ENABLEd or disabled. It's a number: */
#ifdef CONFIG_FEATURE_EDITING_HISTORY
#define MAX_HISTORY (CONFIG_FEATURE_EDITING_HISTORY + 0)
# define MAX_HISTORY (CONFIG_FEATURE_EDITING_HISTORY + 0)
#else
#define MAX_HISTORY 0
# define MAX_HISTORY 0
#endif
typedef struct line_input_t {
int flags;
@ -1197,7 +1197,11 @@ typedef struct line_input_t {
#if MAX_HISTORY
int cnt_history;
int cur_history;
USE_FEATURE_EDITING_SAVEHISTORY(const char *hist_file;)
#if ENABLE_FEATURE_EDITING_SAVEHISTORY
unsigned cnt_history_in_file;
off_t last_history_end;
const char *hist_file;
#endif
char *history[MAX_HISTORY + 1];
#endif
} line_input_t;