Here's more info on the problem:

When I defined the method in the IDL as:

   JobIds getFailedJobIds();

with JobIds defined in an included file as:
typedef JobIds sequence<string>;

The definition for this method when evaluated here appears to be a "Container" 
with a repository ID of
"IDL:omg.org/CORBA/OperationDef:1.00"

class IRCopy {
...
bool IRCopy::copy (CORBA::Container_ptr src,  bool feed_included_defs) {
  ....
   dummy2 = CORBA::Container::_narrow (contents[i]);
    if (!CORBA::is_nil (dummy2)) {
      if (!copy (dummy2, _feed_included_defs)) {
    return false;
      }
    }
...

which leads to the exception of:

 uncaught MICO exception: IDL:omg.org/CORBA/BAD_OPERATION:1.0 (0, not-completed)

when an attempt is made to call id() on the dummy2 reference.

If "JobIds" is replaced with sequence<string>, the "OperationDef" repository ID 
never appears and there is no error in loading the IDL.

I get the same failure when loading CORBA.idl where when this method is 
evaluated:
IDL:omg.org/CORBA/Container/create_local_interface:1.0
it gets narrowed to a container and has an repository ID of:
 IDL:omg.org/CORBA/OperationDef:1.00

Looks like perhaps the "idl" program or the ird is getting confused.

Here's the full method with the print statements in it:
bool
IRCopy::copy (CORBA::Container_ptr src,
          bool feed_included_defs)
{
  _feed_included_defs = feed_included_defs;
 
  CORBA::Contained_var cs = CORBA::Contained::_narrow (src);

  cout << " ident = " << src->_repoid() << src->_get_component() << "\n";

  if (!CORBA::is_nil (cs) &&
      (!is_included_def (cs) || _feed_included_defs ||
       cs->def_kind() == CORBA::dk_Module)) {
    CORBA::Contained_var tc = copy_Contained (cs);
    if (CORBA::is_nil (tc)) {
      return false;
    }
  }

  CORBA::ContainedSeq_var contents = src->contents (CORBA::dk_all, 1);
  CORBA::Contained_var dummy1;
  CORBA::Container_var dummy2;

  for (CORBA::ULong i=0; i<contents->length(); i++) {
    CORBA::String_var absname = contents[i]->absolute_name ();
cout << " varname = " << absname << "\n";


CORBA::String_var failure = "::MDOPT::JobManager::getFailedJobIds";

if(absname == failure) {
    cout << "found it\n"; // used to set my breakpoint
}

    if (_db.is_implicit (absname)) {
      continue;
    }

    if (!is_included_def (contents[i]) || _feed_included_defs ||
    contents[i]->def_kind() == CORBA::dk_Module) {
      dummy1 = copy_Contained (contents[i]);
      if (CORBA::is_nil (dummy1)) {
    return false;
      }
    }
    dummy2 = CORBA::Container::_narrow (contents[i]);
    if (!CORBA::is_nil (dummy2)) {
      if (!copy (dummy2, _feed_included_defs)) {
    return false;
      }
    }
  }

  return true;
}


On 10/23/2011 11:35 PM, Rob Ratcliff wrote:
> Karel,
>
> I haven't found the root cause of the problem yet.  I'm running both the "idl 
> --feed-ir" command and the "ird" in multi-threaded
> mode. I've noticed that I can make a slight change to a method signature such 
> as:
>
> typedef sequence<string> Items; (defined in an include file)
>
> ...
> interface Test {
> ...
>     Items getItems();
> ...
> }
>
> vs.
> ...
> interface Test {
> ...
>     sequence<string> getItems();
> ...
> }
>
> The second will work and the first will not. I haven't been able to distill 
> it to a small test case, since deleting the
> "non-offensive" IDL from the files before loading it will fix the problem 
> with the formerly "offensive" IDL.
>
> But, thankfully, for a given IDL file, the  "Bad Operation" call will always 
> happen at the same place in the IDL. For one case I'm
> debugging, it happens during the second pass of IRCopy::copy command during 
> the "is_included_def(cs)" method shown here:
>
> http://www.futuretek.com/mico/mico-stack-trace.png
>
> This method dies when the id is attempted to be retrieved out of the remote 
> src object:
> bool IRCopy::is_included_def (CORBA::Contained_ptr src)
> {
>   string toplev = _db.get_toplevel_fname();
>
>   if (toplev.length() == 0) {
>     return false;
>   }
>
>   if (CORBA::is_nil (src)) {
>       return false;
>   }
>   CORBA::String_var id = src->id (); // dies here
>   string strid = id.in();
> ...
> }
>
> It appears to be a tricky problem, so any suggestions are appreciated!
>
> Rob
>
> On 10/20/2011 06:04 AM, Karel Gardas wrote:
>> Hi Rob,
>>
>> indeed, this would point to some race-condition in ird itself. However even 
>> part or not majority of interface repository (at least
>> this contained in libmicoir) should be thread-safe as this is also used in 
>> ObjectWall[1] and its generally thread-safe and tested
>> a lot under hight load in multi-threading setup on multi-cpu servers. So 
>> what you perhaps see is relict of single-threaded MICO
>> which should be fixed. If you do have already a patch for this or some 
>> attempt on it, please send it to here for review.
>>
>> Thanks!
>> Karel
>>
>> [1]: http://www.objectsecurity.com/en-products-objectwall.html
>>
>> On 10/19/11 03:31 PM, Rob Ratcliff wrote:
>>> Here's another update: I recompiled mico with threads disabled and noticed 
>>> that the single-threaded idl program crashed when
>>> communicating with the multi-threaded ird, but not with the single-threaded 
>>> ird. So it appears that the crash is related to enabling
>>> threads in the ird.
>>>
>>> On 10/18/2011 10:04 AM, Rob Ratcliff wrote:
>>>> Hi,
>>>>
>>>> I compiled MICO with multi-thread enabled (and CSIV2). When I attempt to 
>>>> load the CORBA.idl into the interface repository using
>>>> idl --feed-ir CORBA.idl
>>>>
>>>> I get the following stack trace from the core dump:
>>>>
>>>> (gdb) where
>>>> #0  0x0013a416 in __kernel_vsyscall ()
>>>> #1  0x003052f1 in raise () from /lib/libc.so.6
>>>> #2  0x00306d5e in abort () from /lib/libc.so.6
>>>> #3  0x007f6b1b in ?? () from /usr/lib/libstdc++.so.6
>>>> #4  0x007f6b53 in std::terminate() () from /usr/lib/libstdc++.so.6
>>>> #5  0x007f6cd2 in __cxa_throw () from /usr/lib/libstdc++.so.6
>>>> #6  0x00d0dc60 in CORBA::BAD_OPERATION::_throwit (this=0x9239be8) at 
>>>> ../include/mico/sysexc.h:36
>>>> #7  0x00d3d6ac in mico_throw (r=0xbffee144) at ../include/mico/throw.h:88
>>>> #8  mico_sii_throw (r=0xbffee144) at ../include/mico/throw.h:130
>>>> #9  0x00d41488 in CORBA::Contained_stub::id (this=0x9250a80) at ir.cc:331
>>>> #10 0x081ab7dc in IRCopy::is_included_def (this=0xbffee3b0, src=0x9250a80) 
>>>> at ir-copy.cc:123
>>>> #11 0x081b0d8b in IRCopy::copy (this=0xbffee3b0, src=0x92bd658, 
>>>> feed_included_defs=true) at ir-copy.cc:153
>>>> #12 0x081b0f4d in IRCopy::copy (this=0xbffee3b0, src=0x925cfe0, 
>>>> feed_included_defs=true) at ir-copy.cc:181
>>>> #13 0x081b0f4d in IRCopy::copy (this=0xbffee3b0, src=0x925bff0, 
>>>> feed_included_defs=true) at ir-copy.cc:181
>>>> #14 0x081b0f4d in IRCopy::copy (this=0xbffee3b0, src=0x9213910, 
>>>> feed_included_defs=true) at ir-copy.cc:181
>>>> #15 0x081b11bf in IRCopier (db=..., params=..., repo=0x922a860, 
>>>> cont=0x9213910) at ir-copy.cc:1628
>>>> #16 0x08089b23 in main (argc=17159044, argv=0x105d40c) at main.cc:357
>>>>
>>>> I've attached my MakeVars for reference.
>>>>
>>>> I'm just beginning to troubleshoot it, but if anybody has some idea why 
>>>> this would be happening, please let me know. My gut feel is
>>>> that there is some non-thread-safe code in the interface repository server 
>>>> since this works fine in the single-threaded version.
>>>> I've also noticed that smaller IDL files load fine.
>>>>
>>>> Thanks,
>>>>
>>>> Rob
>>>>
>>>>
>>>>
>>>
>>> ------------------------------------------------------------------------------
>>> All the data continuously generated in your IT infrastructure contains a
>>> definitive record of customers, application performance, security
>>> threats, fraudulent activity and more. Splunk takes this data and makes
>>> sense of it. Business sense. IT sense. Common sense.
>>> http://p.sf.net/sfu/splunk-d2d-oct
>>> _______________________________________________
>>> Mico-devel mailing list
>>> Mico-devel@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/mico-devel
>>>
>>
>
>
> ------------------------------------------------------------------------------
> The demand for IT networking professionals continues to grow, and the
> demand for specialized networking skills is growing even more rapidly.
> Take a complimentary Learning@Cisco Self-Assessment and learn 
> about Cisco certifications, training, and career opportunities. 
> http://p.sf.net/sfu/cisco-dev2dev
> _______________________________________________
> Mico-devel mailing list
> Mico-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/mico-devel
>


------------------------------------------------------------------------------
The demand for IT networking professionals continues to grow, and the
demand for specialized networking skills is growing even more rapidly.
Take a complimentary Learning@Cisco Self-Assessment and learn 
about Cisco certifications, training, and career opportunities. 
http://p.sf.net/sfu/cisco-dev2dev
_______________________________________________
Mico-devel mailing list
Mico-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mico-devel

Reply via email to