os_bsd.inline.hpp revision 9651:f7dc8eebc3f5
1/*
2 * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef OS_BSD_VM_OS_BSD_INLINE_HPP
26#define OS_BSD_VM_OS_BSD_INLINE_HPP
27
28#include "runtime/os.hpp"
29
30// System includes
31
32#include <unistd.h>
33#include <sys/socket.h>
34#include <sys/poll.h>
35#include <netdb.h>
36
37// File names are case-sensitive on windows only
38inline int os::file_name_strcmp(const char* s1, const char* s2) {
39  return strcmp(s1, s2);
40}
41
42inline bool os::obsolete_option(const JavaVMOption *option) {
43  return false;
44}
45
46inline bool os::uses_stack_guard_pages() {
47  return true;
48}
49
50inline bool os::allocate_stack_guard_pages() {
51  assert(uses_stack_guard_pages(), "sanity check");
52#if !defined(__FreeBSD__) || __FreeBSD__ < 5
53  // Since FreeBSD 4 uses malloc() for allocating the thread stack
54  // there is no need to do anything extra to allocate the guard pages
55  return false;
56#else
57  // FreeBSD 5+ uses mmap MAP_STACK for allocating the thread stacks.
58  // Must 'allocate' them or guard pages are ignored.
59  return true;
60#endif
61}
62
63
64// On Bsd, reservations are made on a page by page basis, nothing to do.
65inline void os::pd_split_reserved_memory(char *base, size_t size,
66                                      size_t split, bool realloc) {
67}
68
69
70// Bang the shadow pages if they need to be touched to be mapped.
71inline void os::bang_stack_shadow_pages() {
72}
73
74inline void os::dll_unload(void *lib) {
75  ::dlclose(lib);
76}
77
78inline const int os::default_file_open_flags() { return 0;}
79
80inline DIR* os::opendir(const char* dirname)
81{
82  assert(dirname != NULL, "just checking");
83  return ::opendir(dirname);
84}
85
86inline int os::readdir_buf_size(const char *path)
87{
88  return NAME_MAX + sizeof(dirent) + 1;
89}
90
91inline jlong os::lseek(int fd, jlong offset, int whence) {
92  return (jlong) ::lseek(fd, offset, whence);
93}
94
95inline int os::fsync(int fd) {
96  return ::fsync(fd);
97}
98
99inline char* os::native_path(char *path) {
100  return path;
101}
102
103inline int os::ftruncate(int fd, jlong length) {
104  return ::ftruncate(fd, length);
105}
106
107inline struct dirent* os::readdir(DIR* dirp, dirent *dbuf)
108{
109  dirent* p;
110  int status;
111  assert(dirp != NULL, "just checking");
112
113  // NOTE: Bsd readdir_r (on RH 6.2 and 7.2 at least) is NOT like the POSIX
114  // version. Here is the doc for this function:
115  // http://www.gnu.org/manual/glibc-2.2.3/html_node/libc_262.html
116
117  if((status = ::readdir_r(dirp, dbuf, &p)) != 0) {
118    errno = status;
119    return NULL;
120  } else
121    return p;
122}
123
124inline int os::closedir(DIR *dirp) {
125  assert(dirp != NULL, "argument is NULL");
126  return ::closedir(dirp);
127}
128
129// macros for restartable system calls
130
131#define RESTARTABLE(_cmd, _result) do { \
132    _result = _cmd; \
133  } while(((int)_result == OS_ERR) && (errno == EINTR))
134
135#define RESTARTABLE_RETURN_INT(_cmd) do { \
136  int _result; \
137  RESTARTABLE(_cmd, _result); \
138  return _result; \
139} while(false)
140
141inline bool os::numa_has_static_binding()   { return true; }
142inline bool os::numa_has_group_homing()     { return false;  }
143
144inline size_t os::restartable_read(int fd, void *buf, unsigned int nBytes) {
145  size_t res;
146  RESTARTABLE( (size_t) ::read(fd, buf, (size_t) nBytes), res);
147  return res;
148}
149
150inline size_t os::write(int fd, const void *buf, unsigned int nBytes) {
151  size_t res;
152  RESTARTABLE((size_t) ::write(fd, buf, (size_t) nBytes), res);
153  return res;
154}
155
156inline int os::close(int fd) {
157  return ::close(fd);
158}
159
160inline int os::socket_close(int fd) {
161  return ::close(fd);
162}
163
164inline int os::socket(int domain, int type, int protocol) {
165  return ::socket(domain, type, protocol);
166}
167
168inline int os::recv(int fd, char* buf, size_t nBytes, uint flags) {
169  RESTARTABLE_RETURN_INT(::recv(fd, buf, nBytes, flags));
170}
171
172inline int os::send(int fd, char* buf, size_t nBytes, uint flags) {
173  RESTARTABLE_RETURN_INT(::send(fd, buf, nBytes, flags));
174}
175
176inline int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) {
177  return os::send(fd, buf, nBytes, flags);
178}
179
180inline int os::connect(int fd, struct sockaddr* him, socklen_t len) {
181  RESTARTABLE_RETURN_INT(::connect(fd, him, len));
182}
183
184inline struct hostent* os::get_host_by_name(char* name) {
185  return ::gethostbyname(name);
186}
187
188inline bool os::supports_monotonic_clock() {
189#ifdef __APPLE__
190  return true;
191#else
192  return Bsd::_clock_gettime != NULL;
193#endif
194}
195
196inline void os::exit(int num) {
197  ::exit(num);
198}
199
200#endif // OS_BSD_VM_OS_BSD_INLINE_HPP
201