| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- /*************************************************************************
- * *
- * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. *
- * All rights reserved. Email: [email protected] Web: www.q12.org *
- * *
- * This library is free software; you can redistribute it and/or *
- * modify it under the terms of EITHER: *
- * (1) The GNU Lesser General Public License as published by the Free *
- * Software Foundation; either version 2.1 of the License, or (at *
- * your option) any later version. The text of the GNU Lesser *
- * General Public License is included with this library in the *
- * file LICENSE.TXT. *
- * (2) The BSD-style license that is included with this library in *
- * the file LICENSE-BSD.TXT. *
- * *
- * This library 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 files *
- * LICENSE.TXT and LICENSE-BSD.TXT for more details. *
- * *
- *************************************************************************/
- /*
- * Resource accounting/preallocation class implementations
- * Copyright (c) 2017-2020 Oleh Derevenko, [email protected] (change all "a" to "e")
- */
- #include <ode/common.h>
- #include <ode/cooperative.h>
- #include "config.h"
- #include "resource_control.h"
- #include "simple_cooperative.h"
- //////////////////////////////////////////////////////////////////////////
- // dxResourceRequirementDescriptor();
- dxResourceRequirementDescriptor::~dxResourceRequirementDescriptor()
- {
- // Do nothing
- }
- //////////////////////////////////////////////////////////////////////////
- // dxRequiredResourceContainer
- dxRequiredResourceContainer::~dxRequiredResourceContainer()
- {
- freeResources();
- }
- bool dxRequiredResourceContainer::allocateResources(const dxResourceRequirementDescriptor &requirementDescriptor)
- {
- bool result = false;
-
- bool bufferAllocated = false;
- do
- {
- sizeint memorySizeRequirement = requirementDescriptor.getMemorySizeRequirement();
-
- if (memorySizeRequirement != 0)
- {
- unsigned memoryAlignmentRequirement = requirementDescriptor.getMemoryAlignmentRequirement();
- void *bufferAllocated = m_memoryAllocation.allocAligned(memorySizeRequirement, memoryAlignmentRequirement);
- if (bufferAllocated == NULL)
- {
- break;
- }
- }
- bufferAllocated = true;
- dxThreadingBase *relatedThreading = requirementDescriptor.getrelatedThreading();
- dIASSERT(relatedThreading != NULL);
- unsigned simultaneousCallRequirement = requirementDescriptor.getSimultaneousCallRequirement();
- if (simultaneousCallRequirement != 0)
- {
- if (!relatedThreading->PreallocateResourcesForThreadedCalls(simultaneousCallRequirement))
- {
- break;
- }
- }
- dCallWaitID stockCallWait = NULL;
- if (requirementDescriptor.getIsStockCallWaitRequired())
- {
- stockCallWait = relatedThreading->AllocateOrRetrieveStockCallWaitID();
- if (stockCallWait == NULL)
- {
- break;
- }
- }
- m_relatedThreading = relatedThreading;
- m_stockCallWait = stockCallWait;
-
- result = true;
- }
- while (false);
- if (!result)
- {
- if (bufferAllocated)
- {
- m_memoryAllocation.freeAllocation();
- }
- }
-
- return result;
- }
- void dxRequiredResourceContainer::freeResources()
- {
- if (m_relatedThreading != NULL)
- {
- m_relatedThreading = NULL;
- m_stockCallWait = NULL;
- m_memoryAllocation.freeAllocation();
- }
- else
- {
- dIASSERT(m_stockCallWait == NULL);
- dIASSERT(m_memoryAllocation.getUserAreaPointer() == NULL);
- }
- }
- //////////////////////////////////////////////////////////////////////////
- // Public interface functions
- static inline
- dResourceRequirementsID encodeResourceRequirementsID(dxResourceRequirementDescriptor *requirementsDescriptor)
- {
- return (dResourceRequirementsID)requirementsDescriptor;
- }
- /*extern ODE_API */
- dResourceRequirementsID dResourceRequirementsCreate(dCooperativeID cooperative)
- {
- dAASSERT(cooperative != NULL);
- dxSimpleCooperative *cooperativeInstance = decodeCooperativeID(cooperative);
- dxThreadingBase *threading = cooperativeInstance->getRelatedThreading();
- dxResourceRequirementDescriptor *requirementsDescriptor = new dxResourceRequirementDescriptor(threading);
-
- dResourceRequirementsID result = encodeResourceRequirementsID(requirementsDescriptor);
- return result;
- }
- /*extern ODE_API */
- void dResourceRequirementsDestroy(dResourceRequirementsID requirements)
- {
- dxResourceRequirementDescriptor *requirementsDescriptor = decodeResourceRequirementsID(requirements);
- if (requirementsDescriptor != NULL)
- {
- delete requirementsDescriptor;
- }
- }
- /*extern ODE_API */
- dResourceRequirementsID dResourceRequirementsClone(/*const */dResourceRequirementsID requirements)
- {
- dAASSERT(requirements != NULL);
- dxResourceRequirementDescriptor *requirementsDescriptor = decodeResourceRequirementsID(requirements);
- dxResourceRequirementDescriptor *descriptorClone = new dxResourceRequirementDescriptor(*requirementsDescriptor);
- dResourceRequirementsID result = encodeResourceRequirementsID(descriptorClone);
- return result;
- }
- /*extern ODE_API */
- void dResourceRequirementsMergeIn(dResourceRequirementsID summaryRequirements, /*const */dResourceRequirementsID extraRequirements)
- {
- dAASSERT(summaryRequirements != NULL);
- dAASSERT(extraRequirements != NULL);
- dxResourceRequirementDescriptor *summaryDescriptor = decodeResourceRequirementsID(summaryRequirements);
- dxResourceRequirementDescriptor *extraDescriptor = decodeResourceRequirementsID(extraRequirements);
- summaryDescriptor->mergeAnotherDescriptorIn(*extraDescriptor);
- }
- //////////////////////////////////////////////////////////////////////////
- static inline
- dResourceContainerID encodeResourceContainerID(dxRequiredResourceContainer *containerInstance)
- {
- return (dResourceContainerID)containerInstance;
- }
- /*extern ODE_API */
- dResourceContainerID dResourceContainerAcquire(/*const */dResourceRequirementsID requirements)
- {
- dAASSERT(requirements != NULL);
- dResourceContainerID result = NULL;
- bool allocationSucceeded = false;
-
- dxRequiredResourceContainer *containerInstance;
- bool containerAllocated = false;
- dxResourceRequirementDescriptor *requirementsInstance = decodeResourceRequirementsID(requirements);
- do
- {
- containerInstance = new dxRequiredResourceContainer();
- if (containerInstance == NULL)
- {
- break;
- }
- containerAllocated = true;
-
- if (!containerInstance->allocateResources(*requirementsInstance))
- {
- break;
- }
- result = encodeResourceContainerID(containerInstance);
- allocationSucceeded = true;
- }
- while (false);
- if (!allocationSucceeded)
- {
- if (containerAllocated)
- {
- delete containerInstance;
- }
- }
-
- return result;
- }
- /*extern ODE_API */
- void dResourceContainerDestroy(dResourceContainerID resources)
- {
- dxRequiredResourceContainer *containerInstance = decodeResourceContainerID(resources);
- if (containerInstance != NULL)
- {
- delete containerInstance;
- }
- }
|