Now that we manage ref_update objects internally, we can use them to
hold some of the scratch space we need when actually carrying out the
updates.  Store the (struct ref_lock *) there.

Signed-off-by: Michael Haggerty <mhag...@alum.mit.edu>
---
 refs.c | 32 ++++++++++++++++----------------
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/refs.c b/refs.c
index ec638e9..73aec88 100644
--- a/refs.c
+++ b/refs.c
@@ -3278,6 +3278,7 @@ struct ref_update {
        unsigned char old_sha1[20];
        int flags; /* REF_NODEREF? */
        int have_old; /* 1 if old_sha1 is valid, 0 otherwise */
+       struct ref_lock *lock;
        const char refname[FLEX_ARRAY];
 };
 
@@ -3402,7 +3403,6 @@ int commit_ref_transaction(struct ref_transaction 
*transaction,
        int ret = 0, delnum = 0, i;
        struct ref_update **updates;
        int *types;
-       struct ref_lock **locks;
        const char **delnames;
        int n = transaction->nr;
 
@@ -3412,7 +3412,6 @@ int commit_ref_transaction(struct ref_transaction 
*transaction,
        /* Allocate work space */
        updates = xmalloc(sizeof(*updates) * n);
        types = xmalloc(sizeof(*types) * n);
-       locks = xcalloc(n, sizeof(*locks));
        delnames = xmalloc(sizeof(*delnames) * n);
 
        /* Copy, sort, and reject duplicate refs */
@@ -3426,12 +3425,12 @@ int commit_ref_transaction(struct ref_transaction 
*transaction,
        for (i = 0; i < n; i++) {
                struct ref_update *update = updates[i];
 
-               locks[i] = update_ref_lock(update->refname,
-                                          (update->have_old ?
-                                           update->old_sha1 : NULL),
-                                          update->flags,
-                                          &types[i], onerr);
-               if (!locks[i]) {
+               update->lock = update_ref_lock(update->refname,
+                                              (update->have_old ?
+                                               update->old_sha1 : NULL),
+                                              update->flags,
+                                              &types[i], onerr);
+               if (!update->lock) {
                        ret = 1;
                        goto cleanup;
                }
@@ -3445,8 +3444,8 @@ int commit_ref_transaction(struct ref_transaction 
*transaction,
                        ret = update_ref_write(msg,
                                               update->refname,
                                               update->new_sha1,
-                                              locks[i], onerr);
-                       locks[i] = NULL; /* freed by update_ref_write */
+                                              update->lock, onerr);
+                       update->lock = NULL; /* freed by update_ref_write */
                        if (ret)
                                goto cleanup;
                }
@@ -3454,9 +3453,11 @@ int commit_ref_transaction(struct ref_transaction 
*transaction,
 
        /* Perform deletes now that updates are safely completed */
        for (i = 0; i < n; i++) {
-               if (locks[i]) {
-                       delnames[delnum++] = locks[i]->ref_name;
-                       ret |= delete_ref_loose(locks[i], types[i]);
+               struct ref_update *update = updates[i];
+
+               if (update->lock) {
+                       delnames[delnum++] = update->lock->ref_name;
+                       ret |= delete_ref_loose(update->lock, types[i]);
                }
        }
 
@@ -3467,11 +3468,10 @@ int commit_ref_transaction(struct ref_transaction 
*transaction,
 
 cleanup:
        for (i = 0; i < n; i++)
-               if (locks[i])
-                       unlock_ref(locks[i]);
+               if (updates[i]->lock)
+                       unlock_ref(updates[i]->lock);
        free(updates);
        free(types);
-       free(locks);
        free(delnames);
        return ret;
 }
-- 
1.9.0

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to