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. */
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.