summaryrefslogtreecommitdiffstats
path: root/pvr-source/services4/srvkm/common/perproc.c
diff options
context:
space:
mode:
Diffstat (limited to 'pvr-source/services4/srvkm/common/perproc.c')
-rwxr-xr-xpvr-source/services4/srvkm/common/perproc.c398
1 files changed, 0 insertions, 398 deletions
diff --git a/pvr-source/services4/srvkm/common/perproc.c b/pvr-source/services4/srvkm/common/perproc.c
deleted file mode 100755
index 3918bb2..0000000
--- a/pvr-source/services4/srvkm/common/perproc.c
+++ /dev/null
@@ -1,398 +0,0 @@
-/*************************************************************************/ /*!
-@Title Per-process storage
-@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
-@Description Manage per-process storage
-@License Dual MIT/GPLv2
-
-The contents of this file are subject to the MIT license as set out below.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-Alternatively, the contents of this file may be used under the terms of
-the GNU General Public License Version 2 ("GPL") in which case the provisions
-of GPL are applicable instead of those above.
-
-If you wish to allow use of your version of this file only under the terms of
-GPL, and not to allow others to use your version of this file under the terms
-of the MIT license, indicate your decision by deleting the provisions above
-and replace them with the notice and other provisions required by GPL as set
-out in the file called "GPL-COPYING" included in this distribution. If you do
-not delete the provisions above, a recipient may use your version of this file
-under the terms of either the MIT license or GPL.
-
-This License is also included in this distribution in the file called
-"MIT-COPYING".
-
-EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
-PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/ /**************************************************************************/
-
-#include "services_headers.h"
-#include "resman.h"
-#include "handle.h"
-#include "perproc.h"
-#include "osperproc.h"
-#if defined(TTRACE)
-#include "ttrace.h"
-#endif
-
-#define HASH_TAB_INIT_SIZE 32
-
-static HASH_TABLE *psHashTab = IMG_NULL;
-
-/*!
-******************************************************************************
-
- @Function FreePerProcData
-
- @Description Free a per-process data area
-
- @Input psPerProc - pointer to per-process data area
-
- @Return Error code, or PVRSRV_OK
-
-******************************************************************************/
-static PVRSRV_ERROR FreePerProcessData(PVRSRV_PER_PROCESS_DATA *psPerProc)
-{
- PVRSRV_ERROR eError;
- IMG_UINTPTR_T uiPerProc;
-
- PVR_ASSERT(psPerProc != IMG_NULL);
-
- if (psPerProc == IMG_NULL)
- {
- PVR_DPF((PVR_DBG_ERROR, "FreePerProcessData: invalid parameter"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- uiPerProc = HASH_Remove(psHashTab, (IMG_UINTPTR_T)psPerProc->ui32PID);
- if (uiPerProc == 0)
- {
- PVR_DPF((PVR_DBG_ERROR, "FreePerProcessData: Couldn't find process in per-process data hash table"));
- /*
- * We must have failed early in the per-process data area
- * creation, before the process ID was set.
- */
- PVR_ASSERT(psPerProc->ui32PID == 0);
- }
- else
- {
- PVR_ASSERT((PVRSRV_PER_PROCESS_DATA *)uiPerProc == psPerProc);
- PVR_ASSERT(((PVRSRV_PER_PROCESS_DATA *)uiPerProc)->ui32PID == psPerProc->ui32PID);
- }
-
- /* Free handle base for this process */
- if (psPerProc->psHandleBase != IMG_NULL)
- {
- eError = PVRSRVFreeHandleBase(psPerProc->psHandleBase);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "FreePerProcessData: Couldn't free handle base for process (%d)", eError));
- return eError;
- }
- }
-
- /* Release handle for per-process data area */
- if (psPerProc->hPerProcData != IMG_NULL)
- {
- eError = PVRSRVReleaseHandle(KERNEL_HANDLE_BASE, psPerProc->hPerProcData, PVRSRV_HANDLE_TYPE_PERPROC_DATA);
-
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "FreePerProcessData: Couldn't release per-process data handle (%d)", eError));
- return eError;
- }
- }
-
- /* Call environment specific per process deinit function */
- eError = OSPerProcessPrivateDataDeInit(psPerProc->hOsPrivateData);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "FreePerProcessData: OSPerProcessPrivateDataDeInit failed (%d)", eError));
- return eError;
- }
-
- eError = OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
- sizeof(*psPerProc),
- psPerProc,
- psPerProc->hBlockAlloc);
- /*not nulling pointer, copy on stack*/
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "FreePerProcessData: Couldn't free per-process data (%d)", eError));
- return eError;
- }
-
- return PVRSRV_OK;
-}
-
-
-/*!
-******************************************************************************
-
- @Function PVRSRVPerProcessData
-
- @Description Return per-process data area
-
- @Input ui32PID - process ID
-
- @Return Pointer to per-process data area, or IMG_NULL on error.
-
-******************************************************************************/
-PVRSRV_PER_PROCESS_DATA *PVRSRVPerProcessData(IMG_UINT32 ui32PID)
-{
- PVRSRV_PER_PROCESS_DATA *psPerProc;
-
- PVR_ASSERT(psHashTab != IMG_NULL);
-
- /* Look for existing per-process data area */
- psPerProc = (PVRSRV_PER_PROCESS_DATA *)HASH_Retrieve(psHashTab, (IMG_UINTPTR_T)ui32PID);
- return psPerProc;
-}
-
-
-/*!
-******************************************************************************
-
- @Function PVRSRVPerProcessDataConnect
-
- @Description Allocate per-process data area, or increment refcount if one
- already exists for this PID.
-
- @Input ui32PID - process ID
- ppsPerProc - Pointer to per-process data area
-
- @Return PVRSRV_ERROR
-
-******************************************************************************/
-PVRSRV_ERROR PVRSRVPerProcessDataConnect(IMG_UINT32 ui32PID, IMG_UINT32 ui32Flags)
-{
- PVRSRV_PER_PROCESS_DATA *psPerProc;
- IMG_HANDLE hBlockAlloc;
- PVRSRV_ERROR eError = PVRSRV_OK;
-
- if (psHashTab == IMG_NULL)
- {
- return PVRSRV_ERROR_INIT_FAILURE;
- }
-
- /* Look for existing per-process data area */
- psPerProc = (PVRSRV_PER_PROCESS_DATA *)HASH_Retrieve(psHashTab, (IMG_UINTPTR_T)ui32PID);
-
- if (psPerProc == IMG_NULL)
- {
- /* Allocate per-process data area */
- eError = OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
- sizeof(*psPerProc),
- (IMG_PVOID *)&psPerProc,
- &hBlockAlloc,
- "Per Process Data");
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "PVRSRVPerProcessDataConnect: Couldn't allocate per-process data (%d)", eError));
- return eError;
- }
- OSMemSet(psPerProc, 0, sizeof(*psPerProc));
- psPerProc->hBlockAlloc = hBlockAlloc;
-
- if (!HASH_Insert(psHashTab, (IMG_UINTPTR_T)ui32PID, (IMG_UINTPTR_T)psPerProc))
- {
- PVR_DPF((PVR_DBG_ERROR, "PVRSRVPerProcessDataConnect: Couldn't insert per-process data into hash table"));
- eError = PVRSRV_ERROR_INSERT_HASH_TABLE_DATA_FAILED;
- goto failure;
- }
-
- psPerProc->ui32PID = ui32PID;
- psPerProc->ui32RefCount = 0;
-
-#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
- if (ui32Flags == SRV_FLAGS_PDUMP_ACTIVE)
- {
- psPerProc->bPDumpActive = IMG_TRUE;
- }
-#else
- PVR_UNREFERENCED_PARAMETER(ui32Flags);
-#endif
-
- /* Call environment specific per process init function */
- eError = OSPerProcessPrivateDataInit(&psPerProc->hOsPrivateData);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "PVRSRVPerProcessDataConnect: OSPerProcessPrivateDataInit failed (%d)", eError));
- goto failure;
- }
-
- /* Allocate a handle for the per-process data area */
- eError = PVRSRVAllocHandle(KERNEL_HANDLE_BASE,
- &psPerProc->hPerProcData,
- psPerProc,
- PVRSRV_HANDLE_TYPE_PERPROC_DATA,
- PVRSRV_HANDLE_ALLOC_FLAG_NONE);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "PVRSRVPerProcessDataConnect: Couldn't allocate handle for per-process data (%d)", eError));
- goto failure;
- }
-
- /* Allocate handle base for this process */
- eError = PVRSRVAllocHandleBase(&psPerProc->psHandleBase);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "PVRSRVPerProcessDataConnect: Couldn't allocate handle base for process (%d)", eError));
- goto failure;
- }
-
- /* Set per-process handle options */
- eError = OSPerProcessSetHandleOptions(psPerProc->psHandleBase);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "PVRSRVPerProcessDataConnect: Couldn't set handle options (%d)", eError));
- goto failure;
- }
-
- /* Create a resource manager context for the process */
- eError = PVRSRVResManConnect(psPerProc, &psPerProc->hResManContext);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "PVRSRVPerProcessDataConnect: Couldn't register with the resource manager"));
- goto failure;
- }
-#if defined (TTRACE)
- PVRSRVTimeTraceBufferCreate(ui32PID);
-#endif
- }
-
- psPerProc->ui32RefCount++;
- PVR_DPF((PVR_DBG_MESSAGE,
- "PVRSRVPerProcessDataConnect: Process 0x%x has ref-count %d",
- ui32PID, psPerProc->ui32RefCount));
-
- return eError;
-
-failure:
- (IMG_VOID)FreePerProcessData(psPerProc);
- return eError;
-}
-
-
-/*!
-******************************************************************************
-
- @Function PVRSRVPerProcessDataDisconnect
-
- @Description Decrement refcount for per-process data area,
- and free the resources if necessary.
-
- @Input ui32PID - process ID
-
- @Return IMG_VOID
-
-******************************************************************************/
-IMG_VOID PVRSRVPerProcessDataDisconnect(IMG_UINT32 ui32PID)
-{
- PVRSRV_ERROR eError;
- PVRSRV_PER_PROCESS_DATA *psPerProc;
-
- PVR_ASSERT(psHashTab != IMG_NULL);
-
- psPerProc = (PVRSRV_PER_PROCESS_DATA *)HASH_Retrieve(psHashTab, (IMG_UINTPTR_T)ui32PID);
- if (psPerProc == IMG_NULL)
- {
- PVR_DPF((PVR_DBG_ERROR, "PVRSRVPerProcessDataDealloc: Couldn't locate per-process data for PID %u", ui32PID));
- }
- else
- {
- psPerProc->ui32RefCount--;
- if (psPerProc->ui32RefCount == 0)
- {
- PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVPerProcessDataDisconnect: "
- "Last close from process 0x%x received", ui32PID));
-
- /* Close the Resource Manager connection */
- PVRSRVResManDisconnect(psPerProc->hResManContext, IMG_FALSE);
-
-#if defined (TTRACE)
- PVRSRVTimeTraceBufferDestroy(ui32PID);
-#endif
-
- /* Free the per-process data */
- eError = FreePerProcessData(psPerProc);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "PVRSRVPerProcessDataDisconnect: Error freeing per-process data"));
- }
- }
- }
-
- eError = PVRSRVPurgeHandles(KERNEL_HANDLE_BASE);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "PVRSRVPerProcessDataDisconnect: Purge of global handle pool failed (%d)", eError));
- }
-}
-
-
-/*!
-******************************************************************************
-
- @Function PVRSRVPerProcessDataInit
-
- @Description Initialise per-process data management
-
- @Return Error code, or PVRSRV_OK
-
-******************************************************************************/
-PVRSRV_ERROR PVRSRVPerProcessDataInit(IMG_VOID)
-{
- PVR_ASSERT(psHashTab == IMG_NULL);
-
- /* Create hash table */
- psHashTab = HASH_Create(HASH_TAB_INIT_SIZE);
- if (psHashTab == IMG_NULL)
- {
- PVR_DPF((PVR_DBG_ERROR, "PVRSRVPerProcessDataInit: Couldn't create per-process data hash table"));
- return PVRSRV_ERROR_UNABLE_TO_CREATE_HASH_TABLE;
- }
-
- return PVRSRV_OK;
-}
-
-/*!
-******************************************************************************
-
- @Function PVRSRVPerProcessDataDeInit
-
- @Description De-initialise per-process data management
-
- @Return Error code, or PVRSRV_OK
-
-******************************************************************************/
-PVRSRV_ERROR PVRSRVPerProcessDataDeInit(IMG_VOID)
-{
- /* Destroy per-process data area hash table */
- if (psHashTab != IMG_NULL)
- {
- /* Free the hash table */
- HASH_Delete(psHashTab);
- psHashTab = IMG_NULL;
- }
-
- return PVRSRV_OK;
-}
-
-/******************************************************************************
- End of file (perproc.c)
-******************************************************************************/