From 736dfbd2cf61eff49db1e27fcfb6039bcd21fd89 Mon Sep 17 00:00:00 2001 From: Radu Ioan Fericean Date: Mon, 9 Jul 2012 19:56:19 +0300 Subject: [PATCH] used mutex for account locking --- timespans/accountlock.go | 7 ++++++ timespans/accountlock_test.go | 47 +++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 timespans/accountlock_test.go diff --git a/timespans/accountlock.go b/timespans/accountlock.go index 76757a000..43aa0a7b9 100644 --- a/timespans/accountlock.go +++ b/timespans/accountlock.go @@ -18,6 +18,10 @@ along with this program. If not, see package timespans +import ( + "sync" +) + var AccLock *AccountLock func init() { @@ -26,6 +30,7 @@ func init() { type AccountLock struct { queue map[string]chan bool + sync.Mutex } func NewAccountLock() *AccountLock { @@ -33,11 +38,13 @@ func NewAccountLock() *AccountLock { } func (cm *AccountLock) GuardGetCost(name string, handler func() (*CallCost, error)) (reply *CallCost, err error) { + cm.Lock() lock, exists := AccLock.queue[name] if !exists { lock = make(chan bool, 1) AccLock.queue[name] = lock } + cm.Unlock() lock <- true reply, err = handler() <-lock diff --git a/timespans/accountlock_test.go b/timespans/accountlock_test.go new file mode 100644 index 000000000..69100a1ab --- /dev/null +++ b/timespans/accountlock_test.go @@ -0,0 +1,47 @@ +/* +Rating system designed to be used in VoIP Carriers World +Copyright (C) 2012 Radu Ioan Fericean + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +package timespans + +import ( + "testing" + "time" + "log" +) + +func TestAccountLock(t *testing.T) { + go AccLock.Guard("1", func() (float64, error) { + log.Print("first 1") + time.Sleep(1 * time.Second) + log.Print("end first 1") + return 0, nil + }) + go AccLock.Guard("2", func() (float64, error) { + log.Print("first 2") + time.Sleep(1 * time.Second) + log.Print("end first 2") + return 0, nil + }) + go AccLock.Guard("1", func() (float64, error) { + log.Print("second 1") + time.Sleep(1 * time.Second) + log.Print("end second 1") + return 0, nil + }) + time.Sleep(3 * time.Second) +}