git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v7 4/8] worktree: simplify find_shared_symref() memory ownership model

From
Eric Sunshine <sunshine@sunshineco.com>
Date
Dec 2, 2021, 00:13 UTC
Message-ID
<CAPig+cRX94vMLkW=dAKncPTuuk0Opaj+8-Yqe-qFD1b7mrZ89A@mail.gmail.com>
In-Reply-To
<f8262c3b-2ca5-4920-1379-41ff29b37d9f@mit.edu>
On Wed, Dec 1, 2021 at 6:48 PM Anders Kaseorg <andersk@mit.edu> wrote:
Show 8 quoted lines
> On 12/1/21 15:10, Eric Sunshine wrote:
> > As far as I can see, this code only cares whether find_shared_symref()
> > returned a result; it doesn't actually consult the returned worktree
> > at all, thus it semantically considers `worktree` as a boolean, not as
> > a `struct worktree`.
>
> No, the update_worktree(new_oid->hash, worktree) call uses it in a
> non-boolean way, so we do need to keep it around.

Okay, I missed that call to update_worktree() in the "noise" of all those other changes, but looking at the code a bit more carefully, it seems as if we might still be able to drop all the noise changes anyhow by hoisting ownership of `worktrees` up a level or two. In particular, both execute_commands_atomic() and execute_commands_non_atomic() are calling update() in a loop, and update() is calling get_worktrees() / free_worktrees() each time it is called within those loops, which seems unnecessarily expensive.

If we instead hoist ownership of `worktrees` up to execute_commands() -- which calls execute_commands_atomic() or execute_commands_non_atomic() -- then we can get by with retrieving the worktrees just once, and all those noise changes in update() can be dropped since it will no longer be responsible for allocating or freeing `worktrees`. For instance:

    static void execute_commands(...)
    {
        struct worktree **worktrees;
        ...
        worktrees = get_worktrees();
         if (use_atomic)
            execute_commands_atomic(commands, si, worktrees);
        else
            execute_commands_non_atomic(commands, si, worktrees);
        free_worktrees(worktrees);
        ...
    }

and then execute_commands_atomic() and execute_commands_non_atomic() can pass `worktrees` along to update().

Previous: Anders KaseorgNext: Eric Sunshine
Message 7 of 20 in “protect branches checked out in all worktrees”
  1. 0/8 protect branches checked out in all worktreesAnders Kaseorg, Dec 1, 2021
  2. 1/8 fetch: lowercase error messagesAnders Kaseorg, Dec 1, 2021
  3. 3/8 branch: lowercase error messagesAnders Kaseorg, Dec 1, 2021
  4. 4/8 worktree: simplify find_shared_symref() memory ownership modelAnders Kaseorg, Dec 1, 2021
  5. Eric SunshineDec 1, 2021
  6. Anders KaseorgDec 1, 2021
  7. Eric SunshineDec 2, 2021
  8. Eric SunshineDec 2, 2021
  9. Anders KaseorgDec 2, 2021
  10. Eric SunshineDec 2, 2021
  11. 2/8 receive-pack: lowercase error messagesAnders Kaseorg, Dec 1, 2021
  12. 5/8 fetch: protect branches checked out in all worktreesAnders Kaseorg, Dec 1, 2021
  13. Eric SunshineDec 2, 2021
  14. Anders KaseorgDec 2, 2021
  15. 6/8 receive-pack: clean dead code from update_worktree()Anders Kaseorg, Dec 1, 2021
  16. 7/8 receive-pack: protect current branch for bare repository worktreeAnders Kaseorg, Dec 1, 2021
  17. 8/8 branch: protect branches checked out in all worktreesAnders Kaseorg, Dec 1, 2021
  18. Jiang XinDec 23, 2021
  19. Jiang XinJan 12, 2022
  20. Junio C HamanoJan 12, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.