Commit 30ff41be authored by Pauli's avatar Pauli
Browse files

Add atomic write call

parent 94683b7a
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -131,6 +131,12 @@ int CRYPTO_atomic_read(int *val, int *ret, CRYPTO_RWLOCK *lock)
    return 1;
}

int CRYPTO_atomic_write(int *val, int n, CRYPTO_RWLOCK *lock)
{
    *val = n;
    return 1;
}

int openssl_init_fork_handlers(void)
{
    return 0;
+19 −0
Original line number Diff line number Diff line
@@ -188,6 +188,25 @@ int CRYPTO_atomic_read(int *val, int *ret, CRYPTO_RWLOCK *lock)
    return 1;
}

int CRYPTO_atomic_write(int *val, int n, CRYPTO_RWLOCK *lock)
{
# if defined(__GNUC__) && defined(__ATOMIC_RELEASE)
    if (__atomic_is_lock_free(sizeof(*val), val)) {
        __atomic_store(val, &n, __ATOMIC_RELEASE);
        return 1;
    }
# endif
    if (!CRYPTO_THREAD_write_lock(lock))
        return 0;

    *val = n;

    if (!CRYPTO_THREAD_unlock(lock))
        return 0;

    return 1;
}

# ifdef OPENSSL_SYS_UNIX
static pthread_once_t fork_once_control = PTHREAD_ONCE_INIT;

+6 −0
Original line number Diff line number Diff line
@@ -139,6 +139,12 @@ int CRYPTO_atomic_read(int *val, int *ret, CRYPTO_RWLOCK *lock)
    return 1;
}

int CRYPTO_atomic_write(int *val, int n, CRYPTO_RWLOCK *lock)
{
    InterlockedExchange(val, n);
    return 1;
}

int openssl_init_fork_handlers(void)
{
    return 0;
+7 −1
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@
CRYPTO_THREAD_run_once,
CRYPTO_THREAD_lock_new, CRYPTO_THREAD_read_lock, CRYPTO_THREAD_write_lock,
CRYPTO_THREAD_unlock, CRYPTO_THREAD_lock_free, CRYPTO_atomic_add,
CRYPTO_atomic_read - OpenSSL thread support
CRYPTO_atomic_read, CRYPTO_atomic_write - OpenSSL thread support

=head1 SYNOPSIS

@@ -22,6 +22,7 @@ CRYPTO_atomic_read - OpenSSL thread support

 int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock);
 int CRYPTO_atomic_read(int *val, int *ret, CRYPTO_RWLOCK *lock);
 int CRYPTO_atomic_write(int *val, int n, CRYPTO_RWLOCK *lock);

=head1 DESCRIPTION

@@ -82,6 +83,11 @@ CRYPTO_atomic_read() atomically reads B<val> and returns the result of
the operation in B<ret>. B<lock> will be locked, unless atomic operations
are supported on the specific platform.

=item *

CRYPTO_atomic_write() atomically writes B<n> to B<val>. B<lock> will be
locked, unless atomic operations are supported on the specific platform.

=back

=head1 RETURN VALUES
+1 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ void CRYPTO_THREAD_lock_free(CRYPTO_RWLOCK *lock);

int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock);
int CRYPTO_atomic_read(int *val, int *ret, CRYPTO_RWLOCK *lock);
int CRYPTO_atomic_write(int *val, int n, CRYPTO_RWLOCK *lock);

/*
 * The following can be used to detect memory leaks in the library. If
Loading