...

Text file src/golang.conradwood.net/go-easyops/utils/timeout_lock.go~

Documentation: golang.conradwood.net/go-easyops/utils

     1package client
     2
     3import (
     4	"fmt"
     5	"time"
     6
     7	"golang.conradwood.net/go-easyops/utils"
     8)
     9
    10type TimeoutLock interface {
    11	Unlock()
    12	Lock()
    13	LockWithTimeout(time.Duration) bool // true if lock was acquired
    14}
    15
    16type timeoutlock struct {
    17	ch       chan bool
    18	name     string
    19	lockedat string
    20}
    21
    22func NewTimeoutLock(name string) TimeoutLock {
    23	tl := &timeoutlock{
    24		name: name,
    25		ch:   make(chan bool, 1),
    26	}
    27	return tl
    28}
    29
    30func (tl *timeoutlock) Lock() {
    31	tl.ch <- true
    32	tl.lockedat = utils.GetStack("lock %s", tl.name)
    33}
    34func (tl *timeoutlock) LockWithTimeout(t time.Duration) bool {
    35	select {
    36	case tl.ch <- true:
    37		tl.lockedat = utils.GetStack("lock %s", tl.name)
    38		return true
    39	case <-time.After(t):
    40		utils.PrintStack("[go-easyops] lock \"%s\" timeout", tl.name)
    41		fmt.Printf("lock \"%s\" was locked at: %s\n", tl.name, tl.lockedat)
    42		return false
    43	}
    44
    45}
    46func (tl *timeoutlock) Unlock() {
    47	select {
    48	case <-tl.ch:
    49		//
    50	default:
    51		// nothing to unlock
    52		fmt.Printf("[go-easyops] timeoutlock \"%s\" unlocked but was not locked previously\n", tl.name)
    53		utils.PrintStack("[go-easyops]")
    54	}
    55}

View as plain text