diff options
-rw-r--r-- | courses.go | 11 | ||||
-rw-r--r-- | wsm.go | 28 |
2 files changed, 15 insertions, 24 deletions
@@ -34,6 +34,10 @@ type ( type courseT struct { ID int + /* + * TODO: There will be a lot of lock contention over Selected. It is + * probably more appropriate to directly use atomics. + */ Selected int SelectedLock sync.RWMutex Max int @@ -210,3 +214,10 @@ func getCourseGroupFromCourseID(ctx context.Context, courseID int) (courseGroupT } return ret, nil } + +func (course *courseT) decrementSelectedAndPropagate() { + course.SelectedLock.Lock() + defer course.SelectedLock.Unlock() + course.Selected-- + propagateIgnoreFailures(fmt.Sprintf("M %d %d", course.ID, course.Selected)) +} @@ -132,31 +132,16 @@ func messageChooseCourse(ctx context.Context, c *websocket.Conn, reportError rep if ok { err := tx.Commit(ctx) if err != nil { - go func() { /* Separate goroutine because we don't need a response from this operation */ - course.SelectedLock.Lock() - defer course.SelectedLock.Unlock() - course.Selected-- - propagateIgnoreFailures(fmt.Sprintf("M %d %d", courseID, course.Selected)) - }() + go course.decrementSelectedAndPropagate() return reportError("Database error while committing transaction") } thisCourseGroup, err := getCourseGroupFromCourseID(ctx, courseID) if err != nil { - go func() { /* Duplicate code, could turn into function */ - course.SelectedLock.Lock() - defer course.SelectedLock.Unlock() - course.Selected-- - propagateIgnoreFailures(fmt.Sprintf("M %d %d", courseID, course.Selected)) - }() + go course.decrementSelectedAndPropagate() return reportError("Database error while committing transaction") } if (*userCourseGroups)[thisCourseGroup] { - go func() { /* Duplicate code, could turn into function */ - course.SelectedLock.Lock() - defer course.SelectedLock.Unlock() - course.Selected-- - propagateIgnoreFailures(fmt.Sprintf("M %d %d", courseID, course.Selected)) - }() + go course.decrementSelectedAndPropagate() return reportError("inconsistent user course groups") } (*userCourseGroups)[thisCourseGroup] = true @@ -216,12 +201,7 @@ func messageUnchooseCourse(ctx context.Context, c *websocket.Conn, reportError r } if ct.RowsAffected() != 0 { - go func() { /* Separate goroutine because we don't need a response from this operation */ - course.SelectedLock.Lock() - defer course.SelectedLock.Unlock() - course.Selected-- - propagateIgnoreFailures(fmt.Sprintf("M %d %d", courseID, course.Selected)) - }() + go course.decrementSelectedAndPropagate() thisCourseGroup, err := getCourseGroupFromCourseID(ctx, courseID) if err != nil { return reportError("error unsetting course group flag") |