You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/09/27 09:28:21 UTC
svn commit: r819266 - in /commons/sandbox/runtime/trunk/src:
main/native/os/darwin/ main/native/os/unix/ test/org/apache/commons/runtime/
Author: mturk
Date: Sun Sep 27 07:28:20 2009
New Revision: 819266
URL: http://svn.apache.org/viewvc?rev=819266&view=rev
Log:
Few fixes and test suite tuning
Modified:
commons/sandbox/runtime/trunk/src/main/native/os/darwin/mutex.c
commons/sandbox/runtime/trunk/src/main/native/os/unix/mutex.c
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestParallel.java
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestSignal.java
Modified: commons/sandbox/runtime/trunk/src/main/native/os/darwin/mutex.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/darwin/mutex.c?rev=819266&r1=819265&r2=819266&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/darwin/mutex.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/darwin/mutex.c Sun Sep 27 07:28:20 2009
@@ -14,11 +14,7 @@
* limitations under the License.
*/
-/* File lock based mutex implementation.
- * XXX: Darwin uses posix semaphores so they could
- * probably be used for mutexes as well.
- * Of course they don't have a descent API for
- * setting the permissions afterwards.
+/* System V mutex implementation.
*/
#include "acr.h"
@@ -61,7 +57,245 @@
acr_uint32_t value; /* Maximum semaphore value */
} semblock_t;
-#if defined(ACR_USE_SYSV_MUTEX)
+#if defined(ACR_USE_FCNTL_MUTEX)
+
+static int mutex_cleanup(void *mutex, int type, unsigned int flags)
+{
+ if (type == ACR_DT_MUTEX) {
+ int rc = ACR_EBADF;
+ acr_pmutex_t *m = (acr_pmutex_t *)mutex;
+ if (m->filedes > 0) {
+ if (m->locked) {
+ struct flock op;
+
+ op.l_whence = SEEK_SET; /* from current point */
+ op.l_start = 0; /* -"- */
+ op.l_len = 0; /* until end of file */
+ op.l_type = F_UNLCK; /* unlock */
+ op.l_pid = 0; /* pid not actually interesting */
+ do {
+ rc = fcntl(m->filedes, F_SETLKW, &op);
+ } while (rc < 0 && errno == EINTR);
+
+ }
+ close(m->filedes);
+ rc = ACR_SUCCESS;
+ }
+ if (m->filename) {
+ if (access(m->filename, F_OK) == 0) {
+ /* File exists. Remove it */
+ if (unlink(m->filename))
+ rc = ACR_GET_OS_ERROR();
+ }
+ x_free((void *)(m->filename));
+ }
+ x_free(m);
+ return rc;
+ }
+ return ACR_EFTYPE;
+}
+
+ACR_DECLARE(int) ACR_ProcMutexCreate(JNIEnv *_E, const acr_pchar_t *fname)
+{
+ int rc = 0;
+ int anon = 0;
+ acr_pmutex_t *m;
+
+ m = ACR_Calloc(_E, THROW_FMARK, sizeof(acr_pmutex_t));
+ if (!m)
+ return -1;
+ if (!fname) {
+ anon = 1;
+ fname = "/tmp/apmXXXXXX";
+ }
+ m->filename = ACR_StrdupA(_E, THROW_FMARK, fname);
+ if (!m->filename) {
+ rc = ACR_GET_OS_ERROR();
+ free(m);
+ ACR_SET_OS_ERROR(rc);
+ return -1;
+ }
+ if (anon)
+ m->filedes = mkstemp((char *)m->filename);
+ else
+ m->filedes = open(m->filename, O_CREAT | O_WRONLY | O_EXCL, 0660);
+
+ if (m->filedes < 0) {
+ rc = ACR_GET_OS_ERROR();
+ goto finally;
+ }
+ m->locked = 0;
+
+finally:
+ if (rc) {
+ x_free((void *)(m->filename));
+ x_free(m);
+ ACR_THROW_IO_IF_ERR(rc);
+ return -1;
+ }
+ else {
+ rc = acr_ioh_open(m, ACR_DT_MUTEX, 0, mutex_cleanup);
+ return rc;
+ }
+}
+
+ACR_DECLARE(int) ACR_ProcMutexAttach(JNIEnv *_E, const acr_pchar_t *fname)
+{
+ int rc = 0;
+ acr_pmutex_t *m;
+
+ if (!fname) {
+ /* Cannot attach to unnamed mutex */
+ ACR_THROW_IO_IF_ERR(ACR_EINVAL);
+ return -1;
+ }
+ m = ACR_Calloc(_E, THROW_FMARK, sizeof(acr_pmutex_t));
+ if (!m)
+ return -1;
+ m->filedes = open(fname, O_WRONLY);
+ if (m->filedes < 0) {
+ rc = ACR_GET_OS_ERROR();
+ goto finally;
+ }
+ m->locked = 0;
+
+finally:
+ if (rc) {
+ x_free((void *)(m->filename));
+ x_free(m);
+ ACR_THROW_IO_IF_ERR(rc);
+ return -1;
+ }
+ else {
+ rc = acr_ioh_open(m, ACR_DT_MUTEX, 1, mutex_cleanup);
+ return rc;
+ }
+ return -1;
+}
+
+ACR_DECLARE(int) ACR_ProcMutexLock(JNIEnv *_E, int mutex)
+{
+ int rc;
+ struct flock op;
+ acr_pmutex_t *m = (acr_pmutex_t *)ACR_IOH_FDATA(mutex);
+
+ if (ACR_IOH_FTYPE(mutex) != ACR_DT_MUTEX) {
+ return ACR_EFTYPE;
+ }
+ if (IS_INVALID_HANDLE(m)) {
+ return ACR_EBADF;
+ }
+ op.l_whence = SEEK_SET; /* from current point */
+ op.l_start = 0; /* -"- */
+ op.l_len = 0; /* until end of file */
+ op.l_type = F_WRLCK; /* set exclusive/write lock */
+ op.l_pid = 0; /* pid not actually interesting */
+
+
+ do {
+ rc = fcntl(m->filedes, F_SETLKW, &op);
+ } while (rc < 0 && errno == EINTR);
+
+ if (rc < 0)
+ return ACR_GET_OS_ERROR();
+ m->locked = 1;
+
+ return ACR_SUCCESS;
+}
+
+ACR_DECLARE(int) ACR_ProcMutexTryLock(JNIEnv *_E, int mutex)
+{
+ int rc;
+ struct flock op;
+ acr_pmutex_t *m = (acr_pmutex_t *)ACR_IOH_FDATA(mutex);
+
+ if (ACR_IOH_FTYPE(mutex) != ACR_DT_MUTEX) {
+ return ACR_EFTYPE;
+ }
+ if (IS_INVALID_HANDLE(m)) {
+ return ACR_EBADF;
+ }
+ op.l_whence = SEEK_SET; /* from current point */
+ op.l_start = 0; /* -"- */
+ op.l_len = 0; /* until end of file */
+ op.l_type = F_WRLCK; /* set exclusive/write lock */
+ op.l_pid = 0; /* pid not actually interesting */
+
+ do {
+ rc = fcntl(m->filedes, F_SETLK, &op);
+ } while (rc < 0 && errno == EINTR);
+
+ if (rc < 0) {
+ if (errno == EAGAIN) {
+ return ACR_EBUSY;
+ }
+ }
+ else
+ m->locked = 1;
+
+ return ACR_SUCCESS;;
+}
+
+ACR_DECLARE(int) ACR_ProcMutexRelease(JNIEnv *_E, int mutex)
+{
+ int rc;
+ struct flock op;
+ acr_pmutex_t *m = (acr_pmutex_t *)ACR_IOH_FDATA(mutex);
+
+ if (ACR_IOH_FTYPE(mutex) != ACR_DT_MUTEX) {
+ return ACR_EFTYPE;
+ }
+ if (IS_INVALID_HANDLE(m)) {
+ return ACR_EBADF;
+ }
+ m->locked = 0;
+ op.l_whence = SEEK_SET; /* from current point */
+ op.l_start = 0; /* -"- */
+ op.l_len = 0; /* until end of file */
+ op.l_type = F_UNLCK; /* unlock */
+ op.l_pid = 0; /* pid not actually interesting */
+ do {
+ rc = fcntl(m->filedes, F_SETLKW, &op);
+ } while (rc < 0 && errno == EINTR);
+
+ if (rc < 0)
+ return ACR_GET_OS_ERROR();
+ else
+ return ACR_SUCCESS;
+}
+
+ACR_DECLARE(int) ACR_ProcMutexPermSet(JNIEnv *_E, int mutex, int perms,
+ acr_uid_t uid, acr_uid_t gid)
+{
+ acr_pmutex_t *m = (acr_pmutex_t *)ACR_IOH_FDATA(mutex);
+
+ if (ACR_IOH_FTYPE(mutex) != ACR_DT_MUTEX) {
+ return ACR_EFTYPE;
+ }
+ if (IS_INVALID_HANDLE(m)) {
+ return ACR_EBADF;
+ }
+ if (!(perms & ACR_FPROT_GSETID))
+ gid = -1;
+ if (fchown(m->filedes, uid, gid) < 0) {
+ return ACR_GET_OS_ERROR();
+ }
+ else
+ return ACR_SUCCESS;
+}
+
+ACR_DECLARE(int) ACR_ProcMutexRemove(JNIEnv *_E, const acr_pchar_t *filename)
+{
+
+ if (unlink(filename)) {
+ ACR_THROW_IO_ERRNO();
+ return ACR_GET_OS_ERROR();
+ }
+ else
+ return ACR_SUCCESS;
+}
+
+#else /* ACR_USE_FCNTL_MUTEX */
static int mutex_owner_cleanup(void *mutex, int type, unsigned int flags)
{
@@ -419,244 +653,6 @@
return rc;
}
-#else /* ACR_USE_SYSV_MUTEX */
-
-static int mutex_cleanup(void *mutex, int type, unsigned int flags)
-{
- if (type == ACR_DT_MUTEX) {
- int rc = ACR_EBADF;
- acr_pmutex_t *m = (acr_pmutex_t *)mutex;
- if (m->filedes > 0) {
- if (m->locked) {
- struct flock op;
-
- op.l_whence = SEEK_SET; /* from current point */
- op.l_start = 0; /* -"- */
- op.l_len = 0; /* until end of file */
- op.l_type = F_UNLCK; /* unlock */
- op.l_pid = 0; /* pid not actually interesting */
- do {
- rc = fcntl(m->filedes, F_SETLKW, &op);
- } while (rc < 0 && errno == EINTR);
-
- }
- close(m->filedes);
- rc = ACR_SUCCESS;
- }
- if (m->filename) {
- if (access(m->filename, F_OK) == 0) {
- /* File exists. Remove it */
- if (unlink(m->filename))
- rc = ACR_GET_OS_ERROR();
- }
- x_free((void *)(m->filename));
- }
- x_free(m);
- return rc;
- }
- return ACR_EFTYPE;
-}
-
-ACR_DECLARE(int) ACR_ProcMutexCreate(JNIEnv *_E, const acr_pchar_t *fname)
-{
- int rc = 0;
- int anon = 0;
- acr_pmutex_t *m;
-
- m = ACR_Calloc(_E, THROW_FMARK, sizeof(acr_pmutex_t));
- if (!m)
- return -1;
- if (!fname) {
- anon = 1;
- fname = "/tmp/apmXXXXXX";
- }
- m->filename = ACR_StrdupA(_E, THROW_FMARK, fname);
- if (!m->filename) {
- rc = ACR_GET_OS_ERROR();
- free(m);
- ACR_SET_OS_ERROR(rc);
- return -1;
- }
- if (anon)
- m->filedes = mkstemp((char *)m->filename);
- else
- m->filedes = open(m->filename, O_CREAT | O_WRONLY | O_EXCL, 0660);
-
- if (m->filedes < 0) {
- rc = ACR_GET_OS_ERROR();
- goto finally;
- }
- m->locked = 0;
-
-finally:
- if (rc) {
- x_free((void *)(m->filename));
- x_free(m);
- ACR_THROW_IO_IF_ERR(rc);
- return -1;
- }
- else {
- rc = acr_ioh_open(m, ACR_DT_MUTEX, 0, mutex_cleanup);
- return rc;
- }
-}
-
-ACR_DECLARE(int) ACR_ProcMutexAttach(JNIEnv *_E, const acr_pchar_t *fname)
-{
- int rc = 0;
- acr_pmutex_t *m;
-
- if (!fname) {
- /* Cannot attach to unnamed mutex */
- ACR_THROW_IO_IF_ERR(ACR_EINVAL);
- return -1;
- }
- m = ACR_Calloc(_E, THROW_FMARK, sizeof(acr_pmutex_t));
- if (!m)
- return -1;
- m->filedes = open(fname, O_WRONLY);
- if (m->filedes < 0) {
- rc = ACR_GET_OS_ERROR();
- goto finally;
- }
- m->locked = 0;
-
-finally:
- if (rc) {
- x_free((void *)(m->filename));
- x_free(m);
- ACR_THROW_IO_IF_ERR(rc);
- return -1;
- }
- else {
- rc = acr_ioh_open(m, ACR_DT_MUTEX, 1, mutex_cleanup);
- return rc;
- }
- return -1;
-}
-
-ACR_DECLARE(int) ACR_ProcMutexLock(JNIEnv *_E, int mutex)
-{
- int rc;
- struct flock op;
- acr_pmutex_t *m = (acr_pmutex_t *)ACR_IOH_FDATA(mutex);
-
- if (ACR_IOH_FTYPE(mutex) != ACR_DT_MUTEX) {
- return ACR_EFTYPE;
- }
- if (IS_INVALID_HANDLE(m)) {
- return ACR_EBADF;
- }
- op.l_whence = SEEK_SET; /* from current point */
- op.l_start = 0; /* -"- */
- op.l_len = 0; /* until end of file */
- op.l_type = F_WRLCK; /* set exclusive/write lock */
- op.l_pid = 0; /* pid not actually interesting */
-
-
- do {
- rc = fcntl(m->filedes, F_SETLKW, &op);
- } while (rc < 0 && errno == EINTR);
-
- if (rc < 0)
- return ACR_GET_OS_ERROR();
- m->locked = 1;
-
- return ACR_SUCCESS;
-}
-
-ACR_DECLARE(int) ACR_ProcMutexTryLock(JNIEnv *_E, int mutex)
-{
- int rc;
- struct flock op;
- acr_pmutex_t *m = (acr_pmutex_t *)ACR_IOH_FDATA(mutex);
-
- if (ACR_IOH_FTYPE(mutex) != ACR_DT_MUTEX) {
- return ACR_EFTYPE;
- }
- if (IS_INVALID_HANDLE(m)) {
- return ACR_EBADF;
- }
- op.l_whence = SEEK_SET; /* from current point */
- op.l_start = 0; /* -"- */
- op.l_len = 0; /* until end of file */
- op.l_type = F_WRLCK; /* set exclusive/write lock */
- op.l_pid = 0; /* pid not actually interesting */
-
- do {
- rc = fcntl(m->filedes, F_SETLK, &op);
- } while (rc < 0 && errno == EINTR);
-
- if (rc < 0) {
- if (errno == EAGAIN) {
- return ACR_EBUSY;
- }
- }
- else
- m->locked = 1;
-
- return ACR_SUCCESS;;
-}
-
-ACR_DECLARE(int) ACR_ProcMutexRelease(JNIEnv *_E, int mutex)
-{
- int rc;
- struct flock op;
- acr_pmutex_t *m = (acr_pmutex_t *)ACR_IOH_FDATA(mutex);
-
- if (ACR_IOH_FTYPE(mutex) != ACR_DT_MUTEX) {
- return ACR_EFTYPE;
- }
- if (IS_INVALID_HANDLE(m)) {
- return ACR_EBADF;
- }
- m->locked = 0;
- op.l_whence = SEEK_SET; /* from current point */
- op.l_start = 0; /* -"- */
- op.l_len = 0; /* until end of file */
- op.l_type = F_UNLCK; /* unlock */
- op.l_pid = 0; /* pid not actually interesting */
- do {
- rc = fcntl(m->filedes, F_SETLKW, &op);
- } while (rc < 0 && errno == EINTR);
-
- if (rc < 0)
- return ACR_GET_OS_ERROR();
- else
- return ACR_SUCCESS;
-}
-
-ACR_DECLARE(int) ACR_ProcMutexPermSet(JNIEnv *_E, int mutex, int perms,
- acr_uid_t uid, acr_uid_t gid)
-{
- acr_pmutex_t *m = (acr_pmutex_t *)ACR_IOH_FDATA(mutex);
-
- if (ACR_IOH_FTYPE(mutex) != ACR_DT_MUTEX) {
- return ACR_EFTYPE;
- }
- if (IS_INVALID_HANDLE(m)) {
- return ACR_EBADF;
- }
- if (!(perms & ACR_FPROT_GSETID))
- gid = -1;
- if (fchown(m->filedes, uid, gid) < 0) {
- return ACR_GET_OS_ERROR();
- }
- else
- return ACR_SUCCESS;
-}
-
-ACR_DECLARE(int) ACR_ProcMutexRemove(JNIEnv *_E, const acr_pchar_t *filename)
-{
-
- if (unlink(filename)) {
- ACR_THROW_IO_ERRNO();
- return ACR_GET_OS_ERROR();
- }
- else
- return ACR_SUCCESS;
-}
-
#endif /* ACR_USE_SYSV_MUTEX */
ACR_DECLARE(int) ACR_ProcMutexClose(JNIEnv *_E, int mutex)
Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/mutex.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/mutex.c?rev=819266&r1=819265&r2=819266&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/mutex.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/mutex.c Sun Sep 27 07:28:20 2009
@@ -15,7 +15,8 @@
*/
/*
- * Posix semaphore implementation.
+ * System V semaphore implementation.
+ * define --enable-posix-mutex for Posix mutexes
*/
#include "acr.h"
Modified: commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestParallel.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestParallel.java?rev=819266&r1=819265&r2=819266&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestParallel.java (original)
+++ commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestParallel.java Sun Sep 27 07:28:20 2009
@@ -69,6 +69,11 @@
for (i = 0; i < workers.length; i++) {
workers[i].start();
}
+ try {
+ Thread.sleep(2000);
+ } catch (Throwable t) {
+ // Ignore
+ }
// Wait for all threads to finish
for (i = 0; i < workers.length; i++) {
try {
Modified: commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java?rev=819266&r1=819265&r2=819266&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java (original)
+++ commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java Sun Sep 27 07:28:20 2009
@@ -741,7 +741,7 @@
}
for (i = 0; i < 100; i++)
test053(fd[i]);
- synchronized (IohParallelWorker.class) {
+ synchronized (this) {
((IohParallelWorker)o).numCalls++;
}
for (i = 0; i < 100; i++) {
Modified: commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestSignal.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestSignal.java?rev=819266&r1=819265&r2=819266&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestSignal.java (original)
+++ commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestSignal.java Sun Sep 27 07:28:20 2009
@@ -26,6 +26,7 @@
public class TestSignal extends TestCase
{
+ private static Object lock = new Object();
private static volatile int counter = 0;
public static Test suite() {
TestSuite suite = new TestSuite(TestSignal.class);
@@ -47,7 +48,7 @@
public void handler(Signal signo)
throws Exception
{
- synchronized(TestSignal.class) {
+ synchronized(lock) {
counter++;
}
System.out.println("Received signal(" + signo + ") in " +
@@ -88,7 +89,7 @@
System.out.println("Handler initialized in " + Thread.currentThread().getName());
for (int i = 0; i < 2; i++) {
try {
- Thread.sleep(100);
+ Thread.sleep((int)(System.currentTimeMillis() % 100));
} catch (Throwable e) {
// Ignore
}
@@ -105,9 +106,16 @@
MySignalTester h2 = new MySignalTester(Signal.SIGHUP);
h1.start();
h2.start();
+ try {
+ Thread.sleep(500);
+ } catch (Throwable t) {
+ // Ignore
+ }
h1.join();
h2.join();
- assertEquals("Signaled" , 4, counter);
+ synchronized(lock) {
+ assertEquals("Signaled" , 4, counter);
+ }
}
/*