summaryrefslogtreecommitdiff
path: root/src/util.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/util.h')
-rw-r--r--src/util.h21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/util.h b/src/util.h
index af3ef0b46..a2233a7e8 100644
--- a/src/util.h
+++ b/src/util.h
@@ -306,11 +306,30 @@ int git__date_parse(git_time_t *out, const char *date);
/*
* Unescapes a string in-place.
- *
+ *
* Edge cases behavior:
* - "jackie\" -> "jacky\"
* - "chan\\" -> "chan\"
*/
extern size_t git__unescape(char *str);
+/*
+ * Swap a pointer with thread safety, returning old value.
+ */
+GIT_INLINE(void *) git__swap(git_mutex *lock, void **ptr_ptr, void *new_ptr)
+{
+ void *old_ptr;
+
+ if (*ptr_ptr == new_ptr)
+ return NULL;
+ if (git_mutex_lock(lock) < 0)
+ return new_ptr;
+
+ old_ptr = *ptr_ptr;
+ *ptr_ptr = new_ptr;
+
+ git_mutex_unlock(lock);
+ return old_ptr;
+}
+
#endif /* INCLUDE_util_h__ */