/ 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