corbaobject.cc

来自「编译工具」· CC 代码 · 共 365 行

CC
365
字号
// -*- Mode: C++; -*-//                            Package   : omniORB// corbaObject.cc             Created on: 13/5/96//                            Author    : Sai Lai Lo (sll)////    Copyright (C) 1996-1999 AT&T Laboratories Cambridge////    This file is part of the omniORB library////    The omniORB library is free software; you can redistribute it and/or//    modify it under the terms of the GNU Library General Public//    License as published by the Free Software Foundation; either//    version 2 of the License, or (at your option) any later version.////    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 GNU//    Library General Public License for more details.////    You should have received a copy of the GNU Library General Public//    License along with this library; if not, write to the Free//    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  //    02111-1307, USA//// Description://    Implementation of the CORBA::Object interface.//       /*  $Log: corbaObject.cc,v $  Revision 1.20.2.8  2002/01/16 11:31:58  dpg1  Race condition in use of registerNilCorbaObject/registerTrackedObject.  (Reported by Teemu Torma).  Revision 1.20.2.7  2001/09/19 17:26:48  dpg1  Full clean-up after orb->destroy().  Revision 1.20.2.6  2001/08/03 17:41:19  sll  System exception minor code overhaul. When a system exeception is raised,  a meaning minor code is provided.  Revision 1.20.2.5  2001/05/31 16:18:12  dpg1  inline string matching functions, re-ordered string matching in  _ptrToInterface/_ptrToObjRef  Revision 1.20.2.4  2001/04/18 18:18:10  sll  Big checkin with the brand new internal APIs.  Revision 1.20.2.3  2000/11/07 18:44:03  sll  Renamed omniObjRef::_hash and _is_equivalent to __hash and __is_equivalent  to avoid name clash with the member functions of CORBA::Object.  Revision 1.20.2.2  2000/09/27 18:13:26  sll  Use the new cdrStream abstraction.  Removed obsoluted code CORBA::UnMarshalObjRef() and CORBA::MarshalObjRef().  Let the omniObjRef handles is_equivalent() and hash().  Revision 1.20.2.1  2000/07/17 10:35:52  sll  Merged from omni3_develop the diff between omni3_0_0_pre3 and omni3_0_0.  Revision 1.21  2000/07/13 15:25:58  dpg1  Merge from omni3_develop for 3.0 release.  Revision 1.19.6.9  2000/06/22 10:40:14  dpg1  exception.h renamed to exceptiondefs.h to avoid name clash on some  platforms.  Revision 1.19.6.8  2000/02/07 15:27:36  dpg1  Silly mistake in _is_equivalent() for pseudo object references.  Revision 1.19.6.7  2000/02/04 18:11:01  djr  Minor mods for IRIX (casting pointers to ulong instead of int).  Revision 1.19.6.6  1999/10/29 13:18:16  djr  Changes to ensure mutexes are constructed when accessed.  Revision 1.19.6.5  1999/10/16 13:22:53  djr  Changes to support compiling on MSVC.  Revision 1.19.6.4  1999/10/14 16:22:06  djr  Implemented logging when system exceptions are thrown.  Revision 1.19.6.3  1999/09/27 11:01:10  djr  Modifications to logging.  Revision 1.19.6.2  1999/09/24 10:29:33  djr  CORBA::Object::Object now requires an argument.  Revision 1.19.6.1  1999/09/22 14:26:45  djr  Major rewrite of orbcore to support POA.  Revision 1.15  1999/01/07 15:23:42  djr  Moved CORBA::Object::_get_interface() to ir.cc in dynamic library.  Revision 1.14  1998/08/26 11:05:05  sll  Test for NEED_DUMMY_RETURN in _get_interface and _get_implementation.  Revision 1.13  1998/08/14 13:44:30  sll  Added pragma hdrstop to control pre-compile header if the compiler feature  is available.  Revision 1.12  1998/04/07 19:50:22  sll  Replace cerr with omniORB::log.  Revision 1.11  1998/03/25 14:20:51  sll  Temporary work-around for egcs compiler.  Revision 1.10  1998/02/27 13:58:55  sll  _is_equivalent() now returns the correct answer when a proxy object  is tested against its colocated object implmentation. This situation will  only occur if the proxy object is created before the object implementation.  Revision 1.9  1997/12/09 17:26:32  sll  Updated _non_existent() to use the system exception handlers.// Revision 1.8  1997/05/06  15:09:45  sll// Public release.//*/#include <omniORB4/CORBA.h>#ifdef HAS_pch#pragma hdrstop#endif#include <omniORB4/minorCode.h>#include <omniORB4/omniObjRef.h>#include <omniORB4/objTracker.h>#include <objectAdapter.h>#include <anonObject.h>#include <exceptiondefs.h>OMNI_USING_NAMESPACE(omni)////////////////////////////////////////////////////////////////////////////////////////////////// CORBA::Object /////////////////////////////////////////////////////////////////////////////////////////////////CORBA::Object::~Object(){  pd_magic = 0;}CORBA::BooleanCORBA::Object::_is_a(const char* repoId){  if( !repoId )  return 0;  if( _NP_is_pseudo() )  return _ptrToObjRef(repoId) ? 1 : 0;  if( _NP_is_nil() ) {    if( omni::strMatch(repoId, "") )  return 1;    else                              return 0;  }  else {    return pd_obj->_real_is_a(repoId);  }}CORBA::BooleanCORBA::Object::_non_existent(){  if ( !_PR_is_valid(this) )  OMNIORB_THROW(BAD_PARAM,					    BAD_PARAM_InvalidObjectRef,					    CORBA::COMPLETED_NO);  if( _NP_is_nil()    )  return 1;  if( _NP_is_pseudo() )  return 0;  try {    return pd_obj->_remote_non_existent();  }  catch(CORBA::OBJECT_NOT_EXIST&) {    return 1;  }}CORBA::BooleanCORBA::Object::_is_equivalent(CORBA::Object_ptr other_object){  if ( !_PR_is_valid(this) )  OMNIORB_THROW(BAD_PARAM,					    BAD_PARAM_InvalidObjectRef,					    CORBA::COMPLETED_NO);  if ( !_PR_is_valid(other_object) )     OMNIORB_THROW(BAD_PARAM,		  BAD_PARAM_InvalidObjectRef,		  CORBA::COMPLETED_NO);  if( other_object == this )  return 1;  // Pseudo objects are equivalent only if pointers are equal.  // (So the above test should have gotten it).  if( _NP_is_pseudo() )    return 0;  if( other_object->_NP_is_nil() ) {    return _NP_is_nil();  }  else {    if( _NP_is_nil() )  return 0;    omniObjRef* objptr = _PR_getobj();    omniObjRef* other_objptr = other_object->_PR_getobj();    return objptr->__is_equivalent(other_objptr);  }}CORBA::ULongCORBA::Object::_hash(CORBA::ULong maximum){  if( _NP_is_nil() || maximum == 0 )  return 0;  if( _NP_is_pseudo() )  return CORBA::ULong((unsigned long) this) % maximum;  return _PR_getobj()->__hash(maximum);}CORBA::Object_ptr CORBA::Object::_duplicate(CORBA::Object_ptr obj){  if( !CORBA::is_nil(obj) )  obj->_NP_incrRefCount();  return obj;}CORBA::Object_ptrCORBA::Object::_nil(){  static CORBA::Object* _the_nil_ptr = 0;  if( !_the_nil_ptr ) {    omni::nilRefLock().lock();    if( !_the_nil_ptr ) {      _the_nil_ptr = new CORBA::Object;      registerNilCorbaObject(_the_nil_ptr);    }    omni::nilRefLock().unlock();  }  return _the_nil_ptr;}voidCORBA::Object::_NP_incrRefCount(){  OMNIORB_ASSERT(pd_obj);  OMNIORB_ASSERT(!_NP_is_pseudo());  omni::duplicateObjRef(pd_obj);}voidCORBA::Object::_NP_decrRefCount(){  OMNIORB_ASSERT(pd_obj);  OMNIORB_ASSERT(!_NP_is_pseudo());  omni::releaseObjRef(pd_obj);}void*CORBA::Object::_ptrToObjRef(const char* repoId){  OMNIORB_ASSERT(repoId);  if( omni::ptrStrMatch(repoId, CORBA::Object::_PD_repoId) )    return (CORBA::Object_ptr) this;  return 0;}voidCORBA::Object::_marshalObjRef(CORBA::Object_ptr obj, cdrStream& s){  if (obj->_NP_is_pseudo()) OMNIORB_THROW(MARSHAL,MARSHAL_LocalObject,					  (CORBA::CompletionStatus)s.completion());  omniObjRef::_marshal(obj->_PR_getobj(),s);}CORBA::Object_ptrCORBA::Object::_unmarshalObjRef(cdrStream& s){  omniObjRef* o = omniObjRef::_unMarshal(_PD_repoId,s);  if (o)    return (CORBA::Object_ptr)o->_ptrToObjRef(_PD_repoId);  else    return _nil();}const char*CORBA::Object::_PD_repoId = "IDL:omg.org/CORBA/Object:1.0";// We put this here rather than in anonObject.cc to ensure that// it is always linked into the application.static const omniAnonObjRef_pof _theomniAnonObjRef_pof;////////////////////////////////////////////////////////////////////////////////////////////// CORBA::Object_Helper //////////////////////////////////////////////////////////////////////////////////////////////CORBA::Object_ptrCORBA::Object_Helper::_nil() {  return Object::_nil();}CORBA::BooleanCORBA::Object_Helper::is_nil(CORBA::Object_ptr obj){  return CORBA::is_nil(obj);}voidCORBA::Object_Helper::release(CORBA::Object_ptr obj){  CORBA::release(obj);}voidCORBA::Object_Helper::duplicate(CORBA::Object_ptr obj){  CORBA::Object::_duplicate(obj);}voidCORBA::Object_Helper::marshalObjRef(CORBA::Object_ptr obj, cdrStream& s){  CORBA::Object::_marshalObjRef(obj,s);}CORBA::Object_ptrCORBA::Object_Helper::unmarshalObjRef(cdrStream& s){  return CORBA::Object::_unmarshalObjRef(s);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?