Skip to content

Commit 7e8272b

Browse files
Add support for go statement and create_task statements
1 parent 5f12126 commit 7e8272b

31 files changed

Lines changed: 1169 additions & 294 deletions

.vscode/settings.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"dbmate",
1515
"dburl",
1616
"Dcomplex",
17+
"DECREF",
1718
"deepslate",
1819
"denorm",
1920
"deser",
@@ -99,7 +100,8 @@
99100
"uvcli",
100101
"varsser",
101102
"venv",
102-
"vmihailenco"
103+
"vmihailenco",
104+
"XDECREF"
103105
],
104106
"python.defaultInterpreterPath": "./.venv/bin/python",
105107
"python.terminal.activateEnvironment": false,

pkg/exports.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,21 @@ func Goto(line int, name string) GotoBlock { return runtime.Goto(line, name) }
5252
func Impure(line int, stmt func(Context)) AwaitBlock {
5353
return runtime.Impure(line, stmt)
5454
}
55-
func Program(body Block, source string) ProgramBlock {
56-
return runtime.Program(body, source)
55+
func SubProgram(
56+
line int, program string, argsFn func(Context) map[string]any,
57+
) AwaitBlock {
58+
return runtime.SubProgram(line, program, argsFn)
59+
}
60+
func Program(body Block, source string, name string) ProgramBlock {
61+
return runtime.Program(body, source, name)
5762
}
5863

5964
/* -=[ Worker Pool ]=- */
6065

6166
func SpawnWorkers(
6267
parallelism uint,
6368
platform platforms.Platform,
64-
transpiled map[string]ProgramBlock,
69+
transpiled []ProgramBlock,
6570
) (
6671
func(string, string, map[string]any) (uint, bool, error),
6772
func(string, string) (any, error),

pkg/libdpsl/libdpsl.go

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,33 @@ static int call_import_metadata_func(
1616
) {
1717
return fn(opaque, func_name, result, result_len);
1818
}
19+
20+
typedef int (*fork_fn_func)(
21+
void* opaque,
22+
char* name,
23+
char* program,
24+
char* args_data,
25+
int args_len,
26+
uint64_t txn_id,
27+
char** err_out
28+
);
29+
30+
__attribute__((unused))
31+
static int call_fork_fn_func(
32+
fork_fn_func fn,
33+
void* opaque,
34+
char* name,
35+
char* program,
36+
char* args_data,
37+
int args_len,
38+
uint64_t txn_id,
39+
char** err_out
40+
) {
41+
return fn(
42+
opaque, name, program,
43+
args_data, args_len, txn_id, err_out
44+
);
45+
}
1946
*/
2047
import "C"
2148

@@ -151,6 +178,8 @@ type listenHandle struct {
151178
func DSPlatformListen(
152179
platformHandle C.uint64_t,
153180
parallelism C.uint64_t,
181+
forkFn C.fork_fn_func,
182+
forkFnOpaque unsafe.Pointer,
154183
listenHandleOut *C.uint64_t,
155184
errOut **C.char,
156185
) C.int {
@@ -162,7 +191,9 @@ func DSPlatformListen(
162191

163192
shutdownCtx, shutdown := context.WithCancel(context.Background())
164193

165-
ch, err := platform.Listen(uint(parallelism), shutdownCtx)
194+
ch, err := platform.Listen(
195+
uint(parallelism), goForkFn(forkFn, forkFnOpaque), shutdownCtx,
196+
)
166197
if err != nil {
167198
shutdown()
168199
setError(errOut, err)
@@ -218,6 +249,7 @@ func DSPlatformSpawn(
218249
allocID C.uint64_t,
219250
contextBytes *C.char,
220251
contextLen C.int,
252+
txnID *C.uint64_t,
221253
idOut *C.uint64_t,
222254
existsOut *C.int,
223255
errOut **C.char,
@@ -248,6 +280,15 @@ func DSPlatformSpawn(
248280
isolateErr = &FFIWorkerError{Message: errMsgStr}
249281
}
250282

283+
var txn any
284+
if txnID != nil {
285+
txn, ok = getHandle[any](uint64(*txnID))
286+
if !ok {
287+
setError(errOut, nil)
288+
return 0
289+
}
290+
}
291+
251292
id, exists, err := platform.Spawn(
252293
int(pc),
253294
int(line),
@@ -260,6 +301,7 @@ func DSPlatformSpawn(
260301
C.GoString(lang),
261302
uint(allocID),
262303
ctx,
304+
txn,
263305
)
264306
if err != nil {
265307
setError(errOut, err)
@@ -581,4 +623,47 @@ func goMetadataFunc(
581623
}
582624
}
583625

626+
func goForkFn(
627+
forkFnC C.fork_fn_func,
628+
forkFnOpaque unsafe.Pointer,
629+
) func(string, string, []byte, any) error {
630+
return func(
631+
name string, program string,
632+
args []byte, txn any,
633+
) error {
634+
cName := C.CString(name)
635+
defer C.free(unsafe.Pointer(cName))
636+
637+
cProgram := C.CString(program)
638+
defer C.free(unsafe.Pointer(cProgram))
639+
640+
var argsData *C.char
641+
var argsLen C.int
642+
if len(args) > 0 {
643+
argsData = (*C.char)(C.CBytes(args))
644+
defer C.free(unsafe.Pointer(argsData))
645+
argsLen = C.int(len(args))
646+
}
647+
648+
var txnID C.uint64_t
649+
if txn != nil {
650+
txnID = C.uint64_t(storeHandle(txn))
651+
defer deleteHandle(uint64(txnID))
652+
}
653+
654+
var cErr *C.char
655+
ok := C.call_fork_fn_func(
656+
forkFnC, forkFnOpaque, cName, cProgram, argsData, argsLen, txnID, &cErr,
657+
)
658+
if ok == 0 {
659+
errStr := C.GoString(cErr)
660+
C.free(unsafe.Pointer(cErr))
661+
662+
return &FFIWorkerError{Message: errStr}
663+
}
664+
665+
return nil
666+
}
667+
}
668+
584669
func main() {}

pkg/libdpsl/libdpsl.h

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,33 @@ static int call_import_metadata_func(
3939
return fn(opaque, func_name, result, result_len);
4040
}
4141

42+
typedef int (*fork_fn_func)(
43+
void* opaque,
44+
char* name,
45+
char* program,
46+
char* args_data,
47+
int args_len,
48+
uint64_t txn_id,
49+
char** err_out
50+
);
51+
52+
__attribute__((unused))
53+
static int call_fork_fn_func(
54+
fork_fn_func fn,
55+
void* opaque,
56+
char* name,
57+
char* program,
58+
char* args_data,
59+
int args_len,
60+
uint64_t txn_id,
61+
char** err_out
62+
) {
63+
return fn(
64+
opaque, name, program,
65+
args_data, args_len, txn_id, err_out
66+
);
67+
}
68+
4269
#line 1 "cgo-generated-wrapper"
4370

4471

@@ -105,9 +132,9 @@ extern int DSTranspilePython(char* source, import_metadata_func metadataFunc, vo
105132
extern int DSTranspileGo(char* source, char* dir, char** result, char** errOut);
106133
extern int DSNewPostgres(uint64_t id, char* dburl, char* addr, uint64_t interval, uint64_t timerRes, uint64_t limit, uint64_t* handle, char** errOut);
107134
extern int DSSpawnInspector(uint64_t platformHandle, char* addr, uint64_t* shutdownHandle, char** errOut);
108-
extern int DSPlatformListen(uint64_t platformHandle, uint64_t parallelism, uint64_t* listenHandleOut, char** errOut);
135+
extern int DSPlatformListen(uint64_t platformHandle, uint64_t parallelism, fork_fn_func forkFn, void* forkFnOpaque, uint64_t* listenHandleOut, char** errOut);
109136
extern int DSPlatformAllocate(uint64_t platformHandle, uint64_t* allocID, char** errOut);
110-
extern int DSPlatformSpawn(uint64_t platformHandle, int pc, int line, int tick, char* eventsBytes, int eventsLen, char* errMsg, char* name, char* program, char* source, char* lang, uint64_t allocID, char* contextBytes, int contextLen, uint64_t* idOut, int* existsOut, char** errOut);
137+
extern int DSPlatformSpawn(uint64_t platformHandle, int pc, int line, int tick, char* eventsBytes, int eventsLen, char* errMsg, char* name, char* program, char* source, char* lang, uint64_t allocID, char* contextBytes, int contextLen, uint64_t* txnID, uint64_t* idOut, int* existsOut, char** errOut);
111138
extern int DSPlatformUpdate(uint64_t platformHandle, char* notificationBytes, int notificationLen, uint64_t isolateID, int currTick, int pc, int line, int nextTick, char* eventsBytes, int eventsLen, char* errMsg, char* source, char* contextBytes, int contextLen, uint64_t* txnOut, char** errOut);
112139
extern int DSPlatformGetVar(uint64_t platformHandle, char* name, char* varName, char** resultOut, int* resultLen, char** errOut);
113140
extern int DSPlatformGetTrace(uint64_t platformHandle, char* name, char** resultOut, int* resultLen, char** errOut);

pkg/platforms/interface.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,18 @@ type CheckpointEvent struct {
101101
Id string `json:"id"`
102102
}
103103

104+
type SpawnEvent struct {
105+
Id string `json:"id"`
106+
Program string `json:"program"`
107+
Name string `json:"name"`
108+
Args []byte `json:"args"`
109+
}
110+
104111
func (e HttpRequestEvent) Key() string { return e.Url }
105112
func (e HttpListenEvent) Key() string { return e.Url }
106113
func (e TimerEvent) Key() string { return e.Id }
107114
func (e CheckpointEvent) Key() string { return e.Id }
115+
func (e SpawnEvent) Key() string { return e.Id }
108116

109117
type EventNotify interface {
110118
Target() uint
@@ -131,16 +139,25 @@ type CheckpointEventNotify struct {
131139
Id string
132140
Err string
133141
}
142+
type SpawnEventNotify struct {
143+
Targ uint
144+
Idx uint
145+
Id string
146+
Err string
147+
}
134148

135149
func (e HttpListenEventNotify) Target() uint { return e.Targ }
136150
func (e TimerEventNotify) Target() uint { return e.Targ }
137151
func (e CheckpointEventNotify) Target() uint { return e.Targ }
152+
func (e SpawnEventNotify) Target() uint { return e.Targ }
138153
func (e HttpListenEventNotify) Index() uint { return e.Idx }
139154
func (e TimerEventNotify) Index() uint { return e.Idx }
140155
func (e CheckpointEventNotify) Index() uint { return e.Idx }
156+
func (e SpawnEventNotify) Index() uint { return e.Idx }
141157
func (e HttpListenEventNotify) Key() string { return e.Url }
142158
func (e TimerEventNotify) Key() string { return e.Id }
143159
func (e CheckpointEventNotify) Key() string { return e.Id }
160+
func (e SpawnEventNotify) Key() string { return e.Id }
144161

145162
type Trace struct {
146163
ID uint `db:"id"`
@@ -217,6 +234,7 @@ type Platform interface {
217234
lang string,
218235
allocid uint,
219236
ctx Context,
237+
txn any,
220238
) (uint, bool, error)
221239
Update(
222240
notification PlatformNotification,
@@ -232,6 +250,7 @@ type Platform interface {
232250
GetTrace(name string) ([]Trace, error)
233251
Listen(
234252
parallelism uint,
253+
forkFn func(name string, program string, args []byte, txn any) error,
235254
shutdownCtx context.Context,
236255
) (chan PlatformNotification, error)
237256
InspectorVersion() (string, string)

0 commit comments

Comments
 (0)