Author: mturk
Date: Mon Aug 8 11:26:12 2011
New Revision: 1154920
URL: http://svn.apache.org/viewvc?rev=1154920&view=rev
Log:
Add simple IPC test case and some fixes to make it work
Added:
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestIpc.java
(with props)
Modified:
commons/sandbox/runtime/trunk/build.xml
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IpcDescriptor.java
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IpcServerEndpoint.java
commons/sandbox/runtime/trunk/src/main/native/os/win32/arch_ipcs.h
commons/sandbox/runtime/trunk/src/main/native/os/win32/init.c
commons/sandbox/runtime/trunk/src/main/native/os/win32/ipcsock.c
commons/sandbox/runtime/trunk/src/main/native/os/win32/semaphore.c
Modified: commons/sandbox/runtime/trunk/build.xml
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/build.xml?rev=1154920&r1=1154919&r2=1154920&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/build.xml (original)
+++ commons/sandbox/runtime/trunk/build.xml Mon Aug 8 11:26:12 2011
@@ -430,6 +430,17 @@ The Apache Software Foundation (http://w
</sequential>
</parallel>
</target>
+ <target name="testipcs" depends="tests">
+ <parallel>
+ <sequential>
+ <runtest groups="init,ipcs.parent" name="ipcs.parent"/>
+ </sequential>
+ <sequential>
+ <sleep milliseconds="100" />
+ <runtest groups="init,ipcs.child" name="ipcs.child"/>
+ </sequential>
+ </parallel>
+ </target>
<!-- ===================================================================
-->
<!-- Run Example
-->
Modified:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IpcDescriptor.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IpcDescriptor.java?rev=1154920&r1=1154919&r2=1154920&view=diff
==============================================================================
---
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IpcDescriptor.java
(original)
+++
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IpcDescriptor.java
Mon Aug 8 11:26:12 2011
@@ -34,7 +34,7 @@ final class IpcDescriptor extends Descri
{
private static native int close0(long fd);
- private static native long create0(int flags)
+ private static native long create0()
throws IOException;
private static native long socket0(int type, boolean blocking)
throws IOException;
@@ -60,31 +60,25 @@ final class IpcDescriptor extends Descri
closed = false;
}
- public void create(AddressFamily af, SocketType type)
- throws IOException
- {
- create(af, type, true);
- }
-
- public void create(AddressFamily af, SocketType type, boolean blocking)
+ public void create()
throws IOException
{
if (valid())
close0(fd);
- fd = socket0(type.valueOf(), blocking);
+ fd = create0();
closed = false;
}
public void create(SocketType type)
throws IOException
{
- create(type, false);
+ create(type, true);
}
public void create(SocketType type, boolean blocking)
throws IOException
{
- this.fd = create0(0);
+ this.fd = socket0(type.valueOf(), blocking);
closed = false;
}
Modified:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IpcServerEndpoint.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IpcServerEndpoint.java?rev=1154920&r1=1154919&r2=1154920&view=diff
==============================================================================
---
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IpcServerEndpoint.java
(original)
+++
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/IpcServerEndpoint.java
Mon Aug 8 11:26:12 2011
@@ -164,7 +164,7 @@ public class IpcServerEndpoint extends S
if (bound)
throw new IOException(Local.sm.get("endpoint.EBOUND"));
if (sd.closed())
- sd.create(SocketType.STREAM, blocking);
+ sd.create();
if (backlog == 0)
backlog = LISTEN_BACKLOG;
int rc = bind0(sd.fd(), endpoint.sockaddr(), backlog);
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/arch_ipcs.h
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/arch_ipcs.h?rev=1154920&r1=1154919&r2=1154920&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/arch_ipcs.h
(original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/arch_ipcs.h Mon Aug
8 11:26:12 2011
@@ -382,8 +382,6 @@ struct IPCSERVER
* evet so writter can continue with writting.
*/
-#define ACR_DESC_PTR(D, T) ((D) == 0) ? 0 : (T)((J2P(D, acr_sd_t *))->p)
-
#if defined(__cplusplus)
extern "C" {
#endif
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/init.c
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/init.c?rev=1154920&r1=1154919&r2=1154920&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/init.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/init.c Mon Aug 8
11:26:12 2011
@@ -33,6 +33,7 @@ LPSYSTEM_INFO acr_osinf = &osi
LPOSVERSIONINFOEXA acr_osver = &osver;
HANDLE acr_raised_event = 0;
HANDLE acr_alived_mutex = 0;
+extern int AcrIpcInit(void);
typedef struct tlsd_t
{
@@ -167,6 +168,8 @@ JNI_OnLoad(JavaVM *vm, void *reserved)
return JNI_ERR;
if (AcrInitCoreClasses(env) == JNI_FALSE)
return JNI_ERR;
+ if (AcrIpcInit() != 0)
+ return JNI_ERR;
return JNI_VERSION_1_4;
}
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/ipcsock.c
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/ipcsock.c?rev=1154920&r1=1154919&r2=1154920&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/ipcsock.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/ipcsock.c Mon Aug 8
11:26:12 2011
@@ -143,7 +143,7 @@ AcquireMutex(HANDLE hMutex)
WaitForSingleObject(hMutex, INFINITE);
}
-ACR_NET_EXPORT(jint, IpcEndpoint, init0)(JNI_STDARGS)
+int AcrIpcInit()
{
static int inited = 0;
@@ -203,7 +203,6 @@ AcrIpcRemoteOpen(LPCSTR szAddress)
goto failed;
if ((pr->s = MapViewOfFile(pr->hServerMeta, FILE_MAP_ALL_ACCESS, 0, 0, 0))
== 0)
goto failed;
- printf("[client] Opened server mapping for process %d of size %d\n",
pr->s->dwProcessId, pr->s->Queue.dwSize);
if ((pr->hServerProc = OpenProcess(STANDARD_RIGHTS_ALL |
PROCESS_DUP_HANDLE,
FALSE, pr->s->dwProcessId)) == 0)
goto failed;
@@ -349,8 +348,14 @@ ACR_NET_EXPORT(jint, IpcServerEndpoint,
DWORD dwShareLen;
DWORD dwShareSiz = backlog * sizeof(IPCSOCK_ACCEPT) +
sizeof(IPCSOCK_SERVER);
acr_sockaddr_t *ca = SOCKADDR_CAST(cb);
- LPIPCSERVER sp = ACR_DESC_PTR(fp, LPIPCSERVER);
+ acr_sd_t *ss = J2P(fp, acr_sd_t *);
+ LPIPCSERVER sp;
+ if (ss == 0 || ss->p == 0) {
+ SOCKADDR_RELEASE(cb, ca);
+ return ACR_EBADF;
+ }
+ sp = (LPIPCSERVER)ss->p;
if (sp->hServerMap != 0) {
SOCKADDR_RELEASE(cb, ca);
return WSAEISCONN;
@@ -374,8 +379,8 @@ ACR_NET_EXPORT(jint, IpcServerEndpoint,
sp->s->nAcceptSema = H2DW(sp->hAcceptSema);
sp->s->nAcceptSync = H2DW(sp->hAcceptSync);
sp->s->nAcceptLock = H2DW(sp->hAcceptLock);
-
SOCKADDR_RELEASE(cb, ca);
+
return 0;
failed:
rc = GetLastError();
@@ -2032,12 +2037,13 @@ ACR_NET_EXPORT(jint, IpcEndpoint, connec
return ACR_EBADF;
ca = SOCKADDR_CAST(cb);
rc = AcrIpcConnect(AcrIpcSdRetain(sd), ca->hostname, timeout);
+ fflush(stdout);
SOCKADDR_RELEASE(cb, ca);
AcrSdRelease(sd);
return rc;
}
-ACR_NET_EXPORT(jlong, IpcDescriptor, create0)(JNI_STDARGS, jint flags)
+ACR_NET_EXPORT(jlong, IpcDescriptor, create0)(JNI_STDARGS)
{
acr_sd_t *sd;
IPCSERVER *sp;
@@ -2053,7 +2059,6 @@ ACR_NET_EXPORT(jlong, IpcDescriptor, cre
}
ACR_RING_INIT(&sp->rConnections, IPCSOCK, rLink);
sd->p = sp;
- sd->flags = flags;
sd->refs = 1;
sd->type = ACR_DT_IPCSERVER;
sp->nReferences = 1;
@@ -2092,10 +2097,11 @@ ACR_NET_EXPORT(jlong, IpcDescriptor, soc
ACR_NET_EXPORT(jint, IpcDescriptor, close0)(JNI_STDARGS, jlong fp)
{
- int rc = WSAENOTSOCK;
+ int rc = WSAENOTSOCK;
acr_sd_t *sd = J2P(fp, acr_sd_t *);
LPVOID sock;
int type;
+
if (sd == 0)
return ACR_EBADF;
sock = InterlockedExchangePointer(&sd->p, 0);
@@ -2103,7 +2109,7 @@ ACR_NET_EXPORT(jint, IpcDescriptor, clos
AcrSdRelease(sd);
if (sock == 0)
return ACR_EBADF;
- if (sd->type == ACR_DT_IPCSERVER) {
+ if (type == ACR_DT_IPCSERVER) {
LPIPCSERVER sp = sock;
sp->bClosed = TRUE;
SetEvent(sp->hAcceptSync);
@@ -2112,7 +2118,7 @@ ACR_NET_EXPORT(jint, IpcDescriptor, clos
else
rc = 0;
}
- else if (sd->type == ACR_DT_IPCSOCK) {
+ else if (type == ACR_DT_IPCSOCK) {
rc = AcrIpcSocketClose(sock);
}
return rc;
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/semaphore.c
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/semaphore.c?rev=1154920&r1=1154919&r2=1154920&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/semaphore.c
(original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/semaphore.c Mon Aug
8 11:26:12 2011
@@ -83,7 +83,7 @@ ACR_WIN_EXPORT(jint, WindowsSemaphore, o
HANDLE h = 0;
WITH_WSTR(name) {
- h = OpenSemaphoreW(READ_CONTROL | SEMAPHORE_MODIFY_STATE, FALSE,
J2S(name));
+ h = OpenSemaphoreW(SYNCHRONIZE | READ_CONTROL |
SEMAPHORE_MODIFY_STATE, FALSE, J2S(name));
if (h == 0) {
ACR_THROW_SYS_ERRNO();
}
Added:
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestIpc.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestIpc.java?rev=1154920&view=auto
==============================================================================
---
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestIpc.java
(added)
+++
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestIpc.java
Mon Aug 8 11:26:12 2011
@@ -0,0 +1,106 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.runtime.net;
+
+import java.io.IOException;
+import java.io.File;
+import org.testng.annotations.*;
+import org.testng.Assert;
+
+import org.apache.commons.runtime.io.Descriptor;
+import org.apache.commons.runtime.Semaphore;
+
+public class TestIpc extends Assert
+{
+
+ private static final String semname = "acrSemp23";
+ private static final String ipcname = "acrIpcs23";
+
+
+ private void parentInit()
+ throws Exception
+ {
+ try {
+ Semaphore.remove(semname);
+ } catch (Exception x) {
+ // Ignore
+ }
+ Semaphore s = Semaphore.create(semname, 1);
+ assertNotNull(s);
+ }
+
+ private void childInit()
+ throws Exception
+ {
+ Semaphore s = null;
+ int step = 125;
+ while (step <= 2000) {
+ try {
+ s = Semaphore.open(semname);
+ break;
+ } catch (Exception x) {
+
+ }
+ Thread.sleep(step);
+ step *= 2;
+ }
+ assertNotNull(s);
+ s.acquire();
+ }
+
+ @Test(groups = { "ipcs.parent" })
+ public void ipcSimpleAccept()
+ throws Exception
+ {
+ System.out.println("[parent] Creating ipc server" );
+ System.out.flush();
+ parentInit();
+ IpcServerEndpoint ss = new IpcServerEndpoint();
+ IpcEndpointAddress sa = new IpcEndpointAddress(ipcname);
+ ss.configureBlocking(false);
+ ss.bind(sa);
+ System.out.println("[parent] Waiting for a child to connect");
+ System.out.flush();
+ IpcEndpoint ec = ss.accept();
+ assertNotNull(ec);
+ System.out.println("[parent] Accepted.");
+ System.out.flush();
+ ss.close();
+ ec.close();
+ System.out.println("[parent] Done.");
+ System.out.flush();
+ }
+
+ @Test(groups = { "ipcs.child" })
+ public void ipcSimpleConnect()
+ throws Exception
+ {
+ childInit();
+
+ System.out.println("[child] Connecting");
+ System.out.flush();
+ IpcEndpointAddress sa = new IpcEndpointAddress(ipcname);
+
+ IpcEndpoint cs = new IpcEndpoint();
+ cs.connect(sa);
+ assertTrue(cs.isBlocking());
+ cs.close();
+ System.out.println("[child] Done.");
+ System.out.flush();
+ }
+
+}
Propchange:
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestIpc.java
------------------------------------------------------------------------------
svn:eol-style = native