home *** CD-ROM | disk | FTP | other *** search
- /*
- File: MemCtr.cpp
-
- Contains: Implementation of ODMemContainer class.
-
- Owned by: Paul Hartenstine
-
- Copyright: © 1993 - 1995 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <13> 10/24/95 jpa 1293441: DM/VL: Bento memory reserve &
- fatal container err.
- <12> 10/8/95 TJ Fixes Recomended by Refball
- <11> 8/12/95 TÇ 1276806 Optimization: use kODFalse instead
- of kODTrue in comparisons
- <10> 8/3/95 RR #1257260: Collapse B classes. Remove
- somInit methods. Don't call IsInitialized
- or SubclassResponsibility
- <9> 5/26/95 VL 1251403: Multithreading naming support.
- <8> 3/23/95 VL 1230357: Implemented Purge.
- <7> 11/14/94 VL 1188257: Use Bento errors in BenotDef.h.
- <6> 11/1/94 VL 1194188: Implemented unimplemented
- functions.
- <5> 9/29/94 RA 1189812: Mods for 68K build.
- <4> 9/23/94 VL 1184272: ContainerID is now a sequence of
- octets. 1184166: Implemented GetName and
- SetName. (still commented out).
- <3> 8/5/94 VL 1171603: Use somSelf->GetCMSession instead
- of depending on ODStorageSystem.
- <2> 8/3/94 VL 1153123: Storage to ODStor.
- <1> 6/30/94 CC first checked in
- <2> 4/13/94 VL 1157028: StorageM.h does not include
- CMAPI.h anymore, so GetCMSession returns
- ODULong.
- <1> 3/24/94 VL first checked in
- <10> 2/8/94 VL Use new exception macros.
- <9> 1/12/94 VL Init changes.
- <8> 12/3/93 TÇ Stop including ODError.h, it is included
- as ErrorDef.h inside Except.h
- <7> 11/23/93 VL Made ODMemContainer pool-aware.
- <6> 9/9/93 VL Moved session global code to ODDraft,39.
- <5> 8/9/93 VL Moved error code to ODError.h.
- <4> 8/6/93 VL fContainer should be fCMContainer.
- <3> 8/6/93 PH Specify all types in calls to Bento
- <2> 8/3/93 PH Fix includes
- <1> 8/2/93 PH first checked in
- To Do:
- In Progress:
-
- */
-
- #define ODMemContainer_Class_Source
-
- #define VARIABLE_MACROS
-
- #include <MemCtr.xih>
-
- #ifndef _PLFMDEF_
- #include "PlfmDef.h"
- #endif
-
- #ifndef SOM_ODStorageSystem_xh
- #include <ODStor.xh>
- #endif
-
- #ifndef _MEMHDR_
- #include "MemHdr.h"
- #endif
-
- #ifndef _TARGTHDR_
- #include "TargtHdr.h"
- #endif
-
- #ifndef __CM_API__
- #include "CMAPI.h"
- #endif
-
- #ifndef _EXCEPT_
- #include "Except.h"
- #endif
-
- #ifndef _ODNEW_
- #include <ODNew.h>
- #endif
-
- #ifndef _BENTODEF_
- #include "BentoDef.h"
- #endif
-
- #ifndef _SESSHDR_
- #include "SessHdr.h"
- #endif
-
- #pragma segment ODMemContainer
-
- //==============================================================================
- // ODMemContainer
- //==============================================================================
-
- //------------------------------------------------------------------------------
- // ODMemContainer: ~ODMemContainer
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODMemContainersomUninit(ODMemContainer *somSelf)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","somUninit");
-
- #ifdef DebugRefCount
- printf("~ODMemContainer %x CMContainer %x RefCount %d\n", somSelf, _fCMContainer, _fRefCount);
- fflush(stdout);
- #endif
-
- TRY{
- Environment *ev = somGetGlobalEnvironment ();
-
- if (_fCMContainer != kODNULL)
- somSelf->Close(ev);
-
- if (_fHandlers != kODNULL)
- delete _fHandlers;
-
- if (_fName != kODNULL)
- DisposeIText(_fName);
- }CATCH_ALL{
- // Ignore any errors
- }ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: InitContainer
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODMemContainerInitContainer(ODMemContainer *somSelf, Environment *ev,
- ODStorageSystem* storage, ODContainerID* id)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","InitContainer");
-
- SOM_CATCH return;
-
- /* Moved from somInit. SOM itself sets fields to zero
- _fCMContainer = kODNULL;
- _fHandlers = kODNULL;
- _fName = kODNULL;
- */
-
- ODMemContainer_parent_ODBentoContainer_InitContainer(somSelf, ev, storage, id);
-
- _fHandlers = new(somSelf->GetHeap(ev)) ODMemBentoHandlers(somSelf->GetCMSession(ev),
- *((ODHandle*) id->_buffer));
- _fHandlers->Initialize();
-
- _fName = CreateIText(0);
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: GetName
- //------------------------------------------------------------------------------
-
- SOM_Scope ODContainerName SOMLINK ODMemContainerGetName(ODMemContainer *somSelf, Environment *ev)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","GetName");
-
- return *_fName;
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: SetName
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODMemContainerSetName(ODMemContainer *somSelf, Environment *ev,
- ODContainerName* name)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","SetName");
-
- SOM_CATCH return;
-
- if (_fName != kODNULL) {
- DisposeIText(_fName);
- }
- _fName = CopyIText(name);
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: Create
- //------------------------------------------------------------------------------
-
- SOM_Scope ODContainer* SOMLINK ODMemContainerCreate(ODMemContainer *somSelf, Environment *ev)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","Create");
-
- SOM_CATCH return somSelf;
-
- if (_fCMContainer == kODNULL) {
-
- CMSession cmSession = somSelf->GetCMSession(ev);
-
- CMSetMetaHandler(cmSession,
- (CMGlobalName)CMTargetHandlersTypeName,
- targetContainerMetahandler);
-
- _fCMContainer = CMOpenNewContainer(cmSession,
- _fHandlers,
- (CMGlobalName) kODBentoMemoryTypeName,
- (CMContainerUseMode)(kCMWriting),
- 1, 0);
-
- if (_fCMContainer == kODNULL)
- THROW(kODErrCannotCreateContainer);
- ODSessionRestoreCMAllocReserve(_fCMContainer);
-
- }
- return somSelf;
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: Open
- //------------------------------------------------------------------------------
-
- SOM_Scope ODContainer* SOMLINK ODMemContainerOpen(ODMemContainer *somSelf, Environment *ev)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","Open");
-
- SOM_CATCH return somSelf;
-
- if (_fCMContainer == kODNULL) {
-
- CMSession cmSession = somSelf->GetCMSession(ev);
-
- CMSetMetaHandler(cmSession,
- (CMGlobalName)CMTargetHandlersTypeName,
- targetContainerMetahandler);
-
- _fCMContainer = CMOpenNewContainer(cmSession,
- _fHandlers,
- (CMGlobalName) kODBentoMemoryTypeName,
- (CMContainerUseMode)(kCMUpdateByAppend),
- 1, 0);
-
- if (_fCMContainer == kODNULL)
- THROW(kODErrCannotOpenContainer);
-
- ODSessionRestoreCMAllocReserve(_fCMContainer);
- }
- return somSelf;
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: Close
- //------------------------------------------------------------------------------
-
- SOM_Scope ODContainer* SOMLINK ODMemContainerClose(ODMemContainer *somSelf, Environment *ev)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","Close");
-
- if (_fCMContainer != kODNULL) {
- SOM_TRY
- ODSessionMustHaveCMAllocReserve(_fCMContainer);
- if (somSelf->GetDirtyFlag(ev) != kODFalse)
- CMCloseContainer(_fCMContainer);
- else
- CMAbortContainer(_fCMContainer);
- SOM_CATCH_ALL
- if (ErrorCode() == kODErrBentoErr)
- SetErrorCode(kODErrFatalContainerError);
- SOM_ENDTRY
- _fCMContainer = kODNULL;
- }
-
- return ODMemContainer_parent_ODBentoContainer_Close(somSelf, ev);
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: Purge
- //------------------------------------------------------------------------------
-
- SOM_Scope ODSize SOMLINK ODMemContainerPurge(ODMemContainer *somSelf, Environment *ev,
- ODSize size)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","Purge");
-
- ODSize freed = 0; ODVolatile(freed);
-
- SOM_TRY
- freed = parent_Purge(somSelf, ev, size);
- SOM_CATCH_ALL
- WARN("Error %ld trying to purge in ODMemContainerPurge",ErrorCode());
- SetErrorCode(kODNoError); // Eat the exception; Purge should not
- // propagate it because clients function
- // fine whether memory was purged or not.
- SOM_ENDTRY
-
- return freed;
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: GetCMContainer
- //------------------------------------------------------------------------------
-
- SOM_Scope CMContainer SOMLINK ODMemContainerGetCMContainer(ODMemContainer *somSelf, Environment *ev)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","GetCMContainer");
-
- return _fCMContainer;
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: GetHandlers
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBentoHandlers* SOMLINK ODMemContainerGetHandlers(ODMemContainer *somSelf, Environment *ev)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","GetHandlers");
-
- return _fHandlers;
- }
-