summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--courses.go11
-rw-r--r--wsm.go28
2 files changed, 15 insertions, 24 deletions
diff --git a/courses.go b/courses.go
index e38e2dc..454ee1c 100644
--- a/courses.go
+++ b/courses.go
@@ -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))
+}
diff --git a/wsm.go b/wsm.go
index 50527c0..b0c1c7b 100644
--- a/wsm.go
+++ b/wsm.go
@@ -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")