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)
+}