code: func (s *FileStorage) TryLock(name string) (Waiter, error) {
  	s.nameLocksMu.Lock()
  	defer s.nameLocksMu.Unlock()
  	wg, ok := s.nameLocks[name]
  	if ok {
  		// lock already obtained, let caller wait on it
  		return wg, nil
  	}
  	// caller gets lock
  	wg = new(sync.WaitGroup)
  	wg.Add(1)
  	s.nameLocks[name] = wg
  	return nil, nil
  }
docs: // TryLock attempts to get a lock for name, otherwise it returns
  // a Waiter value to wait until the other process is finished.