code: func (dm *DRWMutex) lockBlocking(timeout time.Duration, id, source string, isReadLock bool) (locked bool) {
  	doneCh, start := make(chan struct{}), time.Now().UTC()
  	defer close(doneCh)
  
  	// Use incremental back-off algorithm for repeated attempts to acquire the lock
  	for range newRetryTimerSimple(doneCh) {
  		// Create temp array on stack.
  		locks := make([]string, dm.clnt.dNodeCount)
  
  		// Try to acquire the lock.
  		success := lock(dm.clnt, &locks, dm.Name, id, source, isReadLock)
  		if success {
  			dm.m.Lock()
  			defer dm.m.Unlock()
  
  			// If success, copy array to object
  			if isReadLock {
  				// Append new array of strings at the end
  				dm.readersLocks = append(dm.readersLocks, make([]string, dm.clnt.dNodeCount))
  				// and copy stack array into last spot
  				copy(dm.readersLocks[len(dm.readersLocks)-1], locks[:])
  			} else {
  				copy(dm.writeLocks, locks[:])
  			}
  
  			return true
  		}
  		if time.Now().UTC().Sub(start) >= timeout { // Are we past the timeout?
  			break
  		}
  		// Failed to acquire the lock on this attempt, incrementally wait
  		// for a longer back-off time and try again afterwards.
  	}
  	return false
  }
docs: // lockBlocking will try to acquire either a read or a write lock
  //
  // The function will loop using a built-in timing randomized back-off
  // algorithm until either the lock is acquired successfully or more
  // time has elapsed than the timeout value.