shiny/driver/internal/event: factor out initalization boilerplate into a method

Change-Id: Ia89c7d9cb122dd33d29d6b443d16b895f021032f
Reviewed-on: https://go-review.googlesource.com/94136
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/shiny/driver/internal/event/event.go b/shiny/driver/internal/event/event.go
index 3a2b553..686a123 100644
--- a/shiny/driver/internal/event/event.go
+++ b/shiny/driver/internal/event/event.go
@@ -18,13 +18,17 @@
 	front []interface{} // LIFO.
 }
 
-// NextEvent implements the screen.EventDeque interface.
-func (q *Deque) NextEvent() interface{} {
+func (q *Deque) lockAndInit() {
 	q.mu.Lock()
-	defer q.mu.Unlock()
 	if q.cond.L == nil {
 		q.cond.L = &q.mu
 	}
+}
+
+// NextEvent implements the screen.EventDeque interface.
+func (q *Deque) NextEvent() interface{} {
+	q.lockAndInit()
+	defer q.mu.Unlock()
 
 	for {
 		if n := len(q.front); n > 0 {
@@ -47,11 +51,8 @@
 
 // Send implements the screen.EventDeque interface.
 func (q *Deque) Send(event interface{}) {
-	q.mu.Lock()
+	q.lockAndInit()
 	defer q.mu.Unlock()
-	if q.cond.L == nil {
-		q.cond.L = &q.mu
-	}
 
 	q.back = append(q.back, event)
 	q.cond.Signal()
@@ -59,11 +60,8 @@
 
 // SendFirst implements the screen.EventDeque interface.
 func (q *Deque) SendFirst(event interface{}) {
-	q.mu.Lock()
+	q.lockAndInit()
 	defer q.mu.Unlock()
-	if q.cond.L == nil {
-		q.cond.L = &q.mu
-	}
 
 	q.front = append(q.front, event)
 	q.cond.Signal()