src/os/bsd/vm/semaphore_bsd.cpp

Mon, 12 Aug 2019 18:30:40 +0300

author
apetushkov
date
Mon, 12 Aug 2019 18:30:40 +0300
changeset 9858
b985cbb00e68
permissions
-rw-r--r--

8223147: JFR Backport
8199712: Flight Recorder
8203346: JFR: Inconsistent signature of jfr_add_string_constant
8195817: JFR.stop should require name of recording
8195818: JFR.start should increase autogenerated name by one
8195819: Remove recording=x from jcmd JFR.check output
8203921: JFR thread sampling is missing fixes from JDK-8194552
8203929: Limit amount of data for JFR.dump
8203664: JFR start failure after AppCDS archive created with JFR StartFlightRecording
8003209: JFR events for network utilization
8207392: [PPC64] Implement JFR profiling
8202835: jfr/event/os/TestSystemProcess.java fails on missing events
Summary: Backport JFR from JDK11. Initial integration
Reviewed-by: neugens

apetushkov@9858 1 /*
apetushkov@9858 2 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
apetushkov@9858 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
apetushkov@9858 4 *
apetushkov@9858 5 * This code is free software; you can redistribute it and/or modify it
apetushkov@9858 6 * under the terms of the GNU General Public License version 2 only, as
apetushkov@9858 7 * published by the Free Software Foundation.
apetushkov@9858 8 *
apetushkov@9858 9 * This code is distributed in the hope that it will be useful, but WITHOUT
apetushkov@9858 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
apetushkov@9858 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
apetushkov@9858 12 * version 2 for more details (a copy is included in the LICENSE file that
apetushkov@9858 13 * accompanied this code).
apetushkov@9858 14 *
apetushkov@9858 15 * You should have received a copy of the GNU General Public License version
apetushkov@9858 16 * 2 along with this work; if not, write to the Free Software Foundation,
apetushkov@9858 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
apetushkov@9858 18 *
apetushkov@9858 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
apetushkov@9858 20 * or visit www.oracle.com if you need additional information or have any
apetushkov@9858 21 * questions.
apetushkov@9858 22 *
apetushkov@9858 23 */
apetushkov@9858 24
apetushkov@9858 25 #include "precompiled/precompiled.hpp"
apetushkov@9858 26 #include "semaphore_bsd.hpp"
apetushkov@9858 27 #include "utilities/debug.hpp"
apetushkov@9858 28
apetushkov@9858 29 #include <semaphore.h>
apetushkov@9858 30
apetushkov@9858 31 #ifdef __APPLE__
apetushkov@9858 32 // OS X doesn't support unamed POSIX semaphores, so the implementation in os_posix.cpp can't be used.
apetushkov@9858 33
apetushkov@9858 34 static const char* sem_init_strerror(kern_return_t value) {
apetushkov@9858 35 switch (value) {
apetushkov@9858 36 case KERN_INVALID_ARGUMENT: return "Invalid argument";
apetushkov@9858 37 case KERN_RESOURCE_SHORTAGE: return "Resource shortage";
apetushkov@9858 38 default: return "Unknown";
apetushkov@9858 39 }
apetushkov@9858 40 }
apetushkov@9858 41
apetushkov@9858 42 OSXSemaphore::OSXSemaphore(uint value) {
apetushkov@9858 43 kern_return_t ret = semaphore_create(mach_task_self(), &_semaphore, SYNC_POLICY_FIFO, value);
apetushkov@9858 44
apetushkov@9858 45 guarantee(ret == KERN_SUCCESS, err_msg("Failed to create semaphore: %s", sem_init_strerror(ret)));
apetushkov@9858 46 }
apetushkov@9858 47
apetushkov@9858 48 OSXSemaphore::~OSXSemaphore() {
apetushkov@9858 49 semaphore_destroy(mach_task_self(), _semaphore);
apetushkov@9858 50 }
apetushkov@9858 51
apetushkov@9858 52 void OSXSemaphore::signal(uint count) {
apetushkov@9858 53 for (uint i = 0; i < count; i++) {
apetushkov@9858 54 kern_return_t ret = semaphore_signal(_semaphore);
apetushkov@9858 55
apetushkov@9858 56 assert(ret == KERN_SUCCESS, "Failed to signal semaphore");
apetushkov@9858 57 }
apetushkov@9858 58 }
apetushkov@9858 59
apetushkov@9858 60 void OSXSemaphore::wait() {
apetushkov@9858 61 kern_return_t ret;
apetushkov@9858 62 while ((ret = semaphore_wait(_semaphore)) == KERN_ABORTED) {
apetushkov@9858 63 // Semaphore was interrupted. Retry.
apetushkov@9858 64 }
apetushkov@9858 65 assert(ret == KERN_SUCCESS, "Failed to wait on semaphore");
apetushkov@9858 66 }
apetushkov@9858 67
apetushkov@9858 68 int64_t OSXSemaphore::currenttime() {
apetushkov@9858 69 struct timeval tv;
apetushkov@9858 70 gettimeofday(&tv, NULL);
apetushkov@9858 71 return (tv.tv_sec * NANOSECS_PER_SEC) + (tv.tv_usec * 1000);
apetushkov@9858 72 }
apetushkov@9858 73
apetushkov@9858 74 bool OSXSemaphore::trywait() {
apetushkov@9858 75 return timedwait(0, 0);
apetushkov@9858 76 }
apetushkov@9858 77
apetushkov@9858 78 bool OSXSemaphore::timedwait(unsigned int sec, int nsec) {
apetushkov@9858 79 kern_return_t kr = KERN_ABORTED;
apetushkov@9858 80 mach_timespec_t waitspec;
apetushkov@9858 81 waitspec.tv_sec = sec;
apetushkov@9858 82 waitspec.tv_nsec = nsec;
apetushkov@9858 83
apetushkov@9858 84 int64_t starttime = currenttime();
apetushkov@9858 85
apetushkov@9858 86 kr = semaphore_timedwait(_semaphore, waitspec);
apetushkov@9858 87 while (kr == KERN_ABORTED) {
apetushkov@9858 88 int64_t totalwait = (sec * NANOSECS_PER_SEC) + nsec;
apetushkov@9858 89
apetushkov@9858 90 int64_t current = currenttime();
apetushkov@9858 91 int64_t passedtime = current - starttime;
apetushkov@9858 92
apetushkov@9858 93 if (passedtime >= totalwait) {
apetushkov@9858 94 waitspec.tv_sec = 0;
apetushkov@9858 95 waitspec.tv_nsec = 0;
apetushkov@9858 96 } else {
apetushkov@9858 97 int64_t waittime = totalwait - (current - starttime);
apetushkov@9858 98 waitspec.tv_sec = waittime / NANOSECS_PER_SEC;
apetushkov@9858 99 waitspec.tv_nsec = waittime % NANOSECS_PER_SEC;
apetushkov@9858 100 }
apetushkov@9858 101
apetushkov@9858 102 kr = semaphore_timedwait(_semaphore, waitspec);
apetushkov@9858 103 }
apetushkov@9858 104
apetushkov@9858 105 return kr == KERN_SUCCESS;
apetushkov@9858 106 }
apetushkov@9858 107 #endif // __APPLE__

mercurial