Skip to content

Commit 31bf7a6

Browse files
committed
try claypoole
1 parent 35d20cf commit 31bf7a6

File tree

5 files changed

+444
-23
lines changed

5 files changed

+444
-23
lines changed

project.clj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
[hiccup "2.0.0-alpha2"]
2323
[io.replikativ/hasch "0.3.7"]
2424
[org.clojure/core.cache "1.0.207"]
25-
25+
[com.climate/claypoole "1.1.4"]
26+
2627
;includes for hosted environemnt
2728
[selmer "1.12.19"]
2829
[seancorfield/next.jdbc "1.1.582"]

src/pcp/core.clj

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
[clojure.edn :as edn]
88
[clojure.string :as str]
99
[pcp.scgi :as scgi]
10+
;; [pcp.server :as server]
1011
[pcp.includes :refer [includes]]
1112
[hiccup.compiler :as compiler]
1213
[hiccup.util :as util]
@@ -194,13 +195,18 @@
194195
r (try (run-script path :root root :request request) (catch Exception e (format-response 500 (.getMessage e) nil)))]
195196
r))
196197

198+
(defn handler [req]
199+
{:status 200
200+
:headers {"content-type" "text/plain"}
201+
:body "hello!"})
202+
197203
(defn -main
198204
([]
199205
(-main ""))
200206
([path]
201207
(let [scgi-port (Integer/parseInt (or (System/getenv "SCGI_PORT") "9000"))]
202208
(case path
203-
"" (scgi/serve scgi-handler scgi-port)
209+
"" (scgi/serve scgi-handler scgi-port);(server/start-server handler {:port scgi-port});
204210
(run-script path)))))
205211

206212

src/pcp/scgi.clj

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
(ns pcp.scgi
2-
(:require [clojure.string :as str])
2+
(:require [clojure.string :as str]
3+
[com.climate.claypoole :as cp])
34
(:import [java.nio.channels ServerSocketChannel SocketChannel Selector SelectionKey]
45
[java.nio ByteBuffer]
56
[java.net InetSocketAddress InetAddress]
6-
[java.io ByteArrayInputStream ByteArrayOutputStream])
7+
[java.io ByteArrayInputStream ByteArrayOutputStream]
8+
[java.util Set])
79
(:gen-class))
810

911
(set! *warn-on-reflection* 1)
@@ -39,18 +41,19 @@
3941
(assoc! :body (:body req))
4042
(persistent!))))
4143

42-
(defn on-accept [selector ^SelectionKey key]
44+
(defn on-accept [selector ^SelectionKey key ^Set keys]
4345
(let [^ServerSocketChannel channel (.channel key)
4446
^SocketChannel socketChannel (.accept channel)]
4547
(.configureBlocking socketChannel false)
46-
(.register socketChannel selector SelectionKey/OP_READ)))
48+
(.register socketChannel selector SelectionKey/OP_READ)
49+
(.remove keys key)))
4750

4851
(defn create-scgi-string [resp]
4952
(let [nl "\r\n"
5053
response (str (:status resp) nl (apply str (for [[k v] (:headers resp)] (str k ": " v nl))) nl (:body resp))]
5154
response))
5255

53-
(defn on-read [^SelectionKey key handler]
56+
(defn on-read [^SelectionKey key handler ^Set keys]
5457
(let [^SocketChannel socket-channel (.channel key)]
5558
(try
5659
(let [buf (ByteBuffer/allocate 1)
@@ -90,8 +93,9 @@
9093
(let [^ByteBuffer resp (-> {:header header :body (ByteArrayInputStream. (.toByteArray body-out))} extract-headers handler create-scgi-string to-byte-array)]
9194
(.write socket-channel resp)
9295
(.close socket-channel)
93-
(.cancel key))))
94-
(catch Exception _ (.close socket-channel) (.cancel key)))))
96+
(.cancel key)
97+
(.remove keys key))))
98+
(catch Exception e (println e) (.close socket-channel) (.cancel key) (.remove keys key)))))
9599

96100
(defn build-server [port selector]
97101
(let [^ServerSocketChannel serverChannel (ServerSocketChannel/open)
@@ -101,25 +105,27 @@
101105
(.register serverChannel selector SelectionKey/OP_ACCEPT)
102106
serverChannel))
103107

104-
(defn run-selection [active handler ^Selector selector]
108+
(defn run-selection [active handler ^Selector selector pool]
109+
(println "running...")
105110
(while (some? @active)
106-
(if (not= 0 (.select selector 50))
107-
(let [keys (.selectedKeys selector)]
108-
(doseq [^SelectionKey key keys]
109-
(let [ops (.readyOps key)]
110-
(cond
111-
(= ops SelectionKey/OP_ACCEPT) (on-accept selector key)
112-
(= ops SelectionKey/OP_READ) (on-read key handler))))
113-
(.clear keys))
114-
nil)))
111+
(when (not= 0 (.select selector))
112+
(let [keys (.selectedKeys selector)
113+
process (fn [^SelectionKey key]
114+
(let [ops (.readyOps key)]
115+
(cond
116+
(= ops SelectionKey/OP_ACCEPT) (on-accept selector key keys)
117+
(= ops SelectionKey/OP_READ) (on-read key handler keys))))]
118+
(dorun (cp/upmap pool process keys))))))
115119

116120
(defn serve [handler port]
117121
(let [active (atom true)
118122
^Selector selector (Selector/open)
119-
^ServerSocketChannel server (build-server port selector)]
123+
^ServerSocketChannel server (build-server port selector)
124+
pool (cp/threadpool 512)]
120125
(future
121-
(run-selection active handler selector))
126+
(run-selection active handler selector pool))
122127
(fn []
123128
(.close server)
124-
(reset! active false))))
129+
(reset! active false)
130+
(cp/shutdown pool))))
125131

0 commit comments

Comments
 (0)