diff options
| author | Pietro Gagliardi <[email protected]> | 2014-08-11 19:38:21 -0400 |
|---|---|---|
| committer | Pietro Gagliardi <[email protected]> | 2014-08-11 19:38:21 -0400 |
| commit | 166eaeb7db48232cfac460d8d6d8d8476e7a8664 (patch) | |
| tree | aa9c3afc6574d0fa7fccd9216ad50e70224dcf6e | |
| parent | 67adbd43a1bbf35fdc3963b34ae5631758006fee (diff) | |
Revert "Revert "Settled race condition TODOs across all platforms... as an unfortunate case :(""
Put this back on master so we can debug.
This reverts commit 67adbd43a1bbf35fdc3963b34ae5631758006fee.
| -rw-r--r-- | redo/table_darwin.go | 14 | ||||
| -rw-r--r-- | redo/table_unix.go | 18 | ||||
| -rw-r--r-- | redo/table_windows.go | 14 |
3 files changed, 29 insertions, 17 deletions
diff --git a/redo/table_darwin.go b/redo/table_darwin.go index c80dbdc..95344c1 100644 --- a/redo/table_darwin.go +++ b/redo/table_darwin.go @@ -36,11 +36,15 @@ func finishNewTable(b *tablebase, ty reflect.Type) Table { func (t *table) Unlock() { t.unlock() - // TODO RACE CONDITION HERE - // not sure about this one... - t.RLock() - defer t.RUnlock() - C.tableUpdate(t._id) + // there's a possibility that user actions can happen at this point, before the view is updated + // alas, this is something we have to deal with, because Unlock() can be called from any thread + go func() { + Do(func() { + t.RLock() + defer t.RUnlock() + C.tableUpdate(t._id) + }) + }() } //export goTableDataSource_getValue diff --git a/redo/table_unix.go b/redo/table_unix.go index 611beae..d618663 100644 --- a/redo/table_unix.go +++ b/redo/table_unix.go @@ -58,13 +58,17 @@ func (t *table) Lock() { func (t *table) Unlock() { t.unlock() - // TODO RACE CONDITION HERE - // not sure about this one... - t.RLock() - defer t.RUnlock() - d := reflect.Indirect(reflect.ValueOf(t.data)) - new := C.gint(d.Len()) - C.tableUpdate(t.model, t.old, new) + // there's a possibility that user actions can happen at this point, before the view is updated + // alas, this is something we have to deal with, because Unlock() can be called from any thread + go func() { + Do(func() { + t.RLock() + defer t.RUnlock() + d := reflect.Indirect(reflect.ValueOf(t.data)) + new := C.gint(d.Len()) + C.tableUpdate(t.model, t.old, new) + }) + }() } //export goTableModel_get_n_columns diff --git a/redo/table_windows.go b/redo/table_windows.go index 576ae4a..be9427e 100644 --- a/redo/table_windows.go +++ b/redo/table_windows.go @@ -38,11 +38,15 @@ func finishNewTable(b *tablebase, ty reflect.Type) Table { func (t *table) Unlock() { t.unlock() - // TODO RACE CONDITION HERE - // I think there's a way to set the item count without causing a refetch of data that works around this... - t.RLock() - defer t.RUnlock() - C.tableUpdate(t._hwnd, C.int(reflect.Indirect(reflect.ValueOf(t.data)).Len())) + // there's a possibility that user actions can happen at this point, before the view is updated + // alas, this is something we have to deal with, because Unlock() can be called from any thread + go func() { + Do(func() { + t.RLock() + defer t.RUnlock() + C.tableUpdate(t._hwnd, C.int(reflect.Indirect(reflect.ValueOf(t.data)).Len())) + }) + }() } //export tableGetCellText |
