source: nrEngine/src/ResourceHolder.cpp @ 1

Revision 1, 3.6 KB checked in by art, 13 years ago (diff)
Line 
1/***************************************************************************
2 *                                                                         *
3 *   (c) Art Tevs, MPI Informatik Saarbruecken                             *
4 *       mailto: <tevs@mpi-sb.mpg.de>                                      *
5 *                                                                         *
6 *   This program is free software; you can redistribute it and/or modify  *
7 *   it under the terms of the GNU General Public License as published by  *
8 *   the Free Software Foundation; either version 2 of the License, or     *
9 *   (at your option) any later version.                                   *
10 *                                                                         *
11 ***************************************************************************/
12
13
14//----------------------------------------------------------------------------------
15// Includes
16//----------------------------------------------------------------------------------
17#include "ResourceHolder.h"
18#include "Exception.h"
19#include "ResourceSystem.h"
20#include "Log.h"
21
22namespace nrEngine{
23       
24        //----------------------------------------------------------------------------------
25        ResourceHolder::~ResourceHolder(){
26                mResource = NULL;
27        }
28               
29        //----------------------------------------------------------------------------------
30        ResourceHolder::ResourceHolder(IResource* res, IResource* empty):
31                        mResource(res), mEmptyResource(empty), countAccess(0)
32        {
33                NR_ASSERT(res != NULL && empty != NULL);
34                       
35                // empty the lock stack
36                for (int32 i=0; i < NR_RESOURCE_LOCK_STACK; i++)
37                        mLockStack[i] = false;
38                       
39                mLockStackTop = 0;
40       
41        }
42               
43        //----------------------------------------------------------------------------------
44        bool ResourceHolder::lockPure(){
45
46                // check whenever we've got the maximum, so do not lock
47                if (mLockStackTop >= NR_RESOURCE_LOCK_STACK){
48                        if (mResource){
49                                NR_Log(Log::LOG_ENGINE, Log::LL_DEBUG, 
50                                        "Can not lock %s anymore. Lock state stack is full!", mResource->getResName().c_str()); 
51                        }else{
52                                NR_Log(Log::LOG_ENGINE, Log::LL_DEBUG, 
53                                        "Can not lock anymore. Lock state stack is full!");
54                        }
55                       
56                        return false;
57                }else{         
58                        // lock it
59                        mLockStack[mLockStackTop++] = true;
60                }
61               
62                return true;
63        }       
64               
65        //----------------------------------------------------------------------------------
66        void ResourceHolder::unlockPure(){
67       
68                // check whenever we've got right top position
69                if (mLockStackTop > 0){
70                        // unlock it
71                        mLockStack[--mLockStackTop] = false;
72                }
73        }
74               
75        //----------------------------------------------------------------------------------
76        void ResourceHolder::resetRes(IResource* res){
77                mResource = (res);
78        }
79       
80       
81        //----------------------------------------------------------------------------------
82        void ResourceHolder::setEmptyResource(IResource* res){
83                mEmptyResource = (res);
84        }
85       
86        //----------------------------------------------------------------------------------
87        /*void ResourceHolder::setEmptyResource(SharedPtr<IResource> res){
88                mEmptyResource = res;
89        }*/
90
91       
92        //----------------------------------------------------------------------------------
93        IResource* ResourceHolder::getEmpty(){
94                return mEmptyResource;
95        }
96       
97               
98        //----------------------------------------------------------------------------------
99        IResource* ResourceHolder::getResource(){
100               
101                // touch the resource
102                touchResource();
103
104                // get resource only if it is exists and loaded or if it exists and locked
105                if (mResource!=NULL){
106                        if (mResource->isResLoaded() || isLocked()){
107                                return mResource;
108                        }
109                }
110
111                NR_ASSERT(getEmpty() != NULL && "Empty resource must be defined");
112
113                return getEmpty();
114        }
115
116};
117
Note: See TracBrowser for help on using the repository browser.