Просмотр исходного кода

Fixed a problem with stopping the server -> https://github.com/glock45/swifter/issues/25

Damian Kołakowski 11 лет назад
Родитель
Сommit
b37392bf00

+ 1 - 0
Common/DemoServer.swift

@@ -8,6 +8,7 @@ import Foundation
 
 func demoServer(publicDir: String?) -> HttpServer {
     let server = HttpServer()
+    
     if let publicDir = publicDir {
         server["/resources/(.+)"] = HttpHandlers.directory(publicDir)
     }

+ 30 - 15
Common/HttpServer.swift

@@ -11,6 +11,8 @@ class HttpServer
     typealias Handler = HttpRequest -> HttpResponse
     
     var handlers: [(expression: NSRegularExpression, handler: Handler)] = []
+    var clientSockets: Set<CInt> = []
+    let clientSocketsLock = 0
     var acceptSocket: CInt = -1
     
     let matchingOptions = NSMatchingOptions(0)
@@ -28,15 +30,19 @@ class HttpServer
             }
         }
     }
-        
+    
     func routes() -> [String] { return map(handlers, { $0.0.pattern }) }
     
     func start(listenPort: in_port_t = 8080, error: NSErrorPointer = nil) -> Bool {
-        releaseAcceptSocket()
+        stop()
         if let socket = Socket.tcpForListen(port: listenPort, error: error) {
-            acceptSocket = socket
+            self.acceptSocket = socket
             dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
                 while let socket = Socket.acceptClientSocket(self.acceptSocket) {
+                    HttpServer.lock(self.clientSocketsLock) {
+                        self.clientSockets.insert(socket)
+                    }
+                    if self.acceptSocket == -1 { return }
                     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
                         let parser = HttpParser()
                         while let request = parser.nextHttpRequest(socket) {
@@ -51,9 +57,12 @@ class HttpServer
                             if !keepAlive { break }
                         }
                         Socket.release(socket)
+                        HttpServer.lock(self.clientSocketsLock) {
+                            self.clientSockets.remove(socket)
+                        }
                     })
                 }
-                self.releaseAcceptSocket()
+                self.stop()
             })
             return true
         }
@@ -79,10 +88,27 @@ class HttpServer
         return capturedGroups
     }
     
+    func stop() {
+        Socket.release(acceptSocket)
+        acceptSocket = -1
+        HttpServer.lock(self.clientSocketsLock) {
+            for clientSocket in self.clientSockets {
+                Socket.release(clientSocket)
+            }
+            self.clientSockets.removeAll(keepCapacity: true)
+        }
+    }
+    
     class func asciiRange(value: String) -> NSRange {
         return NSMakeRange(0, value.lengthOfBytesUsingEncoding(NSASCIIStringEncoding))
     }
     
+    class func lock(handle: AnyObject, closure: () -> ()) {
+        objc_sync_enter(handle)
+        closure()
+        objc_sync_exit(handle)
+    }
+    
     class func respond(socket: CInt, response: HttpResponse, keepAlive: Bool) {
         Socket.writeUTF8(socket, string: "HTTP/1.1 \(response.statusCode()) \(response.reasonPhrase())\r\n")
         if let body = response.body() {
@@ -101,16 +127,5 @@ class HttpServer
             Socket.writeData(socket, data: body)
         }
     }
-    
-    func stop() {
-        releaseAcceptSocket()
-    }
-    
-    func releaseAcceptSocket() {
-        if ( acceptSocket != -1 ) {
-            Socket.release(acceptSocket)
-            acceptSocket = -1
-        }
-    }
 }
 

+ 2 - 2
Common/Socket.swift

