Example #1
0
    void ResourceManager::ProcessRequests()
    {
        ResourceRequestStack toDeleteResources;

        // Proceed resource loading
        while ( ! pendingResources.Empty() )
        {
            ResourceRequest req = pendingResources.Back();
            pendingResources.PopBack();

            if ( req.m_res->GetRefCount() == 0 )
            {
                toDeleteResources.PushBack( req );
            }
            else if ( ! req.m_res->IsLoaded() )
            {
                void * data = 0;
                SizeT size;

                if ( ! ( FileSystem::Load( req.m_path, data, size ) && req.m_res->Load( data ) ) )
                {
                    req.m_res->m_state &= ~Resource::VALID;
                }

                req.m_res->m_state |= Resource::LOADED;
                req.m_res->m_state &= ~Resource::PENDING;

                UnknownAllocator::Deallocate( data );
            }
        }

        pendingResources = toDeleteResources;

        // Delete unreferenced resources
        while ( ! pendingResources.Empty() )
        {
            Resource * res = pendingResources.Back().m_res;
            pendingResources.PopBack();

            if ( res->GetRefCount() == 0 )
            {
                resourceTable.Remove( res->GetId() );
                if ( res->IsLoaded() )
                    res->Unload();
                res->~Resource();
                UnknownAllocator::Deallocate( res );
            }
            else
            {
                res->m_state &= ~Resource::PENDING;
            }
        }

        pendingResources.Reserve( 0 );
    }
Example #2
0
    void ResourceManager::Destroy()
    {
        ProcessRequests();

#if defined( CARBON_DEBUG )
        if ( resourceTable.Count() )
        {
            Array< Resource *, FrameAllocator > unreleased;
            resourceTable.Dump( unreleased );

            Char res_msg[512];

            CARBON_TRACE( "====================================================\n" );
            CARBON_TRACE( "# Some resources are leaking\n\n" );

            Array< Resource * >::Iterator it = unreleased.Begin();
            Array< Resource * >::ConstIterator end = unreleased.End();
            for ( ; it != end; ++it )
            {
                Resource * res = *it;

                StringUtils::FormatString( res_msg, sizeof(res_msg), "# %s | ref count : %d\n", res->GetName(), res->GetRefCount() );
                CARBON_TRACE( res_msg );
            }

            CARBON_TRACE( "\n====================================================\n" );
        }
#endif
        CARBON_ASSERT( resourceTable.Count() == 0 );
    }