diff options
author | Erik De Rijcke <derijcke.erik@gmail.com> | 2015-03-20 22:20:03 +0100 |
---|---|---|
committer | Erik De Rijcke <derijcke.erik@gmail.com> | 2015-03-20 22:20:03 +0100 |
commit | 151fe9ea3e0d9584679752174427703525e9bf00 (patch) | |
tree | 86575743204f1f3aa26d17f2f47d35ae4dfd0899 | |
parent | a16213fc725e729fc40769dc77232a06c0eff55f (diff) |
use static callback functions to reduce memory consumption
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); } } |