Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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. _cairo_atomic_int_inc (cairo_atomic_intptr_t *x)
  46. {
  47.     CAIRO_MUTEX_LOCK (_cairo_atomic_mutex);
  48.     *x += 1;
  49.     CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex);
  50. }
  51.  
  52. cairo_bool_t
  53. _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.     ret = --*x == 0;
  59.     CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex);
  60.  
  61.     return ret;
  62. }
  63.  
  64. cairo_atomic_intptr_t
  65. _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.     ret = *x;
  71.     if (ret == oldv)
  72.         *x = newv;
  73.     CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex);
  74.  
  75.     return ret;
  76. }
  77.  
  78. void *
  79. _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.     ret = *x;
  85.     if (ret == oldv)
  86.         *x = newv;
  87.     CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex);
  88.  
  89.     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
  107.