зеркало из https://github.com/microsoft/git.git
lock_file: move static locks into functions
Placing `struct lock_file`s on the stack used to be a bad idea, because
the temp- and lockfile-machinery would keep a pointer into the struct.
But after 076aa2cbd
(tempfile: auto-allocate tempfiles on heap,
2017-09-05), we can safely have lockfiles on the stack. (This applies
even if a user returns early, leaving a locked lock behind.)
Each of these `struct lock_file`s is used from within a single function.
Move them into the respective functions to make the scope clearer and
drop the staticness.
For good measure, I have inspected these sites and come to believe that
they always release the lock, with the possible exception of bailing out
using `die()` or `exit()` or by returning from a `cmd_foo()`.
As pointed out by Jeff King, it would be bad if someone held on to a
`struct lock_file *` for some reason. After some grepping, I agree with
his findings: no-one appears to be doing that.
After this commit, the remaining occurrences of "static struct
lock_file" are locks that are used from within different functions. That
is, they need to remain static. (Short of more intrusive changes like
passing around pointers to non-static locks.)
Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
b227586831
Коммит
0fa5a2ed8d
|
@ -265,8 +265,6 @@ static int edit_patch(int argc, const char **argv, const char *prefix)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct lock_file lock_file;
|
||||
|
||||
static const char ignore_error[] =
|
||||
N_("The following paths are ignored by one of your .gitignore files:\n");
|
||||
|
||||
|
@ -393,6 +391,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
|
|||
int add_new_files;
|
||||
int require_pathspec;
|
||||
char *seen = NULL;
|
||||
struct lock_file lock_file = LOCK_INIT;
|
||||
|
||||
git_config(add_config, NULL);
|
||||
|
||||
|
|
|
@ -72,7 +72,6 @@ static const char *add_slash(const char *path)
|
|||
return path;
|
||||
}
|
||||
|
||||
static struct lock_file lock_file;
|
||||
#define SUBMODULE_WITH_GITDIR ((const char *)1)
|
||||
|
||||
static void prepare_move_submodule(const char *src, int first,
|
||||
|
@ -131,6 +130,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
|
|||
enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;
|
||||
struct stat st;
|
||||
struct string_list src_for_dst = STRING_LIST_INIT_NODUP;
|
||||
struct lock_file lock_file = LOCK_INIT;
|
||||
|
||||
git_config(git_default_config, NULL);
|
||||
|
||||
|
|
|
@ -107,8 +107,6 @@ static int git_read_tree_config(const char *var, const char *value, void *cb)
|
|||
return git_default_config(var, value, cb);
|
||||
}
|
||||
|
||||
static struct lock_file lock_file;
|
||||
|
||||
int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
|
||||
{
|
||||
int i, stage = 0;
|
||||
|
@ -116,6 +114,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
|
|||
struct tree_desc t[MAX_UNPACK_TREES];
|
||||
struct unpack_trees_options opts;
|
||||
int prefix_set = 0;
|
||||
struct lock_file lock_file = LOCK_INIT;
|
||||
const struct option read_tree_options[] = {
|
||||
{ OPTION_CALLBACK, 0, "index-output", NULL, N_("file"),
|
||||
N_("write resulting index to <file>"),
|
||||
|
|
|
@ -233,8 +233,6 @@ static int check_local_mod(struct object_id *head, int index_only)
|
|||
return errs;
|
||||
}
|
||||
|
||||
static struct lock_file lock_file;
|
||||
|
||||
static int show_only = 0, force = 0, index_only = 0, recursive = 0, quiet = 0;
|
||||
static int ignore_unmatch = 0;
|
||||
|
||||
|
@ -251,6 +249,7 @@ static struct option builtin_rm_options[] = {
|
|||
|
||||
int cmd_rm(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
struct lock_file lock_file = LOCK_INIT;
|
||||
int i;
|
||||
struct pathspec pathspec;
|
||||
char *seen;
|
||||
|
|
3
rerere.c
3
rerere.c
|
@ -703,10 +703,9 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static struct lock_file index_lock;
|
||||
|
||||
static void update_paths(struct string_list *update)
|
||||
{
|
||||
struct lock_file index_lock = LOCK_INIT;
|
||||
int i;
|
||||
|
||||
hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
|
||||
|
|
|
@ -3,10 +3,10 @@
|
|||
#include "tree.h"
|
||||
#include "cache-tree.h"
|
||||
|
||||
static struct lock_file index_lock;
|
||||
|
||||
int cmd_main(int ac, const char **av)
|
||||
{
|
||||
struct lock_file index_lock = LOCK_INIT;
|
||||
|
||||
setup_git_directory();
|
||||
hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
|
||||
if (read_cache() < 0)
|
||||
|
|
Загрузка…
Ссылка в новой задаче