/ CFWindowsUtilities.c
CFWindowsUtilities.c
  1  /*
  2   * Copyright (c) 2015 Apple Inc. All rights reserved.
  3   *
  4   * @APPLE_LICENSE_HEADER_START@
  5   *
  6   * This file contains Original Code and/or Modifications of Original Code
  7   * as defined in and that are subject to the Apple Public Source License
  8   * Version 2.0 (the 'License'). You may not use this file except in
  9   * compliance with the License. Please obtain a copy of the License at
 10   * http://www.opensource.apple.com/apsl/ and read it before using this
 11   * file.
 12   *
 13   * The Original Code and all software distributed under the License are
 14   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 15   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 16   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 17   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 18   * Please see the License for the specific language governing rights and
 19   * limitations under the License.
 20   *
 21   * @APPLE_LICENSE_HEADER_END@
 22   */
 23  
 24  /*	
 25      CFWindowsUtilities.c
 26      Copyright (c) 2008-2014, Apple Inc. All rights reserved.
 27      Responsibility: Tony Parker
 28  */
 29  
 30  #if DEPLOYMENT_TARGET_WINDOWS
 31      
 32  #include <CoreFoundation/CFArray.h>
 33  #include <CoreFoundation/CFString.h>
 34  #include "CFInternal.h"
 35  #include "CFPriv.h"
 36  
 37  #include <shlobj.h>
 38  
 39  #include <sys/stat.h>
 40  
 41  CF_EXPORT bool OSAtomicCompareAndSwapPtr(void *oldp, void *newp, void *volatile *dst) 
 42  { 
 43      return oldp == InterlockedCompareExchangePointer(dst, newp, oldp);
 44  }
 45  
 46  CF_EXPORT bool OSAtomicCompareAndSwapLong(long oldl, long newl, long volatile *dst) 
 47  { 
 48      return oldl == InterlockedCompareExchange(dst, newl, oldl);
 49  }
 50  
 51  CF_EXPORT bool OSAtomicCompareAndSwapPtrBarrier(void *oldp, void *newp, void *volatile *dst) 
 52  { 
 53      return oldp == InterlockedCompareExchangePointer(dst, newp, oldp);
 54  }
 55  
 56  CF_EXPORT int32_t OSAtomicDecrement32Barrier(volatile int32_t *dst)
 57  {
 58      return InterlockedDecrement((volatile long *)dst);
 59  }
 60  
 61  CF_EXPORT int32_t OSAtomicIncrement32Barrier(volatile int32_t *dst)
 62  {
 63      return InterlockedIncrement((volatile long *)dst);
 64  }
 65  
 66  CF_EXPORT int32_t OSAtomicAdd32Barrier( int32_t theAmount, volatile int32_t *theValue ) {
 67      return (InterlockedExchangeAdd((volatile LONG *)theValue, theAmount) + theAmount);
 68  }
 69  
 70  CF_EXPORT bool OSAtomicCompareAndSwap32Barrier(int32_t oldValue, int32_t newValue, volatile int32_t *theValue) {
 71      return oldValue == InterlockedCompareExchange((long *)theValue, newValue, oldValue);
 72  }
 73  
 74  CF_EXPORT int32_t OSAtomicAdd32( int32_t theAmount, volatile int32_t *theValue ) {
 75      return (InterlockedExchangeAdd((volatile LONG *)theValue, theAmount) + theAmount);
 76  }
 77  
 78  CF_EXPORT int32_t OSAtomicIncrement32(volatile int32_t *theValue) {
 79      return InterlockedIncrement((volatile long *)theValue);
 80  }
 81  
 82  CF_EXPORT int32_t OSAtomicDecrement32(volatile int32_t *theValue) {
 83      return InterlockedDecrement((volatile long *)theValue);
 84  }
 85  
 86  // These 64-bit versions of InterlockedCompareExchange are only available on client Vista and later, so we can't use them (yet).
 87  /*
 88  CF_EXPORT bool OSAtomicCompareAndSwap64( int64_t __oldValue, int64_t __newValue, volatile int64_t *__theValue ) {
 89      return __oldValue == InterlockedCompareExchange64((volatile LONGLONG *)__theValue, __newValue, __oldValue);
 90  }
 91  
 92  CF_EXPORT bool OSAtomicCompareAndSwap64Barrier( int64_t __oldValue, int64_t __newValue, volatile int64_t *__theValue ) {
 93      return __oldValue == InterlockedCompareExchange64((volatile LONGLONG *)__theValue, __newValue, __oldValue);
 94  }
 95  
 96  CF_EXPORT int64_t OSAtomicAdd64( int64_t __theAmount, volatile int64_t *__theValue ) {
 97      return (InterlockedExchangeAdd64((volatile LONGLONG *)__theValue, __theAmount) + __theAmount);
 98  }
 99  
100  CF_EXPORT int64_t OSAtomicAdd64Barrier( int64_t __theAmount, volatile int64_t *__theValue ) {
101      retun (InterlockedExchangeAdd64((volatile LONGLONG *)__theValue, __theAmount) + __theAmount);
102  }
103   */
104  
105  void OSMemoryBarrier() {
106      MemoryBarrier();
107  }
108  
109  void _CFGetFrameworkPath(wchar_t *path, int maxLength) {
110  #ifdef _DEBUG
111      // might be nice to get this from the project file at some point
112      wchar_t *DLLFileName = L"CoreFoundation_debug.dll";
113  #else
114      wchar_t *DLLFileName = L"CoreFoundation.dll";
115  #endif
116      path[0] = path[1] = 0;
117      DWORD wResult;
118      CFIndex idx;
119      HMODULE ourModule = GetModuleHandleW(DLLFileName);
120      
121      CFAssert(ourModule, __kCFLogAssertion, "GetModuleHandle failed");
122      
123      wResult = GetModuleFileNameW(ourModule, path, maxLength);
124      CFAssert1(wResult > 0, __kCFLogAssertion, "GetModuleFileName failed: %d", GetLastError());
125      CFAssert1(wResult < maxLength, __kCFLogAssertion, "GetModuleFileName result truncated: %s", path);
126      
127      // strip off last component, the DLL name
128      for (idx = wResult - 1; idx; idx--) {
129          if ('\\' == path[idx]) {
130              path[idx] = '\0';
131              break;
132          }
133      }
134  }
135  
136  
137  #endif
138