summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik De Rijcke <derijcke.erik@gmail.com>2015-03-20 22:20:03 +0100
committerErik De Rijcke <derijcke.erik@gmail.com>2015-03-20 22:20:03 +0100
commit151fe9ea3e0d9584679752174427703525e9bf00 (patch)
tree86575743204f1f3aa26d17f2f47d35ae4dfd0899
parenta16213fc725e729fc40769dc77232a06c0eff55f (diff)
use static callback functions to reduce memory consumption
-rw-r--r--stubs/src/main/java/org/freedesktop/wayland/client/Proxy.java7
-rw-r--r--stubs/src/main/java/org/freedesktop/wayland/server/Listener.java16
-rw-r--r--stubs/src/main/java/org/freedesktop/wayland/server/Resource.java16
-rw-r--r--stubs/src/main/java/org/freedesktop/wayland/server/jna/wl_notify_func_t.java3
-rw-r--r--stubs/src/main/java/org/freedesktop/wayland/util/Dispatcher.java26
-rw-r--r--stubs/src/main/java/org/freedesktop/wayland/util/ObjectCache.java4
6 files changed, 37 insertions, 35 deletions
diff --git a/stubs/src/main/java/org/freedesktop/wayland/client/Proxy.java b/stubs/src/main/java/org/freedesktop/wayland/client/Proxy.java
index 1788029..e548596 100644
--- a/stubs/src/main/java/org/freedesktop/wayland/client/Proxy.java
+++ b/stubs/src/main/java/org/freedesktop/wayland/client/Proxy.java
@@ -47,7 +47,6 @@ public abstract class Proxy<I> implements WaylandObject {
private final int version;
private final I implementation;
- private final Dispatcher dispatcher;
private boolean valid;
/**
@@ -67,16 +66,12 @@ public abstract class Proxy<I> implements WaylandObject {
//Special casing implementation. For some proxies the underlying native library provides its own implementation.
//We pass in a null implementation in those cases. (Eg Display proxy).
if (implementation != null) {
- this.dispatcher = new Dispatcher(this);
WaylandClientLibrary.INSTANCE()
.wl_proxy_add_dispatcher(getNative(),
- this.dispatcher,
+ Dispatcher.INSTANCE,
Pointer.NULL,
Pointer.NULL);
}
- else {
- this.dispatcher = null;
- }
}
protected Proxy(final Pointer pointer) {
diff --git a/stubs/src/main/java/org/freedesktop/wayland/server/Listener.java b/stubs/src/main/java/org/freedesktop/wayland/server/Listener.java
index 41c4198..19217e9 100644
--- a/stubs/src/main/java/org/freedesktop/wayland/server/Listener.java
+++ b/stubs/src/main/java/org/freedesktop/wayland/server/Listener.java
@@ -13,6 +13,7 @@
//limitations under the License.
package org.freedesktop.wayland.server;
+import com.sun.jna.Pointer;
import org.freedesktop.wayland.HasNative;
import org.freedesktop.wayland.server.jna.WaylandServerLibrary;
import org.freedesktop.wayland.server.jna.wl_listener;
@@ -34,6 +35,14 @@ import org.freedesktop.wayland.util.ObjectCache;
*/
public abstract class Listener implements HasNative<wl_listener> {
+ private static final wl_notify_func_t WL_NOTIFY_FUNC = new wl_notify_func_t() {
+ @Override
+ public void apply(final Pointer listenerPointer) {
+ final Listener listener = ObjectCache.from(listenerPointer);
+ listener.handle();
+ }
+ };
+
private final wl_listener pointer;
private boolean valid;
@@ -41,12 +50,7 @@ public abstract class Listener implements HasNative<wl_listener> {
public Listener() {
this.pointer = new wl_listener();
this.valid = true;
- this.pointer.notify$ = new wl_notify_func_t() {
- @Override
- public void apply() {
- Listener.this.handle();
- }
- };
+ this.pointer.notify$ = WL_NOTIFY_FUNC;
ObjectCache.store(getNative().getPointer(),
this);
}
diff --git a/stubs/src/main/java/org/freedesktop/wayland/server/Resource.java b/stubs/src/main/java/org/freedesktop/wayland/server/Resource.java
index f0784de..ee5190c 100644
--- a/stubs/src/main/java/org/freedesktop/wayland/server/Resource.java
+++ b/stubs/src/main/java/org/freedesktop/wayland/server/Resource.java
@@ -24,15 +24,15 @@ import org.freedesktop.wayland.util.*;
* @param <I> Type of implementation that will be used to handle client requests.
*/
public abstract class Resource<I> implements WaylandObject {
- //keep refs to callbacks to they don't get garbage collected.
- private final Dispatcher dispatcher = new Dispatcher(this);
- private final wl_resource_destroy_func_t nativeDestroyCallback = new wl_resource_destroy_func_t() {
+
+ private static final wl_resource_destroy_func_t RESOURCE_DESTROY_FUNC = new wl_resource_destroy_func_t() {
@Override
- public void apply(final Pointer resource) {
- Resource.this.valid = false;
- ObjectCache.remove(Resource.this.getNative());
+ public void apply(final Pointer resourcePointer) {
+ Resource<?> resource = ObjectCache.remove(resourcePointer);
+ resource.valid = false;
}
};
+
private final Pointer pointer;
private final I implementation;
@@ -54,10 +54,10 @@ public abstract class Resource<I> implements WaylandObject {
this);
WaylandServerLibrary.INSTANCE()
.wl_resource_set_dispatcher(getNative(),
- this.dispatcher,
+ Dispatcher.INSTANCE,
Pointer.NULL,
Pointer.NULL,
- this.nativeDestroyCallback);
+ RESOURCE_DESTROY_FUNC);
}
protected Resource(final Pointer pointer) {
diff --git a/stubs/src/main/java/org/freedesktop/wayland/server/jna/wl_notify_func_t.java b/stubs/src/main/java/org/freedesktop/wayland/server/jna/wl_notify_func_t.java
index f058075..b127cb5 100644
--- a/stubs/src/main/java/org/freedesktop/wayland/server/jna/wl_notify_func_t.java
+++ b/stubs/src/main/java/org/freedesktop/wayland/server/jna/wl_notify_func_t.java
@@ -14,7 +14,8 @@
package org.freedesktop.wayland.server.jna;
import com.sun.jna.Callback;
+import com.sun.jna.Pointer;
public interface wl_notify_func_t extends Callback {
- void apply();
+ void apply(Pointer listenerPointer);
}
diff --git a/stubs/src/main/java/org/freedesktop/wayland/util/Dispatcher.java b/stubs/src/main/java/org/freedesktop/wayland/util/Dispatcher.java
index 30bf04b..4e793a4 100644
--- a/stubs/src/main/java/org/freedesktop/wayland/util/Dispatcher.java
+++ b/stubs/src/main/java/org/freedesktop/wayland/util/Dispatcher.java
@@ -24,14 +24,11 @@ import java.util.HashMap;
import java.util.Map;
public final class Dispatcher implements wl_dispatcher_func_t {
- private static final Map<Class<?>, Map<Message, Method>> METHOD_CACHE = new HashMap<Class<?>, Map<Message, Method>>();
- private static final Map<Class<?>, Constructor<?>> CONSTRUCTOR_CACHE = new HashMap<Class<?>, Constructor<?>>();
- private final WaylandObject waylandObject;
+ public static Dispatcher INSTANCE = new Dispatcher();
- public Dispatcher(final WaylandObject waylandObject) {
- this.waylandObject = waylandObject;
- }
+ private static final Map<Class<?>, Map<Message, Method>> METHOD_CACHE = new HashMap<Class<?>, Map<Message, Method>>();
+ private static final Map<Class<?>, Constructor<?>> CONSTRUCTOR_CACHE = new HashMap<Class<?>, Constructor<?>>();
private static Method get(final Class<? extends WaylandObject> waylandObjectType,
final Class<?> implementationType,
@@ -122,6 +119,9 @@ public final class Dispatcher implements wl_dispatcher_func_t {
return constructor.newInstance(objectPointer);
}
+ Dispatcher() {
+ }
+
@Override
public int apply(final Pointer implPointer,
final Pointer implWlObject,
@@ -132,12 +132,14 @@ public final class Dispatcher implements wl_dispatcher_func_t {
Method method = null;
Object[] jargs = null;
Message message = null;
+ WaylandObject waylandObject = null;
try {
message = ObjectCache.<MessageMeta>from(wlMessage)
.getMessage();
- method = get(this.waylandObject.getClass(),
- this.waylandObject.getImplementation()
- .getClass(),
+ waylandObject = ObjectCache.from(implWlObject);
+ method = get(waylandObject.getClass(),
+ waylandObject.getImplementation()
+ .getClass(),
message);
final String signature = message.signature();
@@ -153,7 +155,7 @@ public final class Dispatcher implements wl_dispatcher_func_t {
final int nroArgs = message.types().length;
jargs = new Object[nroArgs + 1];
- jargs[0] = this.waylandObject;
+ jargs[0] = waylandObject;
if (nroArgs > 0) {
final Arguments arguments = new Arguments(wlArguments);
@@ -180,7 +182,7 @@ public final class Dispatcher implements wl_dispatcher_func_t {
optional = false;
}
}
- method.invoke(this.waylandObject.getImplementation(),
+ method.invoke(waylandObject.getImplementation(),
jargs);
}
catch (final Exception e) {
@@ -190,7 +192,7 @@ public final class Dispatcher implements wl_dispatcher_func_t {
"arguments=%s, " +
"message=%s",
method,
- this.waylandObject.getImplementation(),
+ waylandObject.getImplementation(),
Arrays.toString(jargs),
message));
e.printStackTrace();
diff --git a/stubs/src/main/java/org/freedesktop/wayland/util/ObjectCache.java b/stubs/src/main/java/org/freedesktop/wayland/util/ObjectCache.java
index 4c0b87d..3a0e0fd 100644
--- a/stubs/src/main/java/org/freedesktop/wayland/util/ObjectCache.java
+++ b/stubs/src/main/java/org/freedesktop/wayland/util/ObjectCache.java
@@ -67,7 +67,7 @@ public class ObjectCache {
* @param pointer The pointer of the associated object.
*
*/
- public static void remove(final Pointer pointer) {
- MAPPED_OBJECTS.remove(pointer);
+ public static <T> T remove(final Pointer pointer) {
+ return (T) MAPPED_OBJECTS.remove(pointer);
}
}