code.vegaprotocol.io/vega@v0.79.0/datanode/networkhistory/snapshot/mutex/mutex_with_context.go (about)

     1  // Copyright (C) 2023 Gobalsky Labs Limited
     2  //
     3  // This program is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU Affero General Public License as
     5  // published by the Free Software Foundation, either version 3 of the
     6  // License, or (at your option) any later version.
     7  //
     8  // This program is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11  // GNU Affero General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU Affero General Public License
    14  // along with this program.  If not, see <http://www.gnu.org/licenses/>.
    15  
    16  package mutex
    17  
    18  import "context"
    19  
    20  // No decent library found for this, basically lock with context, all libs are overly complex or little used
    21  // Given this, this simple solution from here https://h12.io/article/go-pattern-context-aware-lock does the trick
    22  
    23  type CtxMutex interface {
    24  	Lock(ctx context.Context) bool
    25  	Unlock()
    26  }
    27  
    28  type ctxMutex struct {
    29  	ch chan struct{}
    30  }
    31  
    32  func New() CtxMutex {
    33  	return &ctxMutex{
    34  		ch: make(chan struct{}, 1),
    35  	}
    36  }
    37  
    38  func (mu *ctxMutex) Lock(ctx context.Context) bool {
    39  	select {
    40  	case <-ctx.Done():
    41  		return false
    42  	case mu.ch <- struct{}{}:
    43  		return true
    44  	}
    45  }
    46  
    47  func (mu *ctxMutex) Unlock() {
    48  	select {
    49  	case <-mu.ch:
    50  	default:
    51  	}
    52  }