1 : /* cairo - a vector graphics library with display and print output
2 : *
3 : * Copyright © 2007 Chris Wilson
4 : *
5 : * This library is free software; you can redistribute it and/or
6 : * modify it either under the terms of the GNU Lesser General Public
7 : * License version 2.1 as published by the Free Software Foundation
8 : * (the "LGPL") or, at your option, under the terms of the Mozilla
9 : * Public License Version 1.1 (the "MPL"). If you do not alter this
10 : * notice, a recipient may use your version of this file under either
11 : * the MPL or the LGPL.
12 : *
13 : * You should have received a copy of the LGPL along with this library
14 : * in the file COPYING-LGPL-2.1; if not, write to the Free Software
15 : * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA
16 : * You should have received a copy of the MPL along with this library
17 : * in the file COPYING-MPL-1.1
18 : *
19 : * The contents of this file are subject to the Mozilla Public License
20 : * Version 1.1 (the "License"); you may not use this file except in
21 : * compliance with the License. You may obtain a copy of the License at
22 : * http://www.mozilla.org/MPL/
23 : *
24 : * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
25 : * OF ANY KIND, either express or implied. See the LGPL or the MPL for
26 : * the specific language governing rights and limitations.
27 : *
28 : * The Original Code is the cairo graphics library.
29 : *
30 : * Contributor(s):
31 : * Chris Wilson <chris@chris-wilson.co.uk>
32 : */
33 :
34 : #include "cairoint.h"
35 :
36 : #include "cairo-atomic-private.h"
37 : #include "cairo-mutex-private.h"
38 :
39 : #ifdef HAS_ATOMIC_OPS
40 : COMPILE_TIME_ASSERT(sizeof(void*) == sizeof(int) ||
41 : sizeof(void*) == sizeof(long) ||
42 : sizeof(void*) == sizeof(long long));
43 : #else
44 : void
45 300 : _cairo_atomic_int_inc (cairo_atomic_intptr_t *x)
46 : {
47 : CAIRO_MUTEX_LOCK (_cairo_atomic_mutex);
48 300 : *x += 1;
49 : CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex);
50 300 : }
51 :
52 : cairo_bool_t
53 476 : _cairo_atomic_int_dec_and_test (cairo_atomic_intptr_t *x)
54 : {
55 : cairo_bool_t ret;
56 :
57 : CAIRO_MUTEX_LOCK (_cairo_atomic_mutex);
58 476 : ret = --*x == 0;
59 : CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex);
60 :
61 476 : return ret;
62 : }
63 :
64 : cairo_atomic_intptr_t
65 0 : _cairo_atomic_int_cmpxchg_return_old_impl (cairo_atomic_intptr_t *x, cairo_atomic_intptr_t oldv, cairo_atomic_intptr_t newv)
66 : {
67 : cairo_atomic_intptr_t ret;
68 :
69 : CAIRO_MUTEX_LOCK (_cairo_atomic_mutex);
70 0 : ret = *x;
71 0 : if (ret == oldv)
72 0 : *x = newv;
73 : CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex);
74 :
75 0 : return ret;
76 : }
77 :
78 : void *
79 0 : _cairo_atomic_ptr_cmpxchg_return_old_impl (void **x, void *oldv, void *newv)
80 : {
81 : void *ret;
82 :
83 : CAIRO_MUTEX_LOCK (_cairo_atomic_mutex);
84 0 : ret = *x;
85 0 : if (ret == oldv)
86 0 : *x = newv;
87 : CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex);
88 :
89 0 : return ret;
90 : }
91 :
92 : #ifdef ATOMIC_OP_NEEDS_MEMORY_BARRIER
93 : cairo_atomic_intptr_t
94 : _cairo_atomic_int_get (cairo_atomic_intptr_t *x)
95 : {
96 : cairo_atomic_intptr_t ret;
97 :
98 : CAIRO_MUTEX_LOCK (_cairo_atomic_mutex);
99 : ret = *x;
100 : CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex);
101 :
102 : return ret;
103 : }
104 : #endif
105 :
106 : #endif
|