code: @Override
      public CauseOfBlockage getCauseOfBlockage() {
          // Block builds until they are done with post-production
          if (!isConcurrentBuild() && isLogUpdated()) {
              final R lastBuild = getLastBuild();
              if (lastBuild != null) {
                  return new BlockedBecauseOfBuildInProgress(lastBuild);
              } else {
                  // The build has been likely deleted after the isLogUpdated() call.
                  // Another cause may be an API implementation glitсh in the implementation for AbstractProject. 
                  // Anyway, we should let the code go then.
                  LOGGER.log(Level.FINE, "The last build has been deleted during the non-concurrent cause creation. The build is not blocked anymore");
              }
          }
          if (blockBuildWhenDownstreamBuilding()) {
              AbstractProject<?,?> bup = getBuildingDownstream();
              if (bup!=null)
                  return new BecauseOfDownstreamBuildInProgress(bup);
          }
          if (blockBuildWhenUpstreamBuilding()) {
              AbstractProject<?,?> bup = getBuildingUpstream();
              if (bup!=null)
                  return new BecauseOfUpstreamBuildInProgress(bup);
          }
          return null;
      }
docs: {@inheritDoc}
  
  <p>
  A project must be blocked if its own previous build is in progress,
  or if the blockBuildWhenUpstreamBuilding option is true and an upstream
  project is building, but derived classes can also check other conditions.