@@ -51,14 +51,14 @@ struct Socket {
     
     static func writeUTF8(socket: CInt, string: String, error: NSErrorPointer = nil) -> Bool {
         if let nsdata = string.dataUsingEncoding(NSUTF8StringEncoding) {
-            writeData(socket, data: nsdata, error: error)
+            return writeData(socket, data: nsdata, error: error)
         }
         return true
     }
     
     static func writeASCII(socket: CInt, string: String, error: NSErrorPointer = nil) -> Bool {
         if let nsdata = string.dataUsingEncoding(NSASCIIStringEncoding) {
-            writeData(socket, data: nsdata, error: error)
+            return writeData(socket, data: nsdata, error: error)
         }
         return true
     }

BIN
Swifter.xcodeproj/project.xcworkspace/xcuserdata/damiankolakowski.xcuserdatad/UserInterfaceState.xcuserstate


+ 30 - 44
Swifter.xcodeproj/xcuserdata/damiankolakowski.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -250,11 +250,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Common/HttpServer.swift"
-            timestampString = "438266226.339419"
+            timestampString = "456067822.690759"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "39"
-            endingLineNumber = "39"
+            startingLineNumber = "41"
+            endingLineNumber = "41"
             landmarkName = "start(listenPort:error:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -266,11 +266,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Common/HttpServer.swift"
-            timestampString = "438266226.339419"
+            timestampString = "456068345.283285"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "41"
-            endingLineNumber = "41"
+            startingLineNumber = "47"
+            endingLineNumber = "47"
             landmarkName = "start(listenPort:error:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -282,11 +282,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Common/HttpServer.swift"
-            timestampString = "438266226.339419"
+            timestampString = "456068345.283285"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "43"
-            endingLineNumber = "43"
+            startingLineNumber = "49"
+            endingLineNumber = "49"
             landmarkName = "start(listenPort:error:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -298,11 +298,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Common/HttpServer.swift"
-            timestampString = "438266226.339419"
+            timestampString = "456068345.283285"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "45"
-            endingLineNumber = "45"
+            startingLineNumber = "51"
+            endingLineNumber = "51"
             landmarkName = "start(listenPort:error:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -314,11 +314,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Common/HttpServer.swift"
-            timestampString = "438266226.339419"
+            timestampString = "456068345.283285"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "49"
-            endingLineNumber = "49"
+            startingLineNumber = "55"
+            endingLineNumber = "55"
             landmarkName = "start(listenPort:error:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -330,11 +330,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Common/HttpServer.swift"
-            timestampString = "438266226.339419"
+            timestampString = "456068345.283285"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "50"
-            endingLineNumber = "50"
+            startingLineNumber = "56"
+            endingLineNumber = "56"
             landmarkName = "start(listenPort:error:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -362,11 +362,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Common/HttpServer.swift"
-            timestampString = "438292568.591795"
+            timestampString = "456068345.283285"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "70"
-            endingLineNumber = "70"
+            startingLineNumber = "79"
+            endingLineNumber = "79"
             landmarkName = "captureExpressionGroups(_:value:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -394,11 +394,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Common/HttpServer.swift"
-            timestampString = "438266226.339419"
+            timestampString = "456068345.283285"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "46"
-            endingLineNumber = "46"
+            startingLineNumber = "52"
+            endingLineNumber = "52"
             landmarkName = "start(listenPort:error:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -554,11 +554,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Common/HttpServer.swift"
-            timestampString = "438294105.63842"
+            timestampString = "456068345.283285"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "86"
-            endingLineNumber = "86"
+            startingLineNumber = "112"
+            endingLineNumber = "112"
             landmarkName = "respond(_:response:keepAlive:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -570,11 +570,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Common/HttpServer.swift"
-            timestampString = "438294105.63842"
+            timestampString = "456068345.283285"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "87"
-            endingLineNumber = "87"
+            startingLineNumber = "113"
+            endingLineNumber = "113"
             landmarkName = "respond(_:response:keepAlive:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -910,20 +910,6 @@
             landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            shouldBeEnabled = "No"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "SwifterOSX/main.swift"
-            timestampString = "455528191.812153"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "9"
-            endingLineNumber = "9">
-         </BreakpointContent>
-      </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent

+ 13 - 3
SwifterOSX/main.swift

@@ -4,17 +4,27 @@
 //  Copyright (c) 2014 Damian Kołakowski. All rights reserved.
 //
 
-import Foundation
 
+import Foundation
 
 var error: NSError?
-
 let server = demoServer(NSBundle.mainBundle().resourcePath)
 
 if !server.start(listenPort: 9080, error: &error) {
     println("Server start error: \(error)")
 } else {
-    println("Server started !")
+    println("Server started; try a connection now")
+    sleep(10)
+    
+    println("main thread is awake again")
+    server.stop()
+    
+    println("Server started; try a connection now")
+    sleep(10)
+    
+    server.start(listenPort: 9080, error: &error)
+    
+    println("stopped server; try to connect")
     while ( true ) { };
 }