public void run() { referenceSet.remove(this); Ruby runtime = null; ThreadContext ctx = null; Reaper r = head; while (r != null) { if (!r.released && !r.unmanaged) { if (r.getRuntime() != runtime) { runtime = r.getRuntime(); ctx = runtime.getCurrentContext(); } r.dispose(ctx); } r = r.next; } } }
@Override @JRubyMethod(name = "initialize", visibility = PRIVATE) public final IRubyObject initialize(ThreadContext context, IRubyObject pointerArg) { Ruby runtime = context.runtime; checkPointer(runtime, pointerArg); Object ffiHandle = getMetaClass().getFFIHandle(); if (!(ffiHandle instanceof ClassData)) { getMetaClass().setFFIHandle(ffiHandle = new ClassData()); } ClassData classData = (ClassData) ffiHandle; // If no release method is defined, then memory leaks will result. DynamicMethod releaseMethod = classData.releaseCallSite.retrieveCache(getMetaClass().getMetaClass(), classData.releaseCallSite.getMethodName()).method; if (releaseMethod.isUndefined()) { throw runtime.newRuntimeError("release method undefined"); } else if ((releaseMethod.getArity().isFixed() && releaseMethod.getArity().required() != 1) || releaseMethod.getArity().required() > 1) { throw runtime.newRuntimeError("wrong number of arguments to release method (" + 1 + " for " + releaseMethod.getArity().required() + ")"); } setMemoryIO(((Pointer) pointerArg).getMemoryIO()); this.pointer = (Pointer) pointerArg; this.size = pointer.size; this.typeSize = pointer.typeSize; setReaper(new Reaper(pointer, getMetaClass(), classData.releaseCallSite)); return this; }
@Override @JRubyMethod(name = "initialize", visibility = PRIVATE) public final IRubyObject initialize(ThreadContext context, IRubyObject pointerArg, IRubyObject releaser) { checkPointer(context.runtime, pointerArg); setMemoryIO(((Pointer) pointerArg).getMemoryIO()); this.pointer = (Pointer) pointerArg; this.size = pointer.size; this.typeSize = pointer.typeSize; Object ffiHandle = releaser.getMetaClass().getFFIHandleAccessorField().getVariableAccessorForRead().get(releaser); if (!(ffiHandle instanceof ReleaserData)) { getMetaClass().setFFIHandle(ffiHandle = new ReleaserData()); } ReleaserData releaserData = (ReleaserData) ffiHandle; DynamicMethod releaseMethod = releaserData.releaseCallSite.retrieveCache(releaser.getMetaClass(), releaserData.releaseCallSite.getMethodName()).method; // If no release method is defined, then memory leaks will result. if (releaseMethod.isUndefined()) { throw context.runtime.newRuntimeError("call method undefined"); } else if ((releaseMethod.getArity().isFixed() && releaseMethod.getArity().required() != 1) || releaseMethod.getArity().required() > 1) { throw context.runtime.newRuntimeError("wrong number of arguments to call method (" + 1 + " for " + releaseMethod.getArity().required() + ")"); } setReaper(new Reaper(pointer, releaser, releaserData.releaseCallSite)); return this; }
@Override @JRubyMethod(name = "initialize", visibility = PRIVATE) public final IRubyObject initialize(ThreadContext context, IRubyObject pointerArg) { Ruby runtime = context.runtime; checkPointer(runtime, pointerArg); Object ffiHandle = getMetaClass().getFFIHandle(); if (!(ffiHandle instanceof ClassData)) { getMetaClass().setFFIHandle(ffiHandle = new ClassData()); } ClassData classData = (ClassData) ffiHandle; // If no release method is defined, then memory leaks will result. DynamicMethod releaseMethod = classData.releaseCallSite.retrieveCache(getMetaClass().getMetaClass(), classData.releaseCallSite.getMethodName()).method; if (releaseMethod.isUndefined()) { throw runtime.newRuntimeError("release method undefined"); } else if ((releaseMethod.getArity().isFixed() && releaseMethod.getArity().required() != 1) || releaseMethod.getArity().required() > 1) { throw runtime.newRuntimeError("wrong number of arguments to release method (" + 1 + " for " + releaseMethod.getArity().required() + ")"); } setMemoryIO(((Pointer) pointerArg).getMemoryIO()); this.pointer = (Pointer) pointerArg; this.size = pointer.size; this.typeSize = pointer.typeSize; setReaper(new Reaper(pointer, getMetaClass(), classData.releaseCallSite)); return this; }
@Override @JRubyMethod(name = "initialize", visibility = PRIVATE) public final IRubyObject initialize(ThreadContext context, IRubyObject pointerArg, IRubyObject releaser) { checkPointer(context.runtime, pointerArg); setMemoryIO(((Pointer) pointerArg).getMemoryIO()); this.pointer = (Pointer) pointerArg; this.size = pointer.size; this.typeSize = pointer.typeSize; Object ffiHandle = releaser.getMetaClass().getFFIHandleAccessorField().getVariableAccessorForRead().get(releaser); if (!(ffiHandle instanceof ReleaserData)) { getMetaClass().setFFIHandle(ffiHandle = new ReleaserData()); } ReleaserData releaserData = (ReleaserData) ffiHandle; DynamicMethod releaseMethod = releaserData.releaseCallSite.retrieveCache(releaser.getMetaClass(), releaserData.releaseCallSite.getMethodName()).method; // If no release method is defined, then memory leaks will result. if (releaseMethod.isUndefined()) { throw context.runtime.newRuntimeError("call method undefined"); } else if ((releaseMethod.getArity().isFixed() && releaseMethod.getArity().required() != 1) || releaseMethod.getArity().required() > 1) { throw context.runtime.newRuntimeError("wrong number of arguments to call method (" + 1 + " for " + releaseMethod.getArity().required() + ")"); } setReaper(new Reaper(pointer, releaser, releaserData.releaseCallSite)); return this; }
@Override @JRubyMethod(name = "initialize", visibility = PRIVATE) public final IRubyObject initialize(ThreadContext context, IRubyObject pointerArg) { Ruby runtime = context.runtime; checkPointer(runtime, pointerArg); Object ffiHandle = getMetaClass().getFFIHandle(); if (!(ffiHandle instanceof ClassData)) { getMetaClass().setFFIHandle(ffiHandle = new ClassData()); } ClassData classData = (ClassData) ffiHandle; // If no release method is defined, then memory leaks will result. DynamicMethod releaseMethod = classData.releaseCallSite.retrieveCache(getMetaClass().getMetaClass(), classData.releaseCallSite.getMethodName()).method; if (releaseMethod.isUndefined()) { throw runtime.newRuntimeError("release method undefined"); } else if ((releaseMethod.getArity().isFixed() && releaseMethod.getArity().required() != 1) || releaseMethod.getArity().required() > 1) { throw runtime.newRuntimeError("wrong number of arguments to release method (" + 1 + " for " + releaseMethod.getArity().required() + ")"); } setMemoryIO(((Pointer) pointerArg).getMemoryIO()); this.pointer = (Pointer) pointerArg; this.size = pointer.size; this.typeSize = pointer.typeSize; setReaper(new Reaper(pointer, getMetaClass(), classData.releaseCallSite)); return this; }
@Override @JRubyMethod(name = "initialize", visibility = PRIVATE) public final IRubyObject initialize(ThreadContext context, IRubyObject pointerArg, IRubyObject releaser) { checkPointer(context.runtime, pointerArg); setMemoryIO(((Pointer) pointerArg).getMemoryIO()); this.pointer = (Pointer) pointerArg; this.size = pointer.size; this.typeSize = pointer.typeSize; Object ffiHandle = releaser.getMetaClass().getFFIHandleAccessorField().getVariableAccessorForRead().get(releaser); if (!(ffiHandle instanceof ReleaserData)) { getMetaClass().setFFIHandle(ffiHandle = new ReleaserData()); } ReleaserData releaserData = (ReleaserData) ffiHandle; DynamicMethod releaseMethod = releaserData.releaseCallSite.retrieveCache(releaser.getMetaClass(), releaserData.releaseCallSite.getMethodName()).method; // If no release method is defined, then memory leaks will result. if (releaseMethod.isUndefined()) { throw context.runtime.newRuntimeError("call method undefined"); } else if ((releaseMethod.getArity().isFixed() && releaseMethod.getArity().required() != 1) || releaseMethod.getArity().required() > 1) { throw context.runtime.newRuntimeError("wrong number of arguments to call method (" + 1 + " for " + releaseMethod.getArity().required() + ")"); } setReaper(new Reaper(pointer, releaser, releaserData.releaseCallSite)); return this; }
@Override @JRubyMethod(name = "initialize", visibility = PRIVATE) public final IRubyObject initialize(ThreadContext context, IRubyObject pointerArg) { Ruby runtime = context.runtime; checkPointer(runtime, pointerArg); Object ffiHandle = getMetaClass().getFFIHandle(); if (!(ffiHandle instanceof ClassData)) { getMetaClass().setFFIHandle(ffiHandle = new ClassData()); } ClassData classData = (ClassData) ffiHandle; // If no release method is defined, then memory leaks will result. DynamicMethod releaseMethod = classData.releaseCallSite.retrieveCache(getMetaClass().getMetaClass(), classData.releaseCallSite.getMethodName()).method; if (releaseMethod.isUndefined()) { throw runtime.newRuntimeError("release method undefined"); } else if ((releaseMethod.getArity().isFixed() && releaseMethod.getArity().required() != 1) || releaseMethod.getArity().required() > 1) { throw runtime.newRuntimeError("wrong number of arguments to release method (" + 1 + " for " + releaseMethod.getArity().required() + ")"); } setMemoryIO(((Pointer) pointerArg).getMemoryIO()); this.pointer = (Pointer) pointerArg; this.size = pointer.size; this.typeSize = pointer.typeSize; setReaper(new Reaper(pointer, getMetaClass(), classData.releaseCallSite)); return this; }
@Override @JRubyMethod(name = "initialize", visibility = PRIVATE) public final IRubyObject initialize(ThreadContext context, IRubyObject pointerArg, IRubyObject releaser) { checkPointer(context.runtime, pointerArg); setMemoryIO(((Pointer) pointerArg).getMemoryIO()); this.pointer = (Pointer) pointerArg; this.size = pointer.size; this.typeSize = pointer.typeSize; Object ffiHandle = releaser.getMetaClass().getFFIHandleAccessorField().getVariableAccessorForRead().get(releaser); if (!(ffiHandle instanceof ReleaserData)) { getMetaClass().setFFIHandle(ffiHandle = new ReleaserData()); } ReleaserData releaserData = (ReleaserData) ffiHandle; DynamicMethod releaseMethod = releaserData.releaseCallSite.retrieveCache(releaser.getMetaClass(), releaserData.releaseCallSite.getMethodName()).method; // If no release method is defined, then memory leaks will result. if (releaseMethod.isUndefined()) { throw context.runtime.newRuntimeError("call method undefined"); } else if ((releaseMethod.getArity().isFixed() && releaseMethod.getArity().required() != 1) || releaseMethod.getArity().required() > 1) { throw context.runtime.newRuntimeError("wrong number of arguments to call method (" + 1 + " for " + releaseMethod.getArity().required() + ")"); } setReaper(new Reaper(pointer, releaser, releaserData.releaseCallSite)); return this; }
public void run() { referenceSet.remove(this); Ruby runtime = null; ThreadContext ctx = null; Reaper r = head; while (r != null) { if (!r.released && !r.unmanaged) { if (r.getRuntime() != runtime) { runtime = r.getRuntime(); ctx = runtime.getCurrentContext(); } r.dispose(ctx); } r = r.next; } } }
public void run() { referenceSet.remove(this); Ruby runtime = null; ThreadContext ctx = null; Reaper r = head; while (r != null) { if (!r.released && !r.unmanaged) { if (r.getRuntime() != runtime) { runtime = r.getRuntime(); ctx = runtime.getCurrentContext(); } r.dispose(ctx); } r = r.next; } } }
public void run() { referenceSet.remove(this); Ruby runtime = null; ThreadContext ctx = null; Reaper r = head; while (r != null) { if (!r.released && !r.unmanaged) { if (r.getRuntime() != runtime) { runtime = r.getRuntime(); ctx = runtime.getCurrentContext(); } r.dispose(ctx); } r = r.next; } } }
@JRubyMethod(name = "autorelease=") public final IRubyObject autorelease(ThreadContext context, IRubyObject autorelease) { Reaper r = reaper; if (r == null || r.released) { throw context.runtime.newRuntimeError("pointer already freed"); } r.autorelease(autorelease.isTrue()); return context.runtime.getNil(); }
public final void release(ThreadContext context) { if (!released) { released = true; dispose(context); } }
public final void release(ThreadContext context) { if (!released) { released = true; dispose(context); } }
public final void release(ThreadContext context) { if (!released) { released = true; dispose(context); } }
@JRubyMethod(name = "free") public final IRubyObject free(ThreadContext context) { Reaper r = reaper; if (r == null || r.released) { throw context.runtime.newRuntimeError("pointer already freed"); } r.release(context); reaper = null; referent = null; return context.runtime.getNil(); }
@JRubyMethod(name = "autorelease=") public final IRubyObject autorelease(ThreadContext context, IRubyObject autorelease) { Reaper r = reaper; if (r == null || r.released) { throw context.runtime.newRuntimeError("pointer already freed"); } r.autorelease(autorelease.isTrue()); return context.nil; }
@JRubyMethod(name = "free") public final IRubyObject free(ThreadContext context) { Reaper r = reaper; if (r == null || r.released) { throw context.runtime.newRuntimeError("pointer already freed"); } r.release(context); reaper = null; referent = null; return context.runtime.getNil(); }
@JRubyMethod(name = "free") public final IRubyObject free(ThreadContext context) { Reaper r = reaper; if (r == null || r.released) { throw context.runtime.newRuntimeError("pointer already freed"); } r.release(context); reaper = null; referent = null; return context.nil; }