orber_diagnostics.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 241 行
ERL
241 行
%%--------------------------------------------------------------------%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %% $Id$%%%%-----------------------------------------------------------------%% File: orber_diagnostics.erl%% %% Description:%%%% Creation date: 8 Apr 2003%%%%------------------------------------------------------------------module(orber_diagnostics).%%-----------------------------------------------------------------%% Includes%%------------------------------------------------------------------include_lib("orber/src/orber_iiop.hrl").-include_lib("orber/src/ifr_objects.hrl").-include_lib("orber/COSS/CosNaming/CosNaming.hrl").-include_lib("orber/COSS/CosNaming/CosNaming_NamingContext.hrl").-include_lib("orber/COSS/CosNaming/orber_cosnaming.hrl").%%-----------------------------------------------------------------%% External exports%%------------------------------------------------------------------export([nameservice/0, nameservice/1, objectkeys/0, missing_modules/0]).%%-----------------------------------------------------------------%% Internal Exports%%------------------------------------------------------------------export([]).%%-----------------------------------------------------------------%% Internal exports%%-----------------------------------------------------------------%%-----------------------------------------------------------------%% Macros%%------------------------------------------------------------------define(DEBUG_LEVEL, 5).-define(DIAGNOSTICS_PING_EXTERNAL, 16#01).%%-----------------------------------------------------------------%% Function : missing_modules%% Args : -%% Returns : %%-----------------------------------------------------------------missing_modules() -> List = case orber:light_ifr() of false -> Unions = mnesia:dirty_select(ir_UnionDef, [{#ir_UnionDef{absolute_name='$1', _='_'}, [], ['$1']}]), Structs = mnesia:dirty_select(ir_StructDef, [{#ir_StructDef{absolute_name='$1', _='_'}, [], ['$1']}]), Exc = mnesia:dirty_select(ir_ExceptionDef, [{#ir_ExceptionDef{absolute_name='$1', _='_'}, [], ['$1']}]), Interface = mnesia:dirty_select(ir_InterfaceDef, [{#ir_InterfaceDef{absolute_name='$1', _='_'}, [], ['$1']}]), Acc1 = create_module_names(Unions, [], ?IFR_UnionDef), Acc2 = create_module_names(Structs, Acc1, ?IFR_StructDef), Acc3 = create_module_names(Exc, Acc2, ?IFR_ExceptionDef), create_module_names(Interface, Acc3, ?IFR_InterfaceDef); true -> mnesia:dirty_select(orber_light_ifr, [{#orber_light_ifr{module='$1', type='$2', _='_'}, [{'=/=', '$2', ?IFR_ModuleDef}, {'=/=', '$2', ?IFR_ConstantDef}, {'=/=', '$2', ?IFR_AliasDef}, {'=/=', '$2', ?IFR_EnumDef}], ['$$']}]) end, io:format("Need to check for ~p modules.~n", [length(List)]), Count = missing_modules_helper(List, 0), io:format("Check completed. ~p missing modules.~n", [Count]), Count. create_module_names([], Acc, _) -> Acc;create_module_names([[$:,$:|N]|T], Acc, Type) -> create_module_names(T, [[change_colons_to_underscore(N, []), Type]|Acc], Type).change_colons_to_underscore([$:, $: | T], Acc) -> change_colons_to_underscore(T, [$_ |Acc]);change_colons_to_underscore([H |T], Acc) -> change_colons_to_underscore(T, [H |Acc]);change_colons_to_underscore([], Acc) -> list_to_atom(lists:reverse(Acc)).missing_modules_helper([], ErrorsFound) -> ErrorsFound;missing_modules_helper([[Mod, Type]|T], ErrorsFound) when Type == ?IFR_StructDef; Type == ?IFR_UnionDef; Type == ?IFR_ExceptionDef -> case catch Mod:tc() of {'EXIT', _} -> io:format("Missing (~s): ~p~n", [type2str(Type), Mod]), missing_modules_helper(T, ErrorsFound + 1); _ -> missing_modules_helper(T, ErrorsFound) end;missing_modules_helper([[Mod, Type]|T], ErrorsFound) when Type == ?IFR_InterfaceDef -> case catch Mod:oe_get_interface() of {'EXIT', {undef,[{Mod, _, _}|_]}} -> io:format("Missing (Interface): ~p~n", [Mod]), missing_modules_helper(T, ErrorsFound + 1); {'EXIT', {undef,[{OtherMod, _, _}|_]}} -> io:format("Missing (Inherited by the ~p Interface): ~p~n", [Mod, OtherMod]), missing_modules_helper(T, ErrorsFound + 1); _ -> missing_modules_helper(T, ErrorsFound) end;missing_modules_helper([_|T], ErrorsFound) -> missing_modules_helper(T, ErrorsFound).type2str(?IFR_StructDef) -> "Struct";type2str(?IFR_UnionDef) -> "Union";type2str(?IFR_ExceptionDef) -> "Exception". %%-----------------------------------------------------------------%% Function : nameservice%% Args : - | integer()%% Returns : %%-----------------------------------------------------------------nameservice() -> nameservice(0).nameservice(Flags) -> case catch ns(?ORB_FLAG_TEST(Flags, ?DIAGNOSTICS_PING_EXTERNAL)) of ok -> ok; {'EXCEPTION', E} -> orber:dbg("[~p] orber_diagnostics:nameservice(~p);~n" "Reason: ~p", [?LINE, Flags, E], ?DEBUG_LEVEL), corba:raise(E); What -> orber:dbg("[~p] orber_diagnostics:nameservice(~p);~n" "Reason: ~p", [?LINE, Flags, What], ?DEBUG_LEVEL), corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO}) end.ns(Ping) -> NS = corba:resolve_initial_references("NameService"), display_names(NS, "", Ping).display_names(NS, Prefix, Ping) -> {ok, [], Iter} = 'CosNaming_NamingContextExt':list(NS, 0), More = not corba_object:is_nil(Iter), iter_names(NS, Prefix, Iter, More, Ping).iter_names(_NS, _Prefix, Iter, false, _) -> destroy_iter(Iter);iter_names(NS, Prefix, Iter, true, Ping) -> {More, #'CosNaming_Binding'{binding_name = Name, binding_type = Type}} = 'CosNaming_BindingIterator':next_one(Iter), Fun = fun(#'CosNaming_NameComponent'{id = Id, kind = Kind}, Acc) -> case Kind of "" -> Acc ++ Id ++ "/"; _ -> Acc ++ Id ++ "." ++ Kind ++ "/" end end, Prefix2 = lists:foldl(Fun, Prefix, Name), if More == false -> ignore; Type == nobject -> Object = 'CosNaming_NamingContext':resolve(NS, Name), Status = case corba_object:is_remote(Object) of false -> corba_object:non_existent(Object); _ when Ping == true -> case catch corba_object:non_existent(Object) of Boolean when atom(Boolean) -> Boolean; _Other -> undefined end; _ -> external end, io:format("~s [~p] ~s\n", [Prefix2, Status, iop_ior:get_typeID(Object)]); Type == ncontext -> Context = 'CosNaming_NamingContext':resolve(NS, Name), io:format("~s\n", [Prefix2]), display_names(Context, Prefix2, Ping) end, iter_names(NS, Prefix, Iter, More, Ping).destroy_iter(Iter) -> case corba_object:is_nil(Iter) of false -> 'CosNaming_BindingIterator':destroy(Iter), ok; true -> ok end.objectkeys() -> ok.%%---------------- END OF MODULE ----------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?