thread2-r0drv-solaris.c revision 9ce74631b48301919057befb1e781c40cd7ecd73
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/* $Id$ */
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/** @file
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * IPRT - Threads (Part 2), Ring-0 Driver, Solaris.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Copyright (C) 2006-2014 Oracle Corporation
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * available from http://www.virtualbox.org. This file is free software;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * you can redistribute it and/or modify it under the terms of the GNU
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * General Public License (GPL) as published by the Free Software
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * The contents of this file may alternatively be used under the terms
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * of the Common Development and Distribution License Version 1.0
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * VirtualBox OSE distribution, in which case the provisions of the
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * CDDL are applicable instead of those of the GPL.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * You may elect to license modified versions of this file under the
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * terms and conditions of either the GPL or the CDDL or both.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*******************************************************************************
f0ab104f070bc7f569404826fea1828ed985638cvboxsync* Header Files *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync*******************************************************************************/
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include "the-solaris-kernel.h"
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include "internal/iprt.h"
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include <iprt/thread.h>
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include <iprt/process.h>
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include <iprt/assert.h>
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include <iprt/err.h>
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include "internal/thread.h"
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncDECLHIDDEN(int) rtThreadNativeInit(void)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync{
f0ab104f070bc7f569404826fea1828ed985638cvboxsync return VINF_SUCCESS;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync}
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncRTDECL(RTTHREAD) RTThreadSelf(void)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync{
f0ab104f070bc7f569404826fea1828ed985638cvboxsync return rtThreadGetByNative(RTThreadNativeSelf());
f0ab104f070bc7f569404826fea1828ed985638cvboxsync}
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncDECLHIDDEN(int) rtThreadNativeSetPriority(PRTTHREADINT pThread, RTTHREADTYPE enmType)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync{
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int iPriority;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync switch (enmType)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync {
f0ab104f070bc7f569404826fea1828ed985638cvboxsync case RTTHREADTYPE_INFREQUENT_POLLER: iPriority = 60; break;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync case RTTHREADTYPE_EMULATION: iPriority = 66; break;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync case RTTHREADTYPE_DEFAULT: iPriority = 72; break;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync case RTTHREADTYPE_MSG_PUMP: iPriority = 78; break;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync case RTTHREADTYPE_IO: iPriority = 84; break;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync case RTTHREADTYPE_TIMER: iPriority = 99; break;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync default:
f0ab104f070bc7f569404826fea1828ed985638cvboxsync AssertMsgFailed(("enmType=%d\n", enmType));
f0ab104f070bc7f569404826fea1828ed985638cvboxsync return VERR_INVALID_PARAMETER;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync }
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync kthread_t *pCurThread = curthread;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync Assert(pCurThread);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync thread_lock(pCurThread);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync thread_change_pri(pCurThread, iPriority, 0);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync thread_unlock(pCurThread);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync return VINF_SUCCESS;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync}
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncDECLHIDDEN(int) rtThreadNativeAdopt(PRTTHREADINT pThread)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync{
f0ab104f070bc7f569404826fea1828ed985638cvboxsync NOREF(pThread);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync /* There is nothing special that needs doing here, but the
f0ab104f070bc7f569404826fea1828ed985638cvboxsync user really better know what he's cooking. */
f0ab104f070bc7f569404826fea1828ed985638cvboxsync return VINF_SUCCESS;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync}
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncDECLHIDDEN(void) rtThreadNativeWaitKludge(PRTTHREADINT pThread)
{
kthread_t *pThread = (kthread_t *)pThread->Core.Key;
thread_join(pThread);
}
DECLHIDDEN(void) rtThreadNativeDestroy(PRTTHREADINT pThread)
{
NOREF(pThread);
}
/**
* Native thread main function.
*
* @param pvThreadInt The thread structure.
*/
static void rtThreadNativeMain(void *pvThreadInt)
{
PRTTHREADINT pThreadInt = (PRTTHREADINT)pvThreadInt;
rtThreadMain(pThreadInt, RTThreadNativeSelf(), &pThreadInt->szName[0]);
thread_exit();
}
DECLHIDDEN(int) rtThreadNativeCreate(PRTTHREADINT pThreadInt, PRTNATIVETHREAD pNativeThread)
{
RT_ASSERT_PREEMPTIBLE();
kthread_t *pThread = thread_create(NULL, /* Stack, use base */
0, /* Stack size */
rtThreadNativeMain, /* Thread function */
pThreadInt, /* Function data */
0, /* Data size */
(proc_t *)RTR0ProcHandleSelf(), /* Process handle */
TS_RUN, /* Ready to run */
minclsyspri /* Priority */
);
if (RT_LIKELY(pThread))
{
*pNativeThread = (RTNATIVETHREAD)pThread;
return VINF_SUCCESS;
}
return VERR_OUT_OF_RESOURCES;
}