Atomic.cpp
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:2k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. /*
  2.  *  OpenKore C++ Standard Library
  3.  *  Copyright (C) 2006  VCL
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Lesser General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2.1 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Lesser General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Lesser General Public
  16.  *  License along with this library; if not, write to the Free Software
  17.  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  18.  *  MA  02110-1301  USA
  19.  */
  20. #include "Atomic.h"
  21. #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
  22. #define GCC_X86_32_OR_64
  23. #elif defined(WIN32) && defined(_M_IX86)
  24. #define WIN32_X86
  25. #endif
  26. #if !defined(GCC_X86_32_OR_64) && !defined(WIN32_X86)
  27. #include "Mutex.h"
  28. static OSL::Mutex lock;
  29. #endif
  30. namespace OSL {
  31. void
  32. Atomic::increment(volatile int &i) throw() {
  33. #if defined(GCC_X86_32_OR_64)
  34. __asm__ __volatile__(
  35. "lock;"
  36. "addl %1,%0"
  37. : "=m" (i)
  38. : "ir" (1), "m" (i));
  39. #elif defined(WIN32_X86)
  40. InterlockedExchangeAdd(i, 1);
  41. #else
  42. lock.lock();
  43. i++;
  44. lock.unlock();
  45. #endif
  46. }
  47. bool
  48. Atomic::decrement(volatile int &i) throw() {
  49. #if defined(GCC_X86_32_OR_64)
  50. int result;
  51. __asm__ __volatile__ (
  52. "lock;"
  53. "xaddl %0,%1"
  54. : "=r" (result), "=m" (i)
  55. : "0" (-1), "m" (i));
  56. return result == 1;
  57. #elif defined(WIN32_X86)
  58. return InterlockedExchangeAdd(i, -1) == 1;
  59. #else
  60. bool result;
  61. lock.lock();
  62. i--;
  63. result = i == 0;
  64. lock.unlock();
  65. return result;
  66. #endif
  67. }
  68. }