c88974c124adebb911f6001ec81a3e1cc9b8dada
[WebKit-https.git] / Source / WebKit / mac / Misc / WebKitSystemBits.m
1 /*
2  * Copyright (C) 2005 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer. 
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution. 
13  * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission. 
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #import "WebKitSystemBits.h"
30
31 #import "WebNSFileManagerExtras.h"
32 #import <mach/host_info.h>
33 #import <mach/mach.h>
34 #import <mach/mach_error.h>
35 #import <sys/sysctl.h>
36 #import <sys/types.h>
37 #import <wtf/Assertions.h>
38
39 #if !PLATFORM(IOS_SIMULATOR)
40
41 static host_basic_info_data_t gHostBasicInfo;
42 static pthread_once_t initControl = PTHREAD_ONCE_INIT;
43
44 static void initCapabilities(void)
45 {
46     mach_msg_type_number_t  count;
47     kern_return_t r;
48     mach_port_t host;
49
50     /* Discover our CPU type */
51     host = mach_host_self();
52     count = HOST_BASIC_INFO_COUNT;
53     r = host_info(host, HOST_BASIC_INFO, (host_info_t) &gHostBasicInfo, &count);
54     mach_port_deallocate(mach_task_self(), host);
55     if (r != KERN_SUCCESS) {
56         LOG_ERROR("%s : host_info(%d) : %s.\n", __FUNCTION__, r, mach_error_string(r));
57     }
58 }
59
60 #endif
61
62 uint64_t WebMemorySize(void)
63 {
64 #if PLATFORM(IOS_SIMULATOR)
65     // Pretend we have 512MB of memory to make cache sizes behave like on device
66     return 512 * 1024 * 1024;
67 #else
68     pthread_once(&initControl, initCapabilities);
69 #if PLATFORM(IOS)
70     // On iOS, round up the memory size to a power of 2 because max_mem may not be exactly 256MB
71     // (for example) and we have code that depends on those boundaries.
72     return powf(2.0, ceilf(log2f(gHostBasicInfo.max_mem)));
73 #else
74     return gHostBasicInfo.max_mem;
75 #endif
76 #endif
77 }
78
79 int WebNumberOfCPUs(void)
80 {
81     static int numCPUs = 0;
82     
83     if (numCPUs == 0) {
84         int mib[2];
85         size_t len;
86
87         mib[0] = CTL_HW;
88         mib[1] = HW_NCPU;
89         len = sizeof(numCPUs);
90         sysctl(mib, 2, &numCPUs, &len, NULL, 0);
91     }
92     return numCPUs;
93 }
94
95 unsigned long long WebVolumeFreeSize(NSString *path)
96 {
97     NSDictionary *fileSystemAttributesDictionary = [[NSFileManager defaultManager] attributesOfFileSystemForPath:path error:NULL];
98     return [[fileSystemAttributesDictionary objectForKey:NSFileSystemFreeSize] unsignedLongLongValue];
99 }