|
Packit |
549fdc |
/*
|
|
Packit |
549fdc |
* Copyright (C) 2017 Red Hat, Inc.
|
|
Packit |
549fdc |
*
|
|
Packit |
549fdc |
* Author: Nikos Mavrogiannopoulos
|
|
Packit |
549fdc |
*
|
|
Packit |
549fdc |
* This file is part of GnuTLS.
|
|
Packit |
549fdc |
*
|
|
Packit |
549fdc |
* The GnuTLS is free software; you can redistribute it and/or
|
|
Packit |
549fdc |
* modify it under the terms of the GNU Lesser General Public License
|
|
Packit |
549fdc |
* as published by the Free Software Foundation; either version 2.1 of
|
|
Packit |
549fdc |
* the License, or (at your option) any later version.
|
|
Packit |
549fdc |
*
|
|
Packit |
549fdc |
* This library is distributed in the hope that it will be useful, but
|
|
Packit |
549fdc |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
549fdc |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
549fdc |
* Lesser General Public License for more details.
|
|
Packit |
549fdc |
*
|
|
Packit |
549fdc |
* You should have received a copy of the GNU Lesser General Public License
|
|
Packit |
549fdc |
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
Packit |
549fdc |
*
|
|
Packit |
549fdc |
*/
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
#ifndef GNUTLS_ATOMIC_H
|
|
Packit |
549fdc |
#define GNUTLS_ATOMIC_H
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
#ifdef HAVE_STDATOMIC_H
|
|
Packit |
549fdc |
# include <stdatomic.h>
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
# define gnutls_atomic_uint_t atomic_uint
|
|
Packit |
549fdc |
# define DEF_ATOMIC_INT(x) atomic_uint x
|
|
Packit |
549fdc |
# define gnutls_atomic_increment(x) (*x)++
|
|
Packit |
549fdc |
# define gnutls_atomic_decrement(x) (*x)--
|
|
Packit |
549fdc |
# define gnutls_atomic_init(x) (*x)=(0)
|
|
Packit |
549fdc |
# define gnutls_atomic_deinit(x)
|
|
Packit |
549fdc |
# define gnutls_atomic_val(x) (*x)
|
|
Packit |
549fdc |
#else
|
|
Packit |
549fdc |
# include "locks.h"
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
struct gnutls_atomic_uint_st {
|
|
Packit |
549fdc |
void *lock;
|
|
Packit |
549fdc |
unsigned int value;
|
|
Packit |
549fdc |
};
|
|
Packit |
549fdc |
typedef struct gnutls_atomic_uint_st *gnutls_atomic_uint_t;
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
# define DEF_ATOMIC_INT(x) struct gnutls_atomic_uint_st x
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
inline static unsigned gnutls_atomic_val(gnutls_atomic_uint_t x)
|
|
Packit |
549fdc |
{
|
|
Packit |
549fdc |
unsigned int t;
|
|
Packit |
549fdc |
gnutls_mutex_lock(&x->lock);
|
|
Packit |
549fdc |
t = x->value;
|
|
Packit |
549fdc |
gnutls_mutex_unlock(&x->lock);
|
|
Packit |
549fdc |
return t;
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
inline static void gnutls_atomic_increment(gnutls_atomic_uint_t x)
|
|
Packit |
549fdc |
{
|
|
Packit |
549fdc |
gnutls_mutex_lock(&x->lock);
|
|
Packit |
549fdc |
x->value++;
|
|
Packit |
549fdc |
gnutls_mutex_unlock(&x->lock);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
inline static void gnutls_atomic_decrement(gnutls_atomic_uint_t x)
|
|
Packit |
549fdc |
{
|
|
Packit |
549fdc |
gnutls_mutex_lock(&x->lock);
|
|
Packit |
549fdc |
x->value--;
|
|
Packit |
549fdc |
gnutls_mutex_unlock(&x->lock);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
inline static void gnutls_atomic_init(gnutls_atomic_uint_t x)
|
|
Packit |
549fdc |
{
|
|
Packit |
549fdc |
gnutls_mutex_init(&x->lock);
|
|
Packit |
549fdc |
x->value = 0;
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
inline static void gnutls_atomic_deinit(gnutls_atomic_uint_t x)
|
|
Packit |
549fdc |
{
|
|
Packit |
549fdc |
gnutls_mutex_deinit(&x->lock);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
#endif
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
#endif
|