diff options
author | Unknwon <u@gogs.io> | 2016-08-14 17:44:20 -0700 |
---|---|---|
committer | Unknwon <u@gogs.io> | 2016-08-14 23:52:24 -0700 |
commit | 660e7a178a9d72a03d13f704aca61726b4672232 (patch) | |
tree | 0668bcf438c586df14c204625b3829f5a4647267 /models | |
parent | 15845cb28763c1542556ad61d2aa9735541dbf45 (diff) | |
download | gitea-660e7a178a9d72a03d13f704aca61726b4672232.tar.gz gitea-660e7a178a9d72a03d13f704aca61726b4672232.zip |
modules/sync: move sync objects to independent module
Diffstat (limited to 'models')
-rw-r--r-- | models/repo.go | 61 | ||||
-rw-r--r-- | models/wiki.go | 7 | ||||
-rw-r--r-- | models/working_pool.go | 47 |
3 files changed, 15 insertions, 100 deletions
diff --git a/models/repo.go b/models/repo.go index 9e20b9fb25..22d211583e 100644 --- a/models/repo.go +++ b/models/repo.go @@ -19,7 +19,6 @@ import ( "regexp" "sort" "strings" - "sync" "time" "github.com/Unknwon/cae/zip" @@ -37,12 +36,15 @@ import ( "github.com/gogits/gogs/modules/markdown" "github.com/gogits/gogs/modules/process" "github.com/gogits/gogs/modules/setting" + "github.com/gogits/gogs/modules/sync" ) const ( _TPL_UPDATE_HOOK = "#!/usr/bin/env %s\n%s update $1 $2 $3 --config='%s'\n" ) +var repoWorkingPool = sync.NewSingleInstancePool() + var ( ErrRepoFileNotExist = errors.New("Repository file does not exist") ErrRepoFileNotLoaded = errors.New("Repository file not loaded") @@ -1706,40 +1708,8 @@ func RewriteRepositoryUpdateHook() error { }) } -// statusPool represents a pool of status with true/false. -type statusPool struct { - lock sync.RWMutex - pool map[string]bool -} - -// Start sets value of given name to true in the pool. -func (p *statusPool) Start(name string) { - p.lock.Lock() - defer p.lock.Unlock() - - p.pool[name] = true -} - -// Stop sets value of given name to false in the pool. -func (p *statusPool) Stop(name string) { - p.lock.Lock() - defer p.lock.Unlock() - - p.pool[name] = false -} - -// IsRunning checks if value of given name is set to true in the pool. -func (p *statusPool) IsRunning(name string) bool { - p.lock.RLock() - defer p.lock.RUnlock() - - return p.pool[name] -} - // Prevent duplicate running tasks. -var taskStatusPool = &statusPool{ - pool: make(map[string]bool), -} +var taskStatusTable = sync.NewStatusTable() const ( _MIRROR_UPDATE = "mirror_update" @@ -1749,11 +1719,11 @@ const ( // MirrorUpdate checks and updates mirror repositories. func MirrorUpdate() { - if taskStatusPool.IsRunning(_MIRROR_UPDATE) { + if taskStatusTable.IsRunning(_MIRROR_UPDATE) { return } - taskStatusPool.Start(_MIRROR_UPDATE) - defer taskStatusPool.Stop(_MIRROR_UPDATE) + taskStatusTable.Start(_MIRROR_UPDATE) + defer taskStatusTable.Stop(_MIRROR_UPDATE) log.Trace("Doing: MirrorUpdate") @@ -1813,11 +1783,11 @@ func MirrorUpdate() { // GitFsck calls 'git fsck' to check repository health. func GitFsck() { - if taskStatusPool.IsRunning(_GIT_FSCK) { + if taskStatusTable.IsRunning(_GIT_FSCK) { return } - taskStatusPool.Start(_GIT_FSCK) - defer taskStatusPool.Stop(_GIT_FSCK) + taskStatusTable.Start(_GIT_FSCK) + defer taskStatusTable.Stop(_GIT_FSCK) log.Trace("Doing: GitFsck") @@ -1879,11 +1849,11 @@ func repoStatsCheck(checker *repoChecker) { } func CheckRepoStats() { - if taskStatusPool.IsRunning(_CHECK_REPOs) { + if taskStatusTable.IsRunning(_CHECK_REPOs) { return } - taskStatusPool.Start(_CHECK_REPOs) - defer taskStatusPool.Stop(_CHECK_REPOs) + taskStatusTable.Start(_CHECK_REPOs) + defer taskStatusTable.Stop(_CHECK_REPOs) log.Trace("Doing: CheckRepoStats") @@ -2275,11 +2245,6 @@ func (repo *Repository) GetForks() ([]*Repository, error) { // /_______ /\____ | |__||__| \___ / |__|____/\___ > // \/ \/ \/ \/ -var repoWorkingPool = &workingPool{ - pool: make(map[string]*sync.Mutex), - count: make(map[string]int), -} - func (repo *Repository) LocalRepoPath() string { return path.Join(setting.AppDataPath, "tmp/local-repo", com.ToStr(repo.ID)) } diff --git a/models/wiki.go b/models/wiki.go index 89e9fdaa39..7a286f4ba3 100644 --- a/models/wiki.go +++ b/models/wiki.go @@ -12,19 +12,16 @@ import ( "path" "path/filepath" "strings" - "sync" "github.com/Unknwon/com" "github.com/gogits/git-module" "github.com/gogits/gogs/modules/setting" + "github.com/gogits/gogs/modules/sync" ) -var wikiWorkingPool = &workingPool{ - pool: make(map[string]*sync.Mutex), - count: make(map[string]int), -} +var wikiWorkingPool = sync.NewSingleInstancePool() // ToWikiPageURL formats a string to corresponding wiki URL name. func ToWikiPageURL(name string) string { diff --git a/models/working_pool.go b/models/working_pool.go deleted file mode 100644 index c522de56a0..0000000000 --- a/models/working_pool.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2015 The Gogs Authors. All rights reserved. -// Use of this source code is governed by a MIT-style -// license that can be found in the LICENSE file. - -package models - -import ( - "sync" -) - -// workingPool represents a pool of working status which makes sure -// that only one instance of same task is performing at a time. -// However, different type of tasks can performing at the same time. -type workingPool struct { - lock sync.Mutex - pool map[string]*sync.Mutex - count map[string]int -} - -// CheckIn checks in a task and waits if others are running. -func (p *workingPool) CheckIn(name string) { - p.lock.Lock() - - lock, has := p.pool[name] - if !has { - lock = &sync.Mutex{} - p.pool[name] = lock - } - p.count[name]++ - - p.lock.Unlock() - lock.Lock() -} - -// CheckOut checks out a task to let other tasks run. -func (p *workingPool) CheckOut(name string) { - p.lock.Lock() - defer p.lock.Unlock() - - p.pool[name].Unlock() - if p.count[name] == 1 { - delete(p.pool, name) - delete(p.count, name) - } else { - p.count[name]-- - } -} |