Author: rinrab
Date: Tue Feb 24 19:00:33 2026
New Revision: 1932028
Log:
Add atomic initializatoin function which doesn't return error and doesn't use
pools svn_atomic__init_once_void().
This is never yet used but is a groundwork to add xdigest checksum backend
which does require initialization. This initilization will be performed in
errorless context (inside of svn_checksum__sha1_ctx_create for example).
* include/private/svn_atomic.h
(svn_atomic__void_init_func_t): New callback declaration.
(svn_atomic__init_once_void): New function.
* libsvn_subr/atomic.c
(init_baton_t): Add void_init_func field.
(void_init_func_wrapper): Add function to wrap initilization in case of
init_once_void.
(svn_atomic__init_once_void): Implement function.
Modified:
subversion/trunk/subversion/include/private/svn_atomic.h
subversion/trunk/subversion/libsvn_subr/atomic.c
Modified: subversion/trunk/subversion/include/private/svn_atomic.h
==============================================================================
--- subversion/trunk/subversion/include/private/svn_atomic.h Tue Feb 24
18:46:32 2026 (r1932027)
+++ subversion/trunk/subversion/include/private/svn_atomic.h Tue Feb 24
19:00:33 2026 (r1932028)
@@ -96,6 +96,12 @@ typedef svn_error_t *(*svn_atomic__err_i
typedef const char *(*svn_atomic__str_init_func_t)(void *baton);
/**
+ * Callback for svn_atomic__init_once_void().
+ * @since New in 1.16
+ */
+typedef void (*svn_atomic__void_init_func_t)(void *baton);
+
+/**
* Call an initialization function in a thread-safe manner.
*
* @a global_status must be a pointer to a global, zero-initialized
@@ -136,6 +142,23 @@ svn_atomic__init_once_no_error(volatile
/**
+ * Call an initialization function in a thread-safe manner.
+ *
+ * Unlike svn_atomic__init_once(), this function does not need pool and doesn't
+ * do any error handling at all.
+ *
+ * @a global_status must be a pointer to a global, zero-initialized
+ * #svn_atomic_t. @a init_func is a pointer to the function that performs the
+ * actual initialization. @a baton is passed on to @a init_func for its use.
+ *
+ * @since New in 1.16.
+ */
+void
+svn_atomic__init_once_void(volatile svn_atomic_t *global_status,
+ svn_atomic__void_init_func_t init_func,
+ void *baton);
+
+/**
* Query and increment the global counter and set @a value to the new
* counter value.
*
Modified: subversion/trunk/subversion/libsvn_subr/atomic.c
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/atomic.c Tue Feb 24 18:46:32
2026 (r1932027)
+++ subversion/trunk/subversion/libsvn_subr/atomic.c Tue Feb 24 19:00:33
2026 (r1932028)
@@ -118,6 +118,9 @@ struct init_baton_t
svn_atomic__str_init_func_t str_init_func;
const char *errstr;
+ /* Used only by svn_atomic__init_once_void() */
+ svn_atomic__void_init_func_t void_init_func;
+
/* Used by both pairs of functions */
void *baton;
};
@@ -178,6 +181,29 @@ svn_atomic__init_once_no_error(volatile
return init_baton.errstr;
}
+/* Wrapper for the svn_atomic__init_once_void() init function. */
+static svn_boolean_t void_init_func_wrapper(init_baton_t *init_baton)
+{
+ init_baton->void_init_func(init_baton->baton);
+ return TRUE;
+}
+
+void
+svn_atomic__init_once_void(volatile svn_atomic_t *global_status,
+ svn_atomic__void_init_func_t init_func,
+ void *baton)
+{
+ svn_boolean_t result;
+ init_baton_t init_baton = { 0 };
+ init_baton.void_init_func = init_func;
+ init_baton.baton = baton;
+
+ result = init_once(global_status, void_init_func_wrapper, &init_baton);
+
+ /* void_init_func_wrapper() always returns success */
+ SVN_ERR_ASSERT_NO_RETURN(result);
+}
+
/* The process-global counter that we use to produce process-wide unique
* values. Since APR has no 64 bit atomics, all access to this will be
* serialized through COUNTER_MUTEX. */