syncbase/bridge/cgo: Two changes to the C API for handling callbacks
The first change is to switch the handle from 'int' to 'void*'. This
will help interfacing with language where is easier to pass a pointer
to a struct instead of explicitly managing the mapping to it. Both
Java and Swift manage memory in a way that makes is hard/impossible
to use pointers so the 'void*' will be used as a larger 'int'.
The second change is to use a single handle instead of two for both
watching and scanning. This makes the C API simpler and is more inline
with what the Java/Swift need to do (namely, keeping a struct that
describes both callbacks).
Note: the author of the Swift code is Aaron Zinman <aaron@azinman.com>.
MultiPart: 1/2
Change-Id: I6aa1f300a7d97aa1c9ef0f20b08cde7ac29cd5fa
diff --git a/services/syncbase/bridge/cgo/impl.go b/services/syncbase/bridge/cgo/impl.go
index 4617232..ffa8b7b 100644
--- a/services/syncbase/bridge/cgo/impl.go
+++ b/services/syncbase/bridge/cgo/impl.go
@@ -53,17 +53,17 @@
#include "lib.h"
static void CallDbWatchPatternsCallbacksOnChange(v23_syncbase_DbWatchPatternsCallbacks cbs, v23_syncbase_WatchChange wc) {
- cbs.onChange(cbs.hOnChange, wc);
+ cbs.onChange(cbs.handle, wc);
}
static void CallDbWatchPatternsCallbacksOnError(v23_syncbase_DbWatchPatternsCallbacks cbs, v23_syncbase_VError err) {
- cbs.onError(cbs.hOnChange, cbs.hOnError, err);
+ cbs.onError(cbs.handle, err);
}
static void CallCollectionScanCallbacksOnKeyValue(v23_syncbase_CollectionScanCallbacks cbs, v23_syncbase_KeyValue kv) {
- cbs.onKeyValue(cbs.hOnKeyValue, kv);
+ cbs.onKeyValue(cbs.handle, kv);
}
static void CallCollectionScanCallbacksOnDone(v23_syncbase_CollectionScanCallbacks cbs, v23_syncbase_VError err) {
- cbs.onDone(cbs.hOnKeyValue, cbs.hOnDone, err);
+ cbs.onDone(cbs.handle, err);
}
*/
import "C"
diff --git a/services/syncbase/bridge/cgo/lib.h b/services/syncbase/bridge/cgo/lib.h
index 64d849a..d216df6 100644
--- a/services/syncbase/bridge/cgo/lib.h
+++ b/services/syncbase/bridge/cgo/lib.h
@@ -131,25 +131,18 @@
////////////////////////////////////////
// Functions
-// Callbacks are represented as struct
-// {v23_syncbase_Handle, f(v23_syncbase_Handle, ...)} to allow for currying
-// RefMap handles to Swift closures.
-// https://forums.developer.apple.com/message/15725#15725
-
-typedef int v23_syncbase_Handle;
+typedef void* v23_syncbase_Handle;
typedef struct {
- v23_syncbase_Handle hOnChange;
- v23_syncbase_Handle hOnError;
- void (*onChange)(v23_syncbase_Handle hOnChange, v23_syncbase_WatchChange);
- void (*onError)(v23_syncbase_Handle hOnChange, v23_syncbase_Handle hOnError, v23_syncbase_VError);
+ v23_syncbase_Handle handle;
+ void (*onChange)(v23_syncbase_Handle handle, v23_syncbase_WatchChange);
+ void (*onError)(v23_syncbase_Handle handle, v23_syncbase_VError);
} v23_syncbase_DbWatchPatternsCallbacks;
typedef struct {
- v23_syncbase_Handle hOnKeyValue;
- v23_syncbase_Handle hOnDone;
- void (*onKeyValue)(v23_syncbase_Handle hOnKeyValue, v23_syncbase_KeyValue);
- void (*onDone)(v23_syncbase_Handle hOnKeyValue, v23_syncbase_Handle hOnDone, v23_syncbase_VError);
+ v23_syncbase_Handle handle;
+ void (*onKeyValue)(v23_syncbase_Handle handle, v23_syncbase_KeyValue);
+ void (*onDone)(v23_syncbase_Handle handle, v23_syncbase_VError);
} v23_syncbase_CollectionScanCallbacks;
#endif // V23_SYNCBASE_LIB_H_