be_produce.cpp File Reference

#include "global_extern.h"
#include "TAO_IFR_BE_Export.h"
#include "be_extern.h"
#include "fe_extern.h"
#include "ast_root.h"
#include "ifr_visitor_macro.h"
#include "ifr_removing_visitor.h"
#include "ifr_adding_visitor.h"

Include dependency graph for be_produce.cpp:

Include dependency graph

Go to the source code of this file.

Functions

TAO_IFR_BE_Export void BE_cleanup (void)
TAO_IFR_BE_Export void BE_abort (void)
void BE_create_holding_scope (void)
int BE_ifr_repo_init (void)
TAO_IFR_BE_Export void BE_produce (void)


Function Documentation

TAO_IFR_BE_Export void BE_abort void   ) 
 

Definition at line 92 of file be_produce.cpp.

References ACE_ERROR, ACE_TEXT(), and LM_ERROR.

Referenced by BE_produce().

00093 {
00094   ACE_ERROR ((LM_ERROR,
00095               ACE_TEXT ("Fatal Error - Aborting\n")));
00096 
00097   // BE_cleanup will be called after the exception is caught.
00098   throw FE_Bailout ();
00099 }

TAO_IFR_BE_Export void BE_cleanup void   ) 
 

Definition at line 85 of file be_produce.cpp.

Referenced by BE_produce().

00086 {
00087   idl_global->destroy ();
00088 }

void BE_create_holding_scope void   ) 
 

Definition at line 102 of file be_produce.cpp.

References be_global, BE_GlobalData::holding_scope(), BE_GlobalData::holding_scope_name(), CORBA::is_nil(), and BE_GlobalData::repository().

Referenced by BE_produce().

00103 {
00104   CORBA::ModuleDef_ptr scope = CORBA::ModuleDef::_nil ();
00105 
00106   // If we are multi-threaded, it may already be created.
00107   CORBA::Contained_var result =
00108     be_global->repository ()->lookup_id (be_global->holding_scope_name ());
00109 
00110   // Will live until the repository goes away for good.
00111   if (CORBA::is_nil (result.in ()))
00112     {
00113       scope =
00114         be_global->repository ()->create_module (
00115                                       be_global->holding_scope_name (),
00116                                       be_global->holding_scope_name (),
00117                                       "1.0"
00118                                     );
00119     }
00120   else
00121     {
00122       scope = CORBA::ModuleDef::_narrow (result.in ());
00123     }
00124 
00125   be_global->holding_scope (scope);
00126 }

int BE_ifr_repo_init void   ) 
 

Definition at line 129 of file be_produce.cpp.

References ACE_ERROR_RETURN, ACE_TEXT(), be_global, CORBA::is_nil(), LM_ERROR, BE_GlobalData::orb(), and BE_GlobalData::repository().

Referenced by BE_produce().

00130 {
00131   CORBA::Object_var object =
00132     be_global->orb ()->resolve_initial_references ("InterfaceRepository");
00133 
00134   if (CORBA::is_nil (object.in ()))
00135     {
00136       ACE_ERROR_RETURN ((
00137           LM_ERROR,
00138           ACE_TEXT ("Null objref from resolve_initial_references\n")
00139         ),
00140         -1
00141       );
00142     }
00143 
00144   CORBA::Repository_var repo =
00145     CORBA::Repository::_narrow (object.in ());
00146 
00147   if (CORBA::is_nil (repo.in ()))
00148     {
00149       ACE_ERROR_RETURN ((
00150           LM_ERROR,
00151           ACE_TEXT ("CORBA::Repository::_narrow failed\n")
00152         ),
00153         -1
00154       );
00155     }
00156 
00157   be_global->repository (repo._retn ());
00158 
00159   return 0;
00160 }

TAO_IFR_BE_Export void BE_produce void   ) 
 

Definition at line 164 of file be_produce.cpp.

References ACE_ERROR, ACE_TEXT(), BE_abort(), BE_cleanup(), BE_create_holding_scope(), be_global, BE_ifr_repo_init(), LM_ERROR, BE_GlobalData::removing(), TAO_IFR_VISITOR_WRITE_GUARD, and ifr_removing_visitor::visit_scope().

00165 {
00166   try
00167     {
00168       int status = BE_ifr_repo_init ();
00169 
00170       if (status != 0)
00171         {
00172           return;
00173         }
00174 
00175       BE_create_holding_scope ();
00176 
00177       // Get the root node.
00178       AST_Decl *d = idl_global->root ();
00179       AST_Root *root = AST_Root::narrow_from_decl (d);
00180 
00181       if (root == 0)
00182         {
00183           ACE_ERROR ((LM_ERROR,
00184                       ACE_TEXT ("(%N:%l) BE_produce - ")
00185                       ACE_TEXT ("No Root\n")));
00186 
00187           BE_abort ();
00188         }
00189 
00190       if (be_global->removing ())
00191         {
00192           ifr_removing_visitor visitor;
00193 
00194           TAO_IFR_VISITOR_WRITE_GUARD;
00195 
00196           // If the visitor is dispatched this way, we need to override
00197           // only visit_scope() for the removing visitor.
00198           if (visitor.visit_scope (root) == -1)
00199             {
00200               ACE_ERROR ((
00201                   LM_ERROR,
00202                   ACE_TEXT ("(%N:%l) BE_produce -")
00203                   ACE_TEXT (" failed to accept removing visitor\n")
00204                 ));
00205 
00206               BE_abort ();
00207             }
00208         }
00209       else
00210         {
00211           ifr_adding_visitor visitor (d);
00212 
00213           TAO_IFR_VISITOR_WRITE_GUARD;
00214 
00215           if (root->ast_accept (&visitor) == -1)
00216             {
00217               ACE_ERROR ((
00218                   LM_ERROR,
00219                   ACE_TEXT ("(%N:%l) BE_produce -")
00220                   ACE_TEXT (" failed to accept adding visitor\n")
00221                 ));
00222 
00223               BE_abort ();
00224             }
00225         }
00226     }
00227   catch (const CORBA::Exception& ex)
00228     {
00229       ex._tao_print_exception (ACE_TEXT ("BE_produce"));
00230 
00231     }
00232 
00233   // Clean up.
00234   BE_cleanup ();
00235 }


Generated on Sun Jan 27 16:31:57 2008 for TAO_IFR by doxygen 1.3.6