summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--courses.go10
-rw-r--r--sem.go10
-rw-r--r--ws.go18
-rw-r--r--wsm.go2
4 files changed, 24 insertions, 16 deletions
diff --git a/courses.go b/courses.go
index 815c85b..d501368 100644
--- a/courses.go
+++ b/courses.go
@@ -225,10 +225,12 @@ func getCourseGroupFromCourseID(ctx context.Context, courseID int) (courseGroupT
}
func (course *courseT) decrementSelectedAndPropagate() {
- course.SelectedLock.Lock()
- defer course.SelectedLock.Unlock()
- course.Selected--
- propagateIgnoreFailures(fmt.Sprintf("M %d %d", course.ID, course.Selected))
+ func() {
+ course.SelectedLock.Lock()
+ defer course.SelectedLock.Unlock()
+ course.Selected--
+ }()
+ propagateSelectedUpdate(course.ID)
}
func getCourseByID(courseID int) *courseT {
diff --git a/sem.go b/sem.go
index c587e61..0b839a4 100644
--- a/sem.go
+++ b/sem.go
@@ -21,20 +21,16 @@
package main
type usemT struct {
- _ch (chan struct{})
+ ch (chan struct{})
}
func (s *usemT) init() {
- s._ch = make(chan struct{}, 1)
+ s.ch = make(chan struct{}, 1)
}
func (s *usemT) set() {
select {
- case s._ch <- struct{}{}:
+ case s.ch <- struct{}{}:
default:
}
}
-
-func (s *usemT) ch() (<- chan struct{}) {
- return s._ch
-}
diff --git a/ws.go b/ws.go
index 7966560..89701df 100644
--- a/ws.go
+++ b/ws.go
@@ -294,6 +294,15 @@ func propagateIgnoreFailures(msg string) {
}
}
+func propagateSelectedUpdate(courseID int) {
+ course := courses[courseID]
+ course.UsemsLock.RLock()
+ defer course.UsemsLock.RUnlock()
+ for _, usem := range course.Usems {
+ usem.set()
+ }
+}
+
/*
* The actual logic in handling the connection, after authentication has been
* completed.
@@ -352,13 +361,14 @@ func handleConn(
coursesLock.RLock()
defer coursesLock.RUnlock()
for courseID, course := range courses {
- var usem usemT
+ usem := &usemT{}
+ usem.init()
func() {
course.UsemsLock.Lock()
defer course.UsemsLock.Unlock()
- course.Usems[userID] = &usem
+ course.Usems[userID] = usem
}()
- usems[courseID] = &usem
+ usems[courseID] = usem
}
}()
defer func() {
@@ -380,7 +390,7 @@ func handleConn(
select {
case <-newCtx.Done():
return
- case <-usem.ch():
+ case <-usem.ch:
select {
case <-newCtx.Done():
return
diff --git a/wsm.go b/wsm.go
index ee3bc69..0cf8809 100644
--- a/wsm.go
+++ b/wsm.go
@@ -119,13 +119,13 @@ func messageChooseCourse(ctx context.Context, c *websocket.Conn, reportError rep
defer course.SelectedLock.Unlock()
if course.Selected < course.Max {
course.Selected++
- go propagateIgnoreFailures(fmt.Sprintf("M %d %d", courseID, course.Selected))
return true
}
return false
}()
if ok {
+ go propagateSelectedUpdate(courseID)
err := tx.Commit(ctx)
if err != nil {
go course.decrementSelectedAndPropagate()