diff options
author | mattn <mattn.jp@gmail.com> | 2018-02-18 22:15:52 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-18 22:15:52 +0900 |
commit | 696e2e43cb00dcb1acaf6073e01493e3c4197b75 (patch) | |
tree | 3369b9580bfa88295f4f050704dff2716818f4ef | |
parent | Merge pull request #534 from basvanbeek/master (diff) | |
parent | Don't spawn interrupt goroutine if we know that context cannot be canceled (diff) | |
download | golite-696e2e43cb00dcb1acaf6073e01493e3c4197b75.tar.gz golite-696e2e43cb00dcb1acaf6073e01493e3c4197b75.tar.xz |
Merge pull request #530 from navytux/y/no-go-if-notneeded
Don't spawn interrupt goroutine if we know that context cannot be canceled
-rw-r--r-- | sqlite3.go | 42 |
1 files changed, 23 insertions, 19 deletions
@@ -1124,18 +1124,20 @@ func (s *SQLiteStmt) query(ctx context.Context, args []namedValue) (driver.Rows, done: make(chan struct{}), } - go func(db *C.sqlite3) { - select { - case <-ctx.Done(): + if ctxdone := ctx.Done(); ctxdone != nil { + go func(db *C.sqlite3) { select { + case <-ctxdone: + select { + case <-rows.done: + default: + C.sqlite3_interrupt(db) + rows.Close() + } case <-rows.done: - default: - C.sqlite3_interrupt(db) - rows.Close() } - case <-rows.done: - } - }(s.c.db) + }(s.c.db) + } return rows, nil } @@ -1169,19 +1171,21 @@ func (s *SQLiteStmt) exec(ctx context.Context, args []namedValue) (driver.Result return nil, err } - done := make(chan struct{}) - defer close(done) - go func(db *C.sqlite3) { - select { - case <-done: - case <-ctx.Done(): + if ctxdone := ctx.Done(); ctxdone != nil { + done := make(chan struct{}) + defer close(done) + go func(db *C.sqlite3) { select { case <-done: - default: - C.sqlite3_interrupt(db) + case <-ctxdone: + select { + case <-done: + default: + C.sqlite3_interrupt(db) + } } - } - }(s.c.db) + }(s.c.db) + } var rowid, changes C.longlong rv := C._sqlite3_step(s.s, &rowid, &changes) |