Mercurial > hg > truffle
view src/os/bsd/vm/threadCritical_bsd.cpp @ 14290:d050fbf914d8
8031427: AllocObject and Unsafe.allocateInstance segfault for primitive types
Summary: The fix just throws an InstantiationException if the Klass is NULL.
Reviewed-by: coleenp, twisti, jrose
Contributed-by: gdub <duboscq@ssw.jku.at>
author | gdub |
---|---|
date | Thu, 23 Jan 2014 16:02:14 -0500 |
parents | f34d701e952e |
children |
line wrap: on
line source
/* * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. * */ #include "precompiled.hpp" #include "runtime/thread.inline.hpp" #include "runtime/threadCritical.hpp" // put OS-includes here # include <pthread.h> // // See threadCritical.hpp for details of this class. // static pthread_t tc_owner = 0; static pthread_mutex_t tc_mutex = PTHREAD_MUTEX_INITIALIZER; static int tc_count = 0; void ThreadCritical::initialize() { } void ThreadCritical::release() { } ThreadCritical::ThreadCritical() { pthread_t self = pthread_self(); if (self != tc_owner) { int ret = pthread_mutex_lock(&tc_mutex); guarantee(ret == 0, "fatal error with pthread_mutex_lock()"); assert(tc_count == 0, "Lock acquired with illegal reentry count."); tc_owner = self; } tc_count++; } ThreadCritical::~ThreadCritical() { assert(tc_owner == pthread_self(), "must have correct owner"); assert(tc_count > 0, "must have correct count"); tc_count--; if (tc_count == 0) { tc_owner = 0; int ret = pthread_mutex_unlock(&tc_mutex); guarantee(ret == 0, "fatal error with pthread_mutex_unlock()"); } }