static jint doAttach(SharedMemoryTransport *transport) { transport->shared->attachingPID = sysProcessGetID(); CHECK_ERROR(sysEventSignal(transport->attachEvent)); CHECK_ERROR(sysEventWait(NULL, transport->acceptEvent)); return SYS_OK; }
/* * Enter/exit with stream mutex held. * On error, does not hold the stream mutex. */ static jint waitForData(SharedMemoryConnection *connection, Stream *stream) { jint error = SYS_OK; /* Assumes mutex is held on call */ while ((error == SYS_OK) && EMPTY(stream)) { CHECK_ERROR(leaveMutex(stream)); error = sysEventWait(connection->otherProcess, stream->hasData); if (error == SYS_OK) { CHECK_ERROR(enterMutex(stream, connection->shutdown)); } } return error; }
/* * Enter/exit with stream mutex held. * On error, does not hold the stream mutex. */ static jint waitForSpace(SharedMemoryConnection *connection, Stream *stream) { jint error = SYS_OK; /* Assumes mutex is held on call */ while ((error == SYS_OK) && FULL(stream)) { CHECK_ERROR(leaveMutex(stream)); error = sysEventWait(connection->otherProcess, stream->hasSpace, 0); if (error == SYS_OK) { CHECK_ERROR(enterMutex(stream, connection->shutdown)); } else { setLastError(error); } } return error; }
jint shmemBase_accept(SharedMemoryTransport *transport, long timeout, SharedMemoryConnection **connectionPtr) { jint error; SharedMemoryConnection *connection; clearLastError(); CHECK_ERROR(sysEventWait(NULL, transport->attachEvent, timeout)); error = createConnection(transport, transport->shared->attachingPID, &connection); if (error != SYS_OK) { /* * Reject the attacher */ transport->shared->isAccepted = JNI_FALSE; sysEventSignal(transport->acceptEvent); freeConnection(connection); return error; } transport->shared->isAccepted = JNI_TRUE; error = sysEventSignal(transport->acceptEvent); if (error != SYS_OK) { /* * No real point trying to reject it. */ closeConnection(connection); return error; } *connectionPtr = connection; return SYS_OK; }