synchronized void Process() throws InlineJavaException, InlineJavaPerlException { Object ret = null; try { InlineJavaProtocol ijp = new InlineJavaProtocol(ijs, null); String cmd = GetCommand(ijp); InlineJavaUtils.debug(2, "callback command: " + cmd); Thread t = Thread.currentThread(); String resp = null; while (true) { InlineJavaUtils.debug(3, "packet sent (callback) is " + cmd); if (!ijs.IsJNI()) { // Client-server mode. InlineJavaServerThread ijt = (InlineJavaServerThread) t; ijt.GetWriter().write(cmd + "\n"); ijt.GetWriter().flush(); resp = ijt.GetReader().readLine(); } else { // JNI mode resp = ijs.jni_callback(cmd); } InlineJavaUtils.debug(3, "packet recv (callback) is " + resp); StringTokenizer st = new StringTokenizer(resp, " "); String c = st.nextToken(); if (c.equals("callback")) { boolean thrown = new Boolean(st.nextToken()).booleanValue(); String arg = st.nextToken(); InlineJavaClass ijc = new InlineJavaClass(ijs, ijp); ret = ijc.CastArgument(cast, arg); if (thrown) { throw new InlineJavaPerlException(ret); } break; } else { // Pass it on through the regular channel... InlineJavaUtils.debug(3, "packet is not callback response: " + resp); cmd = ijs.ProcessCommand(resp, false); continue; } } } catch (IOException e) { throw new InlineJavaException("IO error: " + e.getMessage()); } response = ret; response_set = true; }
synchronized Object WaitForResponse(Thread t) { while (!response_set) { try { InlineJavaUtils.debug(3, "waiting for callback response in " + t.getName() + "..."); wait(); } catch (InterruptedException ie) { // Do nothing, return and wait() some more... } } InlineJavaUtils.debug(3, "got callback response"); Object resp = response; response = null; response_set = false; return resp; }
synchronized void NotifyOfResponse(Thread t) { InlineJavaUtils.debug(3, "notifying that callback has completed in " + t.getName()); notify(); }