@@ -37,6 +37,8 @@ type Server struct {
37
37
inShutdown atomic.Bool
38
38
idleHandle libuv.Idle
39
39
40
+ executor * hyper.Executor
41
+
40
42
mu sync.Mutex
41
43
activeConnections map [* conn ]struct {}
42
44
}
@@ -51,9 +53,7 @@ type conn struct {
51
53
http2Opts * hyper.Http2ServerconnOptions
52
54
isClosing atomic.Bool
53
55
closedHandles int32
54
- executor * hyper.Executor
55
56
remoteAddr string
56
- requestBody * requestBody
57
57
asyncHandle * libuv.Async
58
58
}
59
59
@@ -225,7 +225,7 @@ func onNewConnection(serverStream *libuv.Stream, status c.Int) {
225
225
(* libuv .Handle )(unsafe .Pointer (& conn .stream )).Close (nil )
226
226
return
227
227
}
228
- conn .executor = executor
228
+ srv .executor = executor
229
229
230
230
fmt .Println ("[debug] Conn created" )
231
231
srv .trackConn (conn , true )
@@ -236,7 +236,7 @@ func onNewConnection(serverStream *libuv.Stream, status c.Int) {
236
236
io := createIo (conn )
237
237
service := hyper .ServiceNew (serverCallback )
238
238
service .SetUserdata (unsafe .Pointer (userdata ), nil )
239
- http1Opts := hyper .Http1ServerconnOptionsNew (conn .executor )
239
+ http1Opts := hyper .Http1ServerconnOptionsNew (srv .executor )
240
240
if http1Opts == nil {
241
241
fmt .Fprintf (os .Stderr , "Failed to create http1_opts\n " )
242
242
os .Exit (1 )
@@ -248,7 +248,7 @@ func onNewConnection(serverStream *libuv.Stream, status c.Int) {
248
248
}
249
249
conn .http1Opts = http1Opts
250
250
251
- http2Opts := hyper .Http2ServerconnOptionsNew (conn .executor )
251
+ http2Opts := hyper .Http2ServerconnOptionsNew (srv .executor )
252
252
if http2Opts == nil {
253
253
fmt .Fprintf (os .Stderr , "Failed to create http2_opts\n " )
254
254
os .Exit (1 )
@@ -266,7 +266,7 @@ func onNewConnection(serverStream *libuv.Stream, status c.Int) {
266
266
conn .http2Opts = http2Opts
267
267
268
268
serverconn := hyper .ServeHttpXConnection (http1Opts , http2Opts , io , service )
269
- conn .executor .Push (serverconn )
269
+ srv .executor .Push (serverconn )
270
270
} else {
271
271
fmt .Println ("[debug] Client not accepted" )
272
272
(* libuv .Handle )(unsafe .Pointer (& conn .pollHandle )).Close (nil )
@@ -280,7 +280,7 @@ func onAsync(asyncHandle *libuv.Async) {
280
280
dataTask := taskData .hyperBody .Data ()
281
281
dataTask .SetUserdata (c .Pointer (taskData ), nil )
282
282
if dataTask != nil {
283
- r := taskData .conn .executor .Push (dataTask )
283
+ r := taskData .server .executor .Push (dataTask )
284
284
fmt .Printf ("[debug] onAsync push data task: %d\n " , r )
285
285
if r != hyper .OK {
286
286
fmt .Printf ("failed to push data task: %d\n " , r )
@@ -291,13 +291,11 @@ func onAsync(asyncHandle *libuv.Async) {
291
291
292
292
func onIdle (handle * libuv.Idle ) {
293
293
srv := (* Server )((* libuv .Handle )(unsafe .Pointer (handle )).GetData ())
294
- for conn := range srv .activeConnections {
295
- if conn .executor != nil {
296
- task := conn .executor .Poll ()
297
- for task != nil {
298
- srv .handleTask (task )
299
- task = conn .executor .Poll ()
300
- }
294
+ if srv .executor != nil {
295
+ task := srv .executor .Poll ()
296
+ for task != nil {
297
+ srv .handleTask (task )
298
+ task = srv .executor .Poll ()
301
299
}
302
300
}
303
301
@@ -309,19 +307,24 @@ func onIdle(handle *libuv.Idle) {
309
307
310
308
func serverCallback (userdata unsafe.Pointer , hyperReq * hyper.Request , channel * hyper.ResponseChannel ) {
311
309
userData := (* serviceUserdata )(userdata )
310
+ srv := userData .server
311
+ if srv == nil {
312
+ fmt .Fprintf (os .Stderr , "Error: Received null server\n " )
313
+ return
314
+ }
312
315
313
316
if hyperReq == nil {
314
317
fmt .Fprintf (os .Stderr , "Error: Received null request\n " )
315
318
return
316
319
}
317
320
318
- req , err := userData .conn .readRequest (hyperReq )
321
+ req , err := userData .conn .readRequest (srv , hyperReq )
319
322
if err != nil {
320
323
fmt .Printf ("Error creating request: %v\n " , err )
321
324
return
322
325
}
323
326
324
- res := newResponse (channel )
327
+ res := newResponse (srv , channel )
325
328
fmt .Println ("[debug] Response created" )
326
329
327
330
//TODO(hackerchai): replace with no goroutine
@@ -348,7 +351,7 @@ func (srv *Server) handleTask(task *hyper.Task) {
348
351
if payload != nil {
349
352
switch payload .taskFlag {
350
353
case getBodyTask :
351
- handleGetBodyTask (hyperTaskType , task , payload )
354
+ handleGetBodyTask (srv , hyperTaskType , task , payload )
352
355
return
353
356
case setBodyTask :
354
357
handleSetBodyTask (hyperTaskType , task )
@@ -374,15 +377,15 @@ func (srv *Server) handleTask(task *hyper.Task) {
374
377
}
375
378
}
376
379
377
- func handleGetBodyTask (hyperTaskType hyper.TaskReturnType , task * hyper.Task , payload * taskData ) {
380
+ func handleGetBodyTask (srv * Server , hyperTaskType hyper.TaskReturnType , task * hyper.Task , payload * taskData ) {
378
381
switch hyperTaskType {
379
382
case hyper .TaskError :
380
383
handleTaskError (task )
381
384
case hyper .TaskBuf :
382
385
handleTaskBuffer (task , payload )
383
386
case hyper .TaskEmpty :
384
387
fmt .Println ("[debug] Get body task closing request body" )
385
- payload .conn . requestBody .Close ()
388
+ payload .requestBody .Close ()
386
389
task .Free ()
387
390
}
388
391
}
@@ -411,7 +414,7 @@ func handleTaskError(task *hyper.Task) {
411
414
func handleTaskBuffer (task * hyper.Task , payload * taskData ) {
412
415
buf := (* hyper .Buf )(task .Value ())
413
416
bytes := unsafe .Slice (buf .Bytes (), buf .Len ())
414
- payload .conn . requestBody .readCh <- bytes
417
+ payload .requestBody .readCh <- bytes
415
418
fmt .Printf ("[debug] Task get body writing to bodyWriter: %s\n " , string (bytes ))
416
419
buf .Free ()
417
420
task .Free ()
@@ -591,11 +594,6 @@ func freeConnData(userdata c.Pointer) {
591
594
conn .writeWaker = nil
592
595
}
593
596
594
- if conn .executor != nil {
595
- conn .executor .Free ()
596
- conn .executor = nil
597
- }
598
-
599
597
if conn .http1Opts != nil {
600
598
conn .http1Opts .Free ()
601
599
conn .http1Opts = nil
@@ -632,6 +630,11 @@ func (srv *Server) Close() error {
632
630
delete (srv .activeConnections , c )
633
631
}
634
632
633
+ if srv .executor != nil {
634
+ srv .executor .Free ()
635
+ srv .executor = nil
636
+ }
637
+
635
638
srv .uvLoop .Walk (closeWalkCb , nil )
636
639
srv .uvLoop .Run (libuv .RUN_ONCE )
637
640
(* libuv .Handle )(unsafe .Pointer (& srv .uvServer )).Close (nil )
@@ -663,10 +666,6 @@ func (c *conn) Close() {
663
666
c .writeWaker = nil
664
667
}
665
668
666
- if c .executor != nil {
667
- c .executor .Free ()
668
- c .executor = nil
669
- }
670
669
if c .http1Opts != nil {
671
670
c .http1Opts .Free ()
672
671
c .http1Opts = nil
0 commit comments