You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by jt...@apache.org on 2019/02/15 19:57:30 UTC
[incubator-netbeans-html4j] 07/15: Caching needs to be done per
presenter
This is an automated email from the ASF dual-hosted git repository.
jtulach pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-netbeans-html4j.git
commit 16f7f4614742e98f7f0d7d9cea9bf6cdcca20b47
Author: Jaroslav Tulach <ja...@apidesign.org>
AuthorDate: Thu Feb 14 05:49:56 2019 +0100
Caching needs to be done per presenter
---
.../java/org/netbeans/html/ko4j/CacheObjs.java | 50 ++++++++++++++++++++--
.../main/java/org/netbeans/html/ko4j/Knockout.java | 11 ++---
2 files changed, 52 insertions(+), 9 deletions(-)
diff --git a/ko4j/src/main/java/org/netbeans/html/ko4j/CacheObjs.java b/ko4j/src/main/java/org/netbeans/html/ko4j/CacheObjs.java
index af7e9f6..6311ff2 100644
--- a/ko4j/src/main/java/org/netbeans/html/ko4j/CacheObjs.java
+++ b/ko4j/src/main/java/org/netbeans/html/ko4j/CacheObjs.java
@@ -19,14 +19,56 @@
package org.netbeans.html.ko4j;
-final class CacheObjs {
- private static final CacheObjs C = new CacheObjs();
+import java.lang.ref.WeakReference;
+import org.netbeans.html.boot.spi.Fn;
+final class CacheObjs extends WeakReference<Fn.Presenter> {
+ /* both @GuardedBy CacheObjs.class */
+ private static CacheObjs list;
+ private CacheObjs next;
+
+ /* both @GuardedBy presenter single threaded access */
private Object[] jsObjects;
private int jsIndex;
- static CacheObjs find() {
- return C;
+ private CacheObjs(CacheObjs next, Fn.Presenter p) {
+ super(p);
+ this.next = next;
+ }
+
+ static synchronized CacheObjs find(Fn.Presenter key) {
+ if (list == null) {
+ return list = new CacheObjs(null, key);
+ }
+
+ Fn.Presenter p;
+ for (;;) {
+ p = list.get();
+ if (p != null) {
+ break;
+ }
+ list = list.next;
+ }
+
+ if (p == key) {
+ return list;
+ }
+
+ CacheObjs prev = list;
+ CacheObjs now = list.next;
+
+ while (now != null) {
+ p = now.get();
+ if (p == null) {
+ prev.next = now;
+ }
+ if (p == key) {
+ return now;
+ }
+ prev = now;
+ now = now.next;
+ }
+ return prev.next = new CacheObjs(null, key);
}
Object getJSObject() {
diff --git a/ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java b/ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java
index ac91bcc..cc41bb8 100644
--- a/ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java
+++ b/ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java
@@ -79,15 +79,16 @@ final class Knockout {
}
final Object js() {
- Object js = objs.get(Fn.activePresenter());
+ final Fn.Presenter c = Fn.activePresenter();
+ Object js = objs.get(c);
if (js == null) {
- js = initObjs(copyFrom);
- objs.put(Fn.activePresenter(), js);
+ js = initObjs(c, copyFrom);
+ objs.put(c, js);
}
return js;
}
- private Object initObjs(Object copyFrom) {
+ private Object initObjs(Fn.Presenter p, Object copyFrom) {
String[] propNames = new String[props.length];
Number[] propInfo = new Number[props.length];
Object[] propValues = new Object[props.length];
@@ -107,7 +108,7 @@ final class Knockout {
for (int i = 0; i < funcNames.length; i++) {
funcNames[i] = funcs[i].getFunctionName();
}
- Object ret = CacheObjs.find().getJSObject();
+ Object ret = CacheObjs.find(p).getJSObject();
wrapModel(this,ret, copyFrom, propNames, propInfo, propValues, funcNames);
return ret;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists