186 lines
4.7 KiB
C
186 lines
4.7 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these libraries and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/*
|
|
* $XConsortium: handler.cc /main/5 1996/07/18 14:41:25 drk $
|
|
*
|
|
* Copyright (c) 1993 HAL Computer Systems International, Ltd.
|
|
* All rights reserved. Unpublished -- rights reserved under
|
|
* the Copyright Laws of the United States. USE OF A COPYRIGHT
|
|
* NOTICE IS PRECAUTIONARY ONLY AND DOES NOT IMPLY PUBLICATION
|
|
* OR DISCLOSURE.
|
|
*
|
|
* THIS SOFTWARE CONTAINS CONFIDENTIAL INFORMATION AND TRADE
|
|
* SECRETS OF HAL COMPUTER SYSTEMS INTERNATIONAL, LTD. USE,
|
|
* DISCLOSURE, OR REPRODUCTION IS PROHIBITED WITHOUT THE
|
|
* PRIOR EXPRESS WRITTEN PERMISSION OF HAL COMPUTER SYSTEMS
|
|
* INTERNATIONAL, LTD.
|
|
*
|
|
* RESTRICTED RIGHTS LEGEND
|
|
* Use, duplication, or disclosure by the Government is subject
|
|
* to the restrictions as set forth in subparagraph (c)(l)(ii)
|
|
* of the Rights in Technical Data and Computer Software clause
|
|
* at DFARS 252.227-7013.
|
|
*
|
|
* HAL COMPUTER SYSTEMS INTERNATIONAL, LTD.
|
|
* 1315 Dell Avenue
|
|
* Campbell, CA 95008
|
|
*
|
|
*/
|
|
|
|
|
|
#include "object/handler.h"
|
|
#include "mgrs/managers.h"
|
|
|
|
//memory_pool handler::handler_space_pool;
|
|
extern memory_pool g_memory_pool;
|
|
|
|
handler::handler() :
|
|
store(0), obj_id(ground), obj_ptr(0)
|
|
{
|
|
}
|
|
|
|
handler::handler(const oid_t& id, abs_storage* s) :
|
|
store(s), obj_id(id), obj_ptr(0)
|
|
{
|
|
}
|
|
|
|
handler::handler(c_code_t cod, abs_storage* s) :
|
|
store(s), obj_id(cod, 0), obj_ptr(0)
|
|
{
|
|
if ( s )
|
|
operator->(); // to init the object from the store
|
|
}
|
|
|
|
handler::handler(rootPtr ptr, abs_storage* s) :
|
|
store(s), obj_id(ptr -> my_oid()), obj_ptr(ptr)
|
|
{
|
|
}
|
|
|
|
void handler::set(rootPtr ptr, abs_storage* s)
|
|
{
|
|
store = (abs_storage*)s;
|
|
|
|
if ( ptr )
|
|
obj_id.become(ptr -> my_oid());
|
|
|
|
obj_ptr = ptr;
|
|
}
|
|
|
|
handler::~handler()
|
|
{
|
|
if ( store ) {
|
|
managers::template_mgr -> quit_obj(store, obj_ptr);
|
|
} else
|
|
delete obj_ptr;
|
|
|
|
// commit();
|
|
// delete obj_ptr;
|
|
}
|
|
|
|
void handler::destroy()
|
|
{
|
|
if ( store )
|
|
managers::template_mgr -> destroy_obj(store, obj_ptr);
|
|
else
|
|
delete obj_ptr;
|
|
}
|
|
|
|
void handler::sync()
|
|
{
|
|
if ( store ) store -> sync();
|
|
}
|
|
|
|
void handler::commit()
|
|
{
|
|
if ( store ) {
|
|
if ( obj_ptr )
|
|
obj_ptr -> commit(); // save all its handler components
|
|
managers::template_mgr -> commit_obj(store, obj_ptr);
|
|
}
|
|
}
|
|
|
|
root* handler::operator ->()
|
|
{
|
|
if ( store ) {
|
|
|
|
if ( obj_ptr == 0 ) {
|
|
|
|
/*
|
|
(obj_ptr && obj_id.eq(obj_ptr -> my_oid()) == false )
|
|
MESSAGE(cerr, "handler::operator ->()");
|
|
debug(cerr, (void*)obj_ptr);
|
|
debug(cerr, obj_id);
|
|
if ( obj_ptr -> get_mode(SWAP_ALLOWED) == true )
|
|
//r_obj_cache.promote_object(store, obj_ptr);
|
|
*/
|
|
|
|
//obj_ptr = r_obj_cache.init_object(store, obj_id);
|
|
|
|
if ( obj_id.icode() ) {
|
|
managers::template_mgr -> init_obj(store, obj_id.icode(), obj_ptr);
|
|
} else {
|
|
managers::template_mgr -> create_obj(store, obj_id.ccode(), obj_ptr);
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
// update the handler side object id. Its class code may not
|
|
// be initialized as class code of a oid_t is not saved on the disk.
|
|
// We do not expect this check will degrade the performance as
|
|
// this init_object block is only called once for the operator->().
|
|
// Subsequent calls will bypass it as obj_ptr is not 0.
|
|
///////////////////////////////////////////////////////////////////
|
|
obj_id.become(obj_ptr -> my_oid());
|
|
|
|
}
|
|
}
|
|
|
|
if ( store && obj_ptr == 0 ) {
|
|
debug(cerr, long(store));
|
|
debug(cerr, its_oid());
|
|
throw(stringException("null obj ptr"));
|
|
};
|
|
|
|
return obj_ptr;
|
|
}
|
|
|
|
|
|
handler::operator root&()
|
|
{
|
|
return *(this -> operator->());
|
|
}
|
|
|
|
void* handler::operator new( size_t x )
|
|
{
|
|
//return (void*)g_memory_pool.alloc(x);
|
|
|
|
return ::operator new(x);
|
|
}
|
|
|
|
void handler::operator delete( void* ptr )
|
|
{
|
|
//g_memory_pool.free((char*)ptr);
|
|
|
|
::operator delete(ptr);
|
|
}
|