]> git.saurik.com Git - apple/cf.git/blame - CFWindowsUtilities.c
CF-1153.18.tar.gz
[apple/cf.git] / CFWindowsUtilities.c
CommitLineData
c2869fe4 1/*
e29e285d 2 * Copyright (c) 2015 Apple Inc. All rights reserved.
c2869fe4
A
3 *
4 * @APPLE_LICENSE_HEADER_START@
d7384798 5 *
c2869fe4
A
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.
d7384798 12 *
c2869fe4
A
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.
d7384798 20 *
c2869fe4
A
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24/*
25 CFWindowsUtilities.c
d7384798 26 Copyright (c) 2008-2014, Apple Inc. All rights reserved.
c2869fe4
A
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
41CF_EXPORT bool OSAtomicCompareAndSwapPtr(void *oldp, void *newp, void *volatile *dst)
42{
43 return oldp == InterlockedCompareExchangePointer(dst, newp, oldp);
44}
45
46CF_EXPORT bool OSAtomicCompareAndSwapLong(long oldl, long newl, long volatile *dst)
47{
48 return oldl == InterlockedCompareExchange(dst, newl, oldl);
49}
50
51CF_EXPORT bool OSAtomicCompareAndSwapPtrBarrier(void *oldp, void *newp, void *volatile *dst)
52{
53 return oldp == InterlockedCompareExchangePointer(dst, newp, oldp);
54}
55
56CF_EXPORT int32_t OSAtomicDecrement32Barrier(volatile int32_t *dst)
57{
58 return InterlockedDecrement((volatile long *)dst);
59}
60
61CF_EXPORT int32_t OSAtomicIncrement32Barrier(volatile int32_t *dst)
62{
63 return InterlockedIncrement((volatile long *)dst);
64}
65
66CF_EXPORT int32_t OSAtomicAdd32Barrier( int32_t theAmount, volatile int32_t *theValue ) {
67 return (InterlockedExchangeAdd((volatile LONG *)theValue, theAmount) + theAmount);
68}
69
70CF_EXPORT bool OSAtomicCompareAndSwap32Barrier(int32_t oldValue, int32_t newValue, volatile int32_t *theValue) {
71 return oldValue == InterlockedCompareExchange((long *)theValue, newValue, oldValue);
72}
73
74CF_EXPORT int32_t OSAtomicAdd32( int32_t theAmount, volatile int32_t *theValue ) {
75 return (InterlockedExchangeAdd((volatile LONG *)theValue, theAmount) + theAmount);
76}
77
78CF_EXPORT int32_t OSAtomicIncrement32(volatile int32_t *theValue) {
79 return InterlockedIncrement((volatile long *)theValue);
80}
81
82CF_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/*
88CF_EXPORT bool OSAtomicCompareAndSwap64( int64_t __oldValue, int64_t __newValue, volatile int64_t *__theValue ) {
89 return __oldValue == InterlockedCompareExchange64((volatile LONGLONG *)__theValue, __newValue, __oldValue);
90}
91
92CF_EXPORT bool OSAtomicCompareAndSwap64Barrier( int64_t __oldValue, int64_t __newValue, volatile int64_t *__theValue ) {
93 return __oldValue == InterlockedCompareExchange64((volatile LONGLONG *)__theValue, __newValue, __oldValue);
94}
95
96CF_EXPORT int64_t OSAtomicAdd64( int64_t __theAmount, volatile int64_t *__theValue ) {
97 return (InterlockedExchangeAdd64((volatile LONGLONG *)__theValue, __theAmount) + __theAmount);
98}
99
100CF_EXPORT int64_t OSAtomicAdd64Barrier( int64_t __theAmount, volatile int64_t *__theValue ) {
101 retun (InterlockedExchangeAdd64((volatile LONGLONG *)__theValue, __theAmount) + __theAmount);
102}
103 */
104
105void OSMemoryBarrier() {
106 MemoryBarrier();
107}
108
109void _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