Skip to content

Commit 645489a

Browse files
committed
Enable coroutine context for invoking config method of a handler in
coroutine mode #283
1 parent 413162c commit 645489a

File tree

1 file changed

+28
-19
lines changed

1 file changed

+28
-19
lines changed

src/java/nginx/clojure/NginxClojureRT.java

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -875,29 +875,38 @@ public static synchronized int registerCode(int phase, long typeNStr, long nameN
875875
String type = fetchNGXString(typeNStr, DEFAULT_ENCODING);
876876
String name = fetchNGXString(nameNStr, DEFAULT_ENCODING);
877877
String code = fetchNGXString(codeNStr, DEFAULT_ENCODING);
878-
879878
NginxHandler handler = NginxHandlerFactory.fetchHandler(phase, type, name, code);
880879
HANDLERS.add(handler);
881-
if (pros != 0) {
882-
Map<String, String> properties = new ArrayMap<String, String>();
883-
int size = fetchNGXInt(pros + NGX_HTTP_CLOJURE_ARRAY_NELTS_OFFSET);
884-
long ele = UNSAFE.getAddress(pros + NGX_HTTP_CLOJURE_ARRAY_ELTS_OFFSET);
885-
for (int i = 0; i < size; i++) {
886-
long kv = ele + i * NGX_HTTP_CLOJURE_KEYVALT_SIZE;
887-
properties.put(fetchNGXString(kv + NGX_HTTP_CLOJURE_KEYVALT_KEY_OFFSET, DEFAULT_ENCODING),
888-
fetchNGXString(kv + NGX_HTTP_CLOJURE_KEYVALT_VALUE_OFFSET, DEFAULT_ENCODING));
889-
}
890-
for (Entry<String, String> en : properties.entrySet()) {
891-
en.setValue(evalSimpleExp(en.getValue(), properties));
892-
}
893-
if (handler instanceof Configurable) {
894-
Configurable cr = (Configurable) handler;
895-
cr.config(properties);
896-
}else {
897-
log.warn("%s is not an instance of nginx.clojure.Configurable, so properties will be ignored!",
898-
handler.getClass());
880+
Runnable runnable = new Runnable() {
881+
public void run() {
882+
if (pros != 0) {
883+
Map<String, String> properties = new ArrayMap<String, String>();
884+
int size = fetchNGXInt(pros + NGX_HTTP_CLOJURE_ARRAY_NELTS_OFFSET);
885+
long ele = UNSAFE.getAddress(pros + NGX_HTTP_CLOJURE_ARRAY_ELTS_OFFSET);
886+
for (int i = 0; i < size; i++) {
887+
long kv = ele + i * NGX_HTTP_CLOJURE_KEYVALT_SIZE;
888+
properties.put(fetchNGXString(kv + NGX_HTTP_CLOJURE_KEYVALT_KEY_OFFSET, DEFAULT_ENCODING),
889+
fetchNGXString(kv + NGX_HTTP_CLOJURE_KEYVALT_VALUE_OFFSET, DEFAULT_ENCODING));
890+
}
891+
for (Entry<String, String> en : properties.entrySet()) {
892+
en.setValue(evalSimpleExp(en.getValue(), properties));
893+
}
894+
if (handler instanceof Configurable) {
895+
Configurable cr = (Configurable) handler;
896+
cr.config(properties);
897+
}else {
898+
log.warn("%s is not an instance of nginx.clojure.Configurable, so properties will be ignored!",
899+
handler.getClass());
900+
}
901+
}
899902
}
903+
};
904+
if (coroutineEnabled) {
905+
new Coroutine(runnable).resume();
906+
} else {
907+
runnable.run();
900908
}
909+
901910
return HANDLERS.size() - 1;
902911
}
903912

0 commit comments

Comments
 (0)