• J
    config: use a static lock_file struct · f991761e
    Jeff King 提交于
    When modifying git config, we xcalloc() a struct lock_file
    but never free it. This is necessary because the tempfile
    code (upon which the locking code is built) requires that
    the resulting struct remain valid through the life of the
    program. However, it also confuses leak-checkers like
    valgrind because only the inner "struct tempfile" is still
    reachable; no pointer to the outer lock_file is kept.
    
    Other code paths solve this by using a single static lock
    struct. We can do the same here, because we know that we'll
    only lock and modify one config file at a time (and
    assertions within the lockfile code will ensure that this
    remains the case).
    
    That removes a real leak (when we fail to free the struct
    after locking fails) as well as removes the valgrind false
    positive. It also means that doing N sequential
    config-writes will use a constant amount of memory, rather
    than leaving stale lock_files for each.
    
    Note that since "lock" is no longer a pointer, it can't be
    NULL anymore. But that's OK. We used that feature only to
    avoid calling rollback_lock_file() on an already-committed
    lock. Since the lockfile code keeps its own "active" flag,
    it's a noop to rollback an inactive lock, and we don't have
    to worry about this ourselves.
    Signed-off-by: NJeff King <peff@peff.net>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    f991761e
config.c 62.0 KB