📄 exception.cc
字号:
// -*- Mode: C++; -*-// Package : omniORB// exception.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:///* $Log: exception.cc,v $ Revision 1.10.2.11 2005/04/08 00:06:15 dgrisby Remove all remaining uses of logf. Revision 1.10.2.10 2002/08/16 17:47:39 dgrisby Documentation, message updates. ORB tweaks to match docs. Revision 1.10.2.9 2002/02/25 11:17:12 dpg1 Use tracedmutexes everywhere. Revision 1.10.2.8 2002/01/15 16:38:13 dpg1 On the road to autoconf. Dependencies refactored, configure.ac written. No makefiles yet. Revision 1.10.2.7 2001/09/20 15:10:47 sll Default Transient Handler now checks for the minor code TRANSIENT_FailedOnForwarded and do a retry. Revision 1.10.2.6 2001/08/03 17:41:21 sll System exception minor code overhaul. When a system exeception is raised, a meaning minor code is provided. Revision 1.10.2.5 2001/07/31 16:38:05 sll Remove dead code. Revision 1.10.2.4 2001/05/11 14:29:23 sll Default tranisent handler now do not retry at all. Revision 1.10.2.3 2001/04/18 18:18:08 sll Big checkin with the brand new internal APIs. Revision 1.10.2.2 2000/09/27 17:35:49 sll Updated include/omniORB3 to include/omniORB4 Revision 1.10.2.1 2000/07/17 10:35:53 sll Merged from omni3_develop the diff between omni3_0_0_pre3 and omni3_0_0. Revision 1.11 2000/07/13 15:25:58 dpg1 Merge from omni3_develop for 3.0 release. Revision 1.9.6.5 2000/06/22 10:40:14 dpg1 exception.h renamed to exceptiondefs.h to avoid name clash on some platforms. Revision 1.9.6.4 2000/06/12 11:16:23 dpg1 Global exception handlers were returning a zero cookie. Revision 1.9.6.3 1999/10/14 16:22:08 djr Implemented logging when system exceptions are thrown. Revision 1.9.6.2 1999/09/30 12:25:58 djr Minor changes. Revision 1.9.6.1 1999/09/22 14:26:48 djr Major rewrite of orbcore to support POA. Revision 1.9 1999/06/18 20:53:10 sll New function _CORBA_bad_param_freebuf(). Revision 1.8 1999/03/11 16:25:52 djr Updated copyright notice Revision 1.7 1999/01/07 15:44:03 djr Added _CORBA_invoked_nil_pseudo_ref() and _CORBA_use_nil_ptr_as_nil_pseudo_objref(). Revision 1.6 1998/08/14 13:46:37 sll Added pragma hdrstop to control pre-compile header if the compiler feature is available. Revision 1.5 1998/04/07 19:33:40 sll Replace cerr with omniORB::log. Use namespce when available. Revision 1.4 1997/12/09 18:06:37 sll Added support for system exception handlers. Revision 1.3 1997/08/21 22:03:56 sll Added system exception TRANSACTION_REQUIRED, TRANSACTION_ROLLEDBACK, INVALID_TRANSACTION, WRONG_TRANSACTION. INVALID_TRANSACTION, WRONG_TRANSACTION.// Revision 1.2 1997/05/06 15:12:21 sll// Public release.// */#include <omniORB4/CORBA.h>#ifdef HAS_pch#pragma hdrstop#endif#include <excepthandler.h>#include <omniORB4/omniObjRef.h>#include <exceptiondefs.h>#include <omniORB4/minorCode.h>OMNI_USING_NAMESPACE(omni)static CORBA::Booleanomni_defaultTransientExcHandler(void*, CORBA::ULong n_retries, const CORBA::TRANSIENT& ex);static CORBA::Booleanomni_defaultCommFailureExcHandler(void*, CORBA::ULong n_retries, const CORBA::COMM_FAILURE& ex);static CORBA::Booleanomni_defaultSystemExcHandler(void*, CORBA::ULong n_retries, const CORBA::SystemException& ex);static omniORB::transientExceptionHandler_tomni_globalTransientExcHandler = omni_defaultTransientExcHandler;static omniORB::commFailureExceptionHandler_tomni_globalCommFailureExcHandler = omni_defaultCommFailureExcHandler;static omniORB::systemExceptionHandler_tomni_globalSystemExcHandler = omni_defaultSystemExcHandler;static void* omni_globalTransientExcHandlerCookie = 0;static void* omni_globalCommFailureExcHandlerCookie =0;static void* omni_globalSystemExcHandlerCookie = 0;omniExHandlers** omniExHandlers::Table = 0;omni_tracedmutex omniExHandlers::TableLock;static CORBA::Booleanomni_defaultTransientExcHandler(void*, CORBA::ULong n_retries, const CORBA::TRANSIENT& ex){ if (ex.minor() == TRANSIENT_FailedOnForwarded) { if (omniORB::trace(10)) { omniORB::logger log; log << "Invocation on a location forwarded object has failed. " << n_retries << " retries.\n"; } unsigned long secs; secs = ((n_retries < 30) ? n_retries : 30); if (secs) omni_thread::sleep(secs,0); return 1; } return 0;}voidomniORB::installTransientExceptionHandler(void* cookie, omniORB::transientExceptionHandler_t fn){ omni_globalTransientExcHandler = fn; omni_globalTransientExcHandlerCookie = cookie;}voidomniORB::installTransientExceptionHandler(CORBA::Object_ptr obj, void* cookie, omniORB::transientExceptionHandler_t fn){ if (CORBA::is_nil(obj)) return; obj->_PR_getobj()->_transientExceptionHandler((void*)fn,cookie);}static CORBA::Booleanomni_defaultCommFailureExcHandler(void*, CORBA::ULong, const CORBA::COMM_FAILURE&){ return 0;}voidomniORB::installCommFailureExceptionHandler(void* cookie, omniORB::commFailureExceptionHandler_t fn){ omni_globalCommFailureExcHandler = fn; omni_globalCommFailureExcHandlerCookie = cookie;}voidomniORB::installCommFailureExceptionHandler(CORBA::Object_ptr obj, void* cookie, omniORB::commFailureExceptionHandler_t fn){ if (CORBA::is_nil(obj)) return; obj->_PR_getobj()->_commFailureExceptionHandler((void*)fn,cookie);}static CORBA::Booleanomni_defaultSystemExcHandler(void*, CORBA::ULong, const CORBA::SystemException&){ return 0;}voidomniORB::installSystemExceptionHandler(void* cookie, omniORB::systemExceptionHandler_t fn){ omni_globalSystemExcHandler = fn; omni_globalSystemExcHandlerCookie = cookie;}voidomniORB::installSystemExceptionHandler(CORBA::Object_ptr obj, void* cookie, omniORB::systemExceptionHandler_t fn){ if (CORBA::is_nil(obj)) return; obj->_PR_getobj()->_systemExceptionHandler((void*)fn,cookie);}CORBA::Boolean_omni_callTransientExceptionHandler(omniObjRef* obj, CORBA::ULong nretries, const CORBA::TRANSIENT& ex){ void* cookie = 0; void* handler = obj->_transientExceptionHandler(cookie); if (handler) { return (*(omniORB::transientExceptionHandler_t)handler)(cookie, nretries, ex); } else { cookie = omni_globalTransientExcHandlerCookie; return (*omni_globalTransientExcHandler)(cookie, nretries, ex); }}CORBA::Boolean_omni_callCommFailureExceptionHandler(omniObjRef* obj, CORBA::ULong nretries, const CORBA::COMM_FAILURE& ex){ void* cookie = 0; void* handler = obj->_commFailureExceptionHandler(cookie); if (handler) { return (*(omniORB::commFailureExceptionHandler_t)handler)(cookie, nretries, ex); } else { cookie = omni_globalCommFailureExcHandlerCookie; return (*omni_globalCommFailureExcHandler)(cookie, nretries, ex); }}CORBA::Boolean_omni_callSystemExceptionHandler(omniObjRef* obj, CORBA::ULong nretries, const CORBA::SystemException& ex){ void* cookie = 0; void* handler = obj->_systemExceptionHandler(cookie); if (handler) { return (*(omniORB::systemExceptionHandler_t)handler)(cookie, nretries, ex); } else { cookie = omni_globalSystemExcHandlerCookie; return (*omni_globalSystemExcHandler)(cookie, nretries, ex); }}// This should really be extensible ...static int exHandlersTableSize = 103;#ifdef EXHANDLER_HASH# undef EXHANDLER_HASH#endif#define EXHANDLER_HASH(p) ((omni::ptr_arith_t) p % exHandlersTableSize)omniExHandlers::omniExHandlers() : transient_hdr(0), transient_cookie(0), commfail_hdr(0), commfail_cookie(0), sysexcpt_hdr(0), sysexcpt_cookie(0), objptr(0), next(0){}omniExHandlers_iterator::omniExHandlers_iterator(){ omniExHandlers::TableLock.lock();}omniExHandlers_iterator::~omniExHandlers_iterator(){ omniExHandlers::TableLock.unlock();}omniExHandlers*omniExHandlers_iterator::find_or_create(omniObjRef* p){ if (omniExHandlers::Table == 0) { omniExHandlers::Table = new omniExHandlers* [exHandlersTableSize]; for( int i = 0; i < exHandlersTableSize; i++ ) omniExHandlers::Table[i] = 0; } omniExHandlers* exlist = omniExHandlers::Table[EXHANDLER_HASH(p)]; while (exlist) { if (exlist->objptr == p) break; exlist = exlist->next; } if (exlist) { return exlist; } else { omniExHandlers* np = new omniExHandlers; np->objptr = p; omniExHandlers** exlistp = &(omniExHandlers::Table[EXHANDLER_HASH(p)]); np->next = *exlistp; *exlistp = np; return np; }}omniExHandlers*omniExHandlers_iterator::find(omniObjRef* p){ if (omniExHandlers::Table == 0) return 0; omniExHandlers* exlist = omniExHandlers::Table[EXHANDLER_HASH(p)]; while (exlist) { if (exlist->objptr == p) break; exlist = exlist->next; } return exlist;}voidomniExHandlers_iterator::remove(omniObjRef* p){ if (omniExHandlers::Table == 0) return; omniExHandlers** exlistp = &(omniExHandlers::Table[EXHANDLER_HASH(p)]); while (*exlistp) { if ((*exlistp)->objptr == p) { omniExHandlers* exp = *exlistp; *exlistp = exp->next; delete exp; break; } else { exlistp = &((*exlistp)->next); } }}#undef EXHANDLER_HASH//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CORBA::Boolean _CORBA_use_nil_ptr_as_nil_objref(){ omniORB::logs(10, "WARNING -- a nil (0) pointer is wrongly used as a\n" " nil object reference."); return 1;}void_CORBA_new_operator_return_null(){ OMNIORB_THROW(NO_MEMORY,0,CORBA::COMPLETED_NO);}void_CORBA_bound_check_error(){ OMNIORB_THROW(BAD_PARAM,BAD_PARAM_IndexOutOfRange,CORBA::COMPLETED_NO);}void_CORBA_marshal_sequence_range_check_error(cdrStream& s){ OMNIORB_THROW(MARSHAL,MARSHAL_SequenceIsTooLong, (CORBA::CompletionStatus)s.completion());}void_CORBA_invoked_nil_pseudo_ref(){ omniORB::logs(1, "ERROR -- the application attempted to invoke an" " operation\n" " on a nil pseudo-object reference."); OMNIORB_THROW(INV_OBJREF,INV_OBJREF_InvokeOnNilObjRef, CORBA::COMPLETED_NO);}CORBA::Boolean_CORBA_use_nil_ptr_as_nil_pseudo_objref(const char* objType){ if( omniORB::trace(1) ) { omniORB::logger l; l << "WARNING -- a nil (0) pointer is wrongly used as a\n" << " nil CORBA::" << objType << " object reference.\n" << " Use CORBA::" << objType << "::_nil()\n"; } return 1;}void_CORBA_invoked_nil_objref(){ omniORB::logs(1, "ERROR -- the application attempted to invoke an" " operation\n" " on a nil reference."); OMNIORB_THROW(INV_OBJREF,INV_OBJREF_InvokeOnNilObjRef, CORBA::COMPLETED_NO);}void_CORBA_bad_param_freebuf(){ omniORB::logs(1, "ERROR -- an invalid buffer pointer is passed to freebuf\n" " of string or object sequence");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -