Skip to content

Commit eda06ff

Browse files
authored
Merge pull request #28 from noppoMan/http-server-performance
Http server performance
2 parents c01c02a + de464f4 commit eda06ff

6 files changed

Lines changed: 53 additions & 47 deletions

File tree

Sources/Prorsum/HTTP/Serializer/RequestSerializer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//
88

9-
public class RequestSerializer {
9+
public struct RequestSerializer {
1010
let stream: DuplexStream
1111
let bufferSize: Int
1212

Sources/Prorsum/HTTP/Serializer/ResponseSerializer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//
88

9-
public class ResponseSerializer {
9+
public struct ResponseSerializer {
1010
let stream: DuplexStream
1111
let bufferSize: Int
1212

Sources/Prorsum/HTTP/StreamWriter/RequestWriter.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//
88

9-
public class RequestWriter {
9+
public struct RequestWriter {
1010

1111
let stream: DuplexStream
1212

Sources/Prorsum/HTTP/StreamWriter/ResponseWriter.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//
88

9-
public class ResponrWriter {
9+
public struct ResponrWriter {
1010

1111
let stream: DuplexStream
1212

Sources/Prorsum/Net/Net.swift

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,44 +8,44 @@
88

99
#if os(Linux)
1010
import Glibc
11-
let sys_off_t = Glibc.off_t()
12-
let sys_bind = Glibc.bind
13-
let sys_accept = Glibc.accept
14-
let sys_listen = Glibc.listen
15-
let sys_connect = Glibc.connect
16-
let sys_close = Glibc.close
17-
let sys_socket = Glibc.socket
18-
let sys_recv = Glibc.recv
19-
let sys_send = Glibc.send
20-
21-
let SOCK_NOSIGNAL = Glibc.MSG_NOSIGNAL
22-
let SOCK_STREAM = Int32(Glibc.SOCK_STREAM.rawValue)
23-
let SOCK_DGRAM = Int32(Glibc.SOCK_DGRAM.rawValue)
24-
let SOCK_SEQPACKET = Int32(Glibc.SOCK_SEQPACKET.rawValue)
25-
let SOCK_RAW = Int32(Glibc.SOCK_RAW.rawValue)
26-
let SOCK_RDM = Int32(Glibc.SOCK_RDM.rawValue)
27-
let SOCK_MAXADDRLEN: Int32 = 255
28-
let IPPROTO_TCP = Int32(Glibc.IPPROTO_TCP)
11+
let sys_off_t = Glibc.off_t()
12+
let sys_bind = Glibc.bind
13+
let sys_accept = Glibc.accept
14+
let sys_listen = Glibc.listen
15+
let sys_connect = Glibc.connect
16+
let sys_close = Glibc.close
17+
let sys_socket = Glibc.socket
18+
let sys_recv = Glibc.recv
19+
let sys_send = Glibc.send
20+
21+
let SOCK_NOSIGNAL = Glibc.MSG_NOSIGNAL
22+
let SOCK_STREAM = Int32(Glibc.SOCK_STREAM.rawValue)
23+
let SOCK_DGRAM = Int32(Glibc.SOCK_DGRAM.rawValue)
24+
let SOCK_SEQPACKET = Int32(Glibc.SOCK_SEQPACKET.rawValue)
25+
let SOCK_RAW = Int32(Glibc.SOCK_RAW.rawValue)
26+
let SOCK_RDM = Int32(Glibc.SOCK_RDM.rawValue)
27+
let SOCK_MAXADDRLEN: Int32 = 255
28+
let IPPROTO_TCP = Int32(Glibc.IPPROTO_TCP)
2929
#else
3030
import Darwin
31-
let sys_off_t = Darwin.off_t()
32-
let sys_bind = Darwin.bind
33-
let sys_accept = Darwin.accept
34-
let sys_listen = Darwin.listen
35-
let sys_connect = Darwin.connect
36-
let sys_close = Darwin.close
37-
let sys_socket = Darwin.socket
38-
let sys_recv = Darwin.recv
39-
let sys_send = Darwin.send
40-
41-
let SOCK_NOSIGNAL = Darwin.SO_NOSIGPIPE
42-
let SOCK_STREAM = Darwin.SOCK_STREAM
43-
let SOCK_DGRAM = Darwin.SOCK_DGRAM
44-
let SOCK_SEQPACKET = Darwin.SOCK_SEQPACKET
45-
let SOCK_RAW = Darwin.SOCK_RAW
46-
let SOCK_RDM = Darwin.SOCK_RDM
47-
let IPPROTO_TCP = Darwin.IPPROTO_TCP
48-
let SOCK_MAXADDRLEN = Darwin.SOCK_MAXADDRLEN
31+
let sys_off_t = Darwin.off_t()
32+
let sys_bind = Darwin.bind
33+
let sys_accept = Darwin.accept
34+
let sys_listen = Darwin.listen
35+
let sys_connect = Darwin.connect
36+
let sys_close = Darwin.close
37+
let sys_socket = Darwin.socket
38+
let sys_recv = Darwin.recv
39+
let sys_send = Darwin.send
40+
41+
let SOCK_NOSIGNAL = Darwin.SO_NOSIGPIPE
42+
let SOCK_STREAM = Darwin.SOCK_STREAM
43+
let SOCK_DGRAM = Darwin.SOCK_DGRAM
44+
let SOCK_SEQPACKET = Darwin.SOCK_SEQPACKET
45+
let SOCK_RAW = Darwin.SOCK_RAW
46+
let SOCK_RDM = Darwin.SOCK_RDM
47+
let IPPROTO_TCP = Darwin.IPPROTO_TCP
48+
let SOCK_MAXADDRLEN = Darwin.SOCK_MAXADDRLEN
4949
#endif
5050

5151
public typealias Byte = UInt8

Sources/Prorsum/Net/TCPServer.swift

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
import Foundation
1010
import Dispatch
1111

12+
private let sourceReadQ = DispatchQueue(label: "prorsum.net.source-read.queue")
13+
14+
private let tcpIncommingRequestHandleQ = DispatchQueue(label: "prorsum.tcp.concurrent-queue", attributes: .concurrent)
15+
1216
public final class TCPServer {
1317
let stream: TCPStream
1418

@@ -45,19 +49,21 @@ public final class TCPServer {
4549
try stream.socket.bind(host: host, port: port)
4650
}
4751

52+
/**
53+
* Kitura HTTPServerのように、acceptはループで行い、read/writeを非同期で
54+
* DispatchWorkItemを用いている模様
55+
*/
4856
public func listen(backlog: Int = 1024) throws {
4957
try stream.socket.listen(backlog: backlog)
5058

51-
watcher = DispatchSource.makeReadSource(fileDescriptor: stream.socket.fd, queue: .main)
59+
watcher = DispatchSource.makeReadSource(fileDescriptor: stream.socket.fd, queue: sourceReadQ)
5260

5361
watcher?.setEventHandler { [unowned self] in
54-
do {
55-
let client = try TCPStream(socket: self.stream.socket.accept())
56-
go {
62+
tcpIncommingRequestHandleQ.async {
63+
do {
64+
let client = try TCPStream(socket: self.stream.socket.accept())
5765
self.handler(client)
58-
}
59-
} catch {
60-
go {
66+
} catch {
6167
self.onError?(error)
6268
}
6369
}

0 commit comments

Comments
 (0)