diff options
Diffstat (limited to '')
-rw-r--r-- | courses.go | 10 | ||||
-rw-r--r-- | sem.go | 10 | ||||
-rw-r--r-- | ws.go | 18 | ||||
-rw-r--r-- | wsm.go | 2 |
4 files changed, 24 insertions, 16 deletions
@@ -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 { @@ -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 -} @@ -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 @@ -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() |