docs: public void start(Xid xid, int flags) throws XAException
     {
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.entry(this, tc, "start", new Object[] {xid, ""+flags});
        
        if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Current state = " + state);
        
        if ((state == ResourceState.ENLISTED) || (state == ResourceState.JOINED))
        {
           // We are already enlisted here - something is a bit wrong
           if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "We are already enlisted - rejecting this call");
           throw new XAException(XAException.XAER_PROTO);
        }
        else if ((flags & XAResource.TMJOIN) == XAResource.TMJOIN)
        {
           if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "TMJOIN was specified");
           
           // Now get the resource from the map that we would like to join up to
           HashMap<Xid, SIXAResourceProxy> map = getLinkLevelXAResourceMap();
           synchronized(map)
           {
              joinedResource = map.get(xid);
           }
           
           // If the resource did not exist in the map, then we cannot possible join up to it
           if (joinedResource == null)
           {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "The resource cannot be joined as it doesn't exist");
              throw new XAException(XAException.XAER_INVAL);
           }
           
           state = ResourceState.JOINED;
           joinedResource.join(this);
        }
        else
        {
           if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Performing a normal start");
           
           internalStart(xid, flags);
           
           // Now we are enlisted
           state = ResourceState.ENLISTED;
           
           // Now add an entry into the link level state map
           HashMap<Xid, SIXAResourceProxy> map = getLinkLevelXAResourceMap();
           synchronized(map)
           {
              map.put(xid, this);
           }
        }
        
        endHasBeenCalled = false;
        
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(this, tc, "start");
     }