code: protected void sendRequests() {
          if ( ! requestUnderway ) {
              requestUnderway = true;
              delayed( new Runnable() {
                  @Override
                  public void run() {
                      synchronized (requests) {
                          Object req[];
                          if ( openFutureRequests.get() > 0 && requests.size() == 0 ) {
                              req = new Object[] { "SP", lastSeenSeq };
                          } else {
                              req = new Object[requests.size() + 1];
                              for (int i = 0; i < requests.size(); i++) {
                                  req[i] = requests.get(i);
                              }
                              req[req.length - 1] = lastSeenSeq;
                              requests.clear();
                          }
  
                          sendCallArray(req).then(new Callback<Integer>() {
                              @Override
                              public void receive(Integer result, Object error) {
                                  synchronized (requests ) {
                                      requestUnderway = false;
                                      if ( requests.size() > 0 || (result != null && result > 0 && openFutureRequests.get() > 0 ) ) {
                                          myExec.execute(new Runnable() {
                                              @Override
                                              public void run() {
                                              sendRequests();
                                              }
                                          });
                                      }
                                  }
                              }
                          });
                      }
                  }
              }, 1);
          }
      }
docs: sends pending requests async. needs be executed inside lock (see calls of this)