code: protected <T extends DObject> void doSubscribe (ObjectAction<T> action)
      {
          // Log.info("doSubscribe: " + oid + ": " + target);
  
          int oid = action.oid;
          Subscriber<T> target = action.target;
  
          // first see if we've already got the object in our table
          @SuppressWarnings("unchecked") T obj = (T)_ocache.get(oid);
          if (obj != null) {
              // clear the object out of the flush table if it's in there
              if (_flushes.remove(oid) != null) {
  //                 Log.info("Resurrected " + oid + ".");
              }
              // add the subscriber and call them back straight away
              obj.addSubscriber(target);
              target.objectAvailable(obj);
              return;
          }
  
          // see if we've already got an outstanding request for this object
          @SuppressWarnings("unchecked") PendingRequest<T> req = (PendingRequest<T>)_penders.get(oid);
          if (req != null) {
              // add this subscriber to the list to be notified when the request is satisfied
              req.addTarget(target);
              return;
          }
  
          // otherwise we need to create a new request
          req = new PendingRequest<T>(oid);
          req.addTarget(target);
          _penders.put(oid, req);
          // Log.info("Registering pending request [oid=" + oid + "].");
  
          // and issue a request to get things rolling
          _comm.postMessage(new SubscribeRequest(oid));
      }
docs: This is guaranteed to be invoked via the invoker and can safely do main thread type things
  like call back to the subscriber.