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/10/01 15:46:49 UTC
svn commit: r820656 - in /commons/sandbox/runtime/trunk/src:
main/java/org/apache/commons/runtime/ main/native/include/
main/native/include/arch/unix/ main/native/include/arch/windows/
main/native/os/darwin/ main/native/os/hpux/ main/native/os/unix/ ma...
Author: mturk
Date: Thu Oct 1 13:46:48 2009
New Revision: 820656
URL: http://svn.apache.org/viewvc?rev=820656&view=rev
Log:
Separate Descriptor.close and Descriptor.finalize
Modified:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor32.java
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor64.java
commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h
commons/sandbox/runtime/trunk/src/main/native/include/acr_io.h
commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h
commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h
commons/sandbox/runtime/trunk/src/main/native/os/darwin/mutex.c
commons/sandbox/runtime/trunk/src/main/native/os/hpux/shm.c
commons/sandbox/runtime/trunk/src/main/native/os/unix/dso.c
commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c
commons/sandbox/runtime/trunk/src/main/native/os/unix/ios.c
commons/sandbox/runtime/trunk/src/main/native/os/unix/mmap.c
commons/sandbox/runtime/trunk/src/main/native/os/unix/mutex.c
commons/sandbox/runtime/trunk/src/main/native/os/unix/sema.c
commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c
commons/sandbox/runtime/trunk/src/main/native/os/win32/dso.c
commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysio.c
commons/sandbox/runtime/trunk/src/main/native/os/win32/ios.c
commons/sandbox/runtime/trunk/src/main/native/os/win32/mmap.c
commons/sandbox/runtime/trunk/src/main/native/os/win32/mutex.c
commons/sandbox/runtime/trunk/src/main/native/os/win32/sema.c
commons/sandbox/runtime/trunk/src/main/native/os/win32/shm.c
commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c
commons/sandbox/runtime/trunk/src/main/native/test/testcase.c
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor32.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor32.java?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor32.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor32.java Thu Oct 1 13:46:48 2009
@@ -28,6 +28,7 @@
class Descriptor32 extends Descriptor
{
+ private int ISVALID;
private int IHANDLE;
private int PHANDLE;
private int HANDLER;
@@ -42,6 +43,7 @@
IHANDLE = i;
PHANDLE = l;
HANDLER = h;
+ ISVALID = 1;
}
public int fd()
@@ -52,7 +54,7 @@
public boolean valid()
{
// false if both int is negative and pointer is NULL
- if (IHANDLE < 0 && PHANDLE == 0)
+ if (ISVALID == 0 || (IHANDLE < 0 && PHANDLE == 0))
return false;
else
return true;
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor64.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor64.java?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor64.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor64.java Thu Oct 1 13:46:48 2009
@@ -28,6 +28,7 @@
class Descriptor64 extends Descriptor
{
+ private int ISVALID;
private int IHANDLE;
private long PHANDLE;
private long HANDLER;
@@ -42,6 +43,7 @@
IHANDLE = i;
PHANDLE = l;
HANDLER = h;
+ ISVALID = 1;
}
public int fd()
@@ -52,7 +54,7 @@
public boolean valid()
{
// true if both int is negative and pointer is NULL
- if (IHANDLE < 0 && PHANDLE == 0L)
+ if (ISVALID == 0 || (IHANDLE < 0 && PHANDLE == 0L))
return false;
else
return true;
Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h Thu Oct 1 13:46:48 2009
@@ -45,6 +45,7 @@
#define ACR_DT_MASK 0x000000FF
typedef enum {
+ ACR_DESC_FINALIZE,
ACR_DESC_CLOSE,
ACR_DESC_SYNC,
ACR_DESC_FLUSH
Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_io.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_io.h?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_io.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_io.h Thu Oct 1 13:46:48 2009
@@ -40,6 +40,16 @@
*/
ACR_DECLARE(int) ACR_IoClose(JNIEnv *env, int descriptor);
+/**
+ * Close the ACR Descriptor handle and free allocated resources.
+ * @param env Current JNI environment
+ * @param descriptor Descriptor handle to close.
+ * @return ACR error code on failure. If env is not NULL the IO exception
+ * is thrown in case of failure.
+ * @remark The function calls the descriptor cleanup function.
+ */
+ACR_DECLARE(int) ACR_IoClear(JNIEnv *env, int descriptor);
+
#ifdef __cplusplus
}
Modified: commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h Thu Oct 1 13:46:48 2009
@@ -87,6 +87,7 @@
#endif
#endif
+#define ACR_IOH_CLEAR 0x8000000
typedef struct acr_ioh acr_ioh;
typedef int (acr_ioh_cleanup_fn_t)(void *, int, unsigned int);
@@ -104,6 +105,7 @@
extern int acr_ioh_open(void *, int, unsigned int, acr_ioh_cleanup_fn_t *);
extern int acr_ioh_free(int);
extern int acr_ioh_close(int);
+extern int acr_ioh_clear(int);
extern void acr_ioh_cleanup(void);
extern mode_t ACR_UnixPermsToMode(int);
Modified: commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h Thu Oct 1 13:46:48 2009
@@ -269,6 +269,7 @@
* ---------------------------------------------------------------------
*/
+#define ACR_IOH_CLEAR 0x8000000
typedef struct acr_ioh acr_ioh;
typedef int (acr_ioh_cleanup_fn_t)(void *, int, unsigned int);
@@ -286,6 +287,7 @@
extern int acr_ioh_open(void *, int, unsigned int, acr_ioh_cleanup_fn_t *);
extern int acr_ioh_free(int);
extern int acr_ioh_close(int);
+extern int acr_ioh_clear(int);
extern void acr_ioh_cleanup(void);
/** Default number of IO slots
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=820656&r1=820655&r2=820656&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 Thu Oct 1 13:46:48 2009
@@ -79,6 +79,7 @@
}
close(m->filedes);
+ m->filedes = -1;
rc = ACR_SUCCESS;
}
if (m->filename) {
@@ -88,8 +89,10 @@
rc = ACR_GET_OS_ERROR();
}
x_free((void *)(m->filename));
+ m->filename = NULL;
}
- x_free(m);
+ if (flags & ACR_IOH_CLEAR)
+ x_free(m);
return rc;
}
return ACR_EFTYPE;
@@ -317,6 +320,7 @@
ick.val = 0;
semctl(m->filedes, 0, IPC_RMID, ick);
rc = ACR_SUCCESS;
+ m->filedes = -1;
}
if (m->filename) {
if (access(m->filename, F_OK) == 0) {
@@ -325,8 +329,10 @@
rc = ACR_GET_OS_ERROR();
}
x_free((void *)(m->filename));
+ m->filename = NULL;
}
- x_free(m);
+ if (flags & ACR_IOH_CLEAR)
+ x_free(m);
return rc;
}
return ACR_EFTYPE;
@@ -349,8 +355,10 @@
} while (rc < 0 && errno == EINTR);
}
rc = ACR_SUCCESS;
+ m->filedes = -1;
}
- x_free(m);
+ if (flags & ACR_IOH_CLEAR)
+ x_free(m);
return rc;
}
return ACR_EBADF;
@@ -663,7 +671,7 @@
ACR_THROW_EX_IF_ERR(ACR_EX_EINVAL, ACR_EFTYPE);
return ACR_EFTYPE;
}
- rc = acr_ioh_close(mutex);
+ rc = acr_ioh_clear(mutex);
ACR_THROW_IO_IF_ERR(rc);
return rc;
}
@@ -690,6 +698,12 @@
{
int rc = ACR_SUCCESS;
switch (cm) {
+ case ACR_DESC_FINALIZE:
+ if (dp->di > 0)
+ rc = acr_ioh_clear(dp->di);
+ else
+ rc = ACR_EBADF;
+ break;
case ACR_DESC_CLOSE:
if (dp->di > 0)
rc = acr_ioh_close(dp->di);
Modified: commons/sandbox/runtime/trunk/src/main/native/os/hpux/shm.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/hpux/shm.c?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/hpux/shm.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/hpux/shm.c Thu Oct 1 13:46:48 2009
@@ -107,7 +107,9 @@
}
finally:
x_free((void *)(m->filename));
- x_free(m);
+ m->filename = NULL;
+ if (flags & ACR_IOH_CLEAR)
+ x_free(m);
return rc;
}
@@ -131,8 +133,10 @@
if (m->base && shmdt(m->base) == -1) {
rc = ACR_GET_OS_ERROR();
}
+ m->filename = NULL;
}
- x_free(m);
+ if (flags & ACR_IOH_CLEAR)
+ x_free(m);
return rc;
}
@@ -144,7 +148,7 @@
ACR_THROW_EX_IF_ERR(ACR_EX_EINVAL, ACR_EFTYPE);
return ACR_EFTYPE;
}
- rc = acr_ioh_close(shm);
+ rc = acr_ioh_clear(shm);
ACR_THROW_IO_IF_ERR(rc);
return rc;
}
@@ -523,6 +527,12 @@
{
int rc = ACR_SUCCESS;
switch (cm) {
+ case ACR_DESC_FINALIZE:
+ if (dp->di > 0)
+ rc = acr_ioh_clear(dp->di);
+ else
+ rc = ACR_EBADF;
+ break;
case ACR_DESC_CLOSE:
if (dp->di > 0)
rc = acr_ioh_close(dp->di);
Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/dso.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/dso.c?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/dso.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/dso.c Thu Oct 1 13:46:48 2009
@@ -72,7 +72,7 @@
ACR_THROW_EX_IF_ERR(ACR_EX_EINVAL, ACR_EFTYPE);
return ACR_EFTYPE;
}
- rc = acr_ioh_close(dso);
+ rc = acr_ioh_clear(dso);
ACR_THROW_IO_IF_ERR(rc);
return rc;
}
Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c Thu Oct 1 13:46:48 2009
@@ -41,7 +41,12 @@
rc = ACR_SUCCESS;
}
x_free(fp->name);
- x_free(fp);
+ fp->name = NULL;
+
+ if (flags & ACR_IOH_CLEAR)
+ x_free(fp);
+ else
+ fp->fd = -1;
return rc;
}
@@ -51,14 +56,20 @@
{
int rc = ACR_SUCCESS;
switch (cm) {
- case ACR_DESC_CLOSE:
+ case ACR_DESC_FINALIZE:
if (dp->di > 0) {
acr_file_t *fp = ACR_IOH_FDATA(dp->di);
if (fp->flags & ACR_FOPEN_NOCLEANUP) {
- rc = file_cleanup(fp, ACR_DT_FILE, 0);
- ACR_IOH_FDATA(dp->di) = NULL;
+ fp->fd = -1;
}
- rc == 0 ? rc = acr_ioh_close(dp->di) : acr_ioh_close(dp->di);
+ rc = acr_ioh_clear(dp->di);
+ }
+ else
+ rc = ACR_EBADF;
+ break;
+ case ACR_DESC_CLOSE:
+ if (dp->di > 0) {
+ rc = acr_ioh_close(dp->di);
}
else
rc = ACR_EBADF;
Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/ios.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/ios.c?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/ios.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/ios.c Thu Oct 1 13:46:48 2009
@@ -264,11 +264,29 @@
rc = (*acr_ioh_tab[i].c)(acr_ioh_tab[i].h, acr_ioh_tab[i].type,
acr_ioh_tab[i].flags);
}
+
+ return rc;
+}
+
+int acr_ioh_clear(int i)
+{
+ int rc = 0;
+
+ if (i < 0 || i >= acr_ioh_mask)
+ return ACR_EBADF;
+ if (!__bitmap)
+ return ACR_ENOMEM;
+ if (IS_VALID_HANDLE(acr_ioh_tab[i].h) && acr_ioh_tab[i].c) {
+ /* Run the cleanup */
+ rc = (*acr_ioh_tab[i].c)(acr_ioh_tab[i].h, acr_ioh_tab[i].type,
+ acr_ioh_tab[i].flags | ACR_IOH_CLEAR);
+ }
pthread_mutex_lock(&ios_lock);
acr_ioh_tab[i] = nul_ioh_tab;
__CLR_BIT(__bitmap, i);
pthread_mutex_unlock(&ios_lock);
+
return rc;
}
@@ -303,6 +321,14 @@
return rc;
}
+ACR_DECLARE(int) ACR_IoClear(JNIEnv *_E, int dh)
+{
+ int rc = acr_ioh_clear(dh);
+
+ ACR_THROW_IO_IF_ERR(rc);
+ return rc;
+}
+
#if defined(ACR_ENABLE_TEST)
void acr_ioh_dump_stats()
Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/mmap.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/mmap.c?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/mmap.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/mmap.c Thu Oct 1 13:46:48 2009
@@ -70,14 +70,17 @@
if (IS_VALID_MEMORY(m->base)) {
if (munmap(m->base, m->size))
rc = ACR_GET_OS_ERROR();
+ m->base = INVALID_MEMORY_VALUE;
}
- if (flags == MMAP_OWNS_FILE) {
+ if ((flags & MMAP_OWNS_FILE) && m->fd > 0) {
/* Since we have opended the file close it.
*/
if (close(m->fd))
rc = ACR_GET_OS_ERROR();
+ m->fd = -1;
}
- x_free(m);
+ if (flags & ACR_IOH_CLEAR)
+ x_free(m);
return rc;
}
@@ -98,6 +101,12 @@
int rc = ACR_SUCCESS;
switch (cm) {
+ case ACR_DESC_FINALIZE:
+ if (dp->di > 0)
+ rc = acr_ioh_clear(dp->di);
+ else
+ rc = ACR_EBADF;
+ break;
case ACR_DESC_CLOSE:
if (dp->di > 0)
rc = acr_ioh_close(dp->di);
@@ -154,7 +163,7 @@
ACR_THROW_EX_IF_ERR(ACR_EX_EINVAL, ACR_EFTYPE);
return ACR_EFTYPE;
}
- rc = acr_ioh_close(map);
+ rc = acr_ioh_clear(map);
ACR_THROW_IO_IF_ERR(rc);
return rc;
}
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=820656&r1=820655&r2=820656&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 Thu Oct 1 13:46:48 2009
@@ -88,15 +88,19 @@
if (type == ACR_DT_MUTEX) {
int rc = 0;
acr_pmutex_t *m = (acr_pmutex_t *)mutex;
- if (m->filename[0])
+ if (m->filename[0]) {
sem_unlink(m->filename);
+ m->filename[0] = '\0'
+ }
if (m->sem != (sem_t *)SEM_FAILED) {
if (sem_close(m->sem) < 0)
rc = ACR_GET_OS_ERROR();
+ m->sem = (sem_t *)SEM_FAILED;
}
else
rc = ACR_EBADF;
- x_free(m);
+ if (flags & ACR_IOH_CLEAR)
+ x_free(m);
return rc;
}
return ACR_EFTYPE;
@@ -310,6 +314,7 @@
}
ick.val = 0;
semctl(m->filedes, 0, IPC_RMID, ick);
+ m->filedes = -1;
rc = ACR_SUCCESS;
}
if (m->filename) {
@@ -319,8 +324,10 @@
rc = ACR_GET_OS_ERROR();
}
x_free((void *)(m->filename));
+ m->filename = NULL;
}
- x_free(m);
+ if (flags & ACR_IOH_CLEAR)
+ x_free(m);
return rc;
}
return ACR_EFTYPE;
@@ -342,9 +349,11 @@
rc = semop(m->filedes, &op, 1);
} while (rc < 0 && errno == EINTR);
}
+ m->filedes = -1;
rc = ACR_SUCCESS;
}
- x_free(m);
+ if (flags & ACR_IOH_CLEAR)
+ x_free(m);
return rc;
}
return ACR_EFTYPE;
@@ -675,6 +684,12 @@
{
int rc = ACR_SUCCESS;
switch (cm) {
+ case ACR_DESC_FINALIZE:
+ if (dp->di > 0)
+ rc = acr_ioh_clear(dp->di);
+ else
+ rc = ACR_EBADF;
+ break;
case ACR_DESC_CLOSE:
if (dp->di > 0)
rc = acr_ioh_close(dp->di);
@@ -696,7 +711,7 @@
ACR_THROW_EX_IF_ERR(ACR_EX_EINVAL, ACR_EFTYPE);
return ACR_EFTYPE;
}
- rc = acr_ioh_close(mutex);
+ rc = acr_ioh_clear(mutex);
ACR_THROW_IO_IF_ERR(rc);
return rc;
}
Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/sema.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/sema.c?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/sema.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/sema.c Thu Oct 1 13:46:48 2009
@@ -64,15 +64,19 @@
if (type == ACR_DT_SEMAPHORE) {
int rc = 0;
acr_semaphore_t *s = (acr_semaphore_t *)sema;
- if (s->name[0])
+ if (s->name[0]) {
sem_unlink(s->name);
+ s->name[0] = '\0';
+ }
if (s->sem != (sem_t *)SEM_FAILED) {
if (sem_close(s->sem) < 0)
rc = ACR_GET_OS_ERROR();
+ s->sem = (sem_t *)SEM_FAILED;
}
else
rc = ACR_EBADF;
- x_free(s);
+ if (flags & ACR_IOH_CLEAR)
+ x_free(s);
return rc;
}
return ACR_EFTYPE;
@@ -183,7 +187,7 @@
/* Close will call the cleanup function
*/
- return acr_ioh_close(sema);
+ return acr_ioh_clear(sema);
}
ACR_DECLARE(int) ACR_SemaphoreRemove(JNIEnv *_E, const acr_pchar_t *sname)
@@ -345,6 +349,12 @@
{
int rc = ACR_SUCCESS;
switch (cm) {
+ case ACR_DESC_FINALIZE:
+ if (dp->di > 0)
+ rc = acr_ioh_clear(dp->di);
+ else
+ rc = ACR_EBADF;
+ break;
case ACR_DESC_CLOSE:
if (dp->di > 0)
rc = acr_ioh_close(dp->di);
@@ -466,4 +476,3 @@
}
return ex == 0 ? JNI_TRUE : JNI_FALSE;
}
-
Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c Thu Oct 1 13:46:48 2009
@@ -84,6 +84,7 @@
if (m->base && munmap(m->base, m->realsize) == -1) {
rc = ACR_GET_OS_ERROR();
}
+ m->base = NULL;
}
/* name-based shared memory */
else {
@@ -106,7 +107,9 @@
}
finally:
x_free((void *)(m->filename));
- x_free(m);
+ m->filename = NULL;
+ if (flags & ACR_IOH_CLEAR)
+ x_free(m);
return rc;
}
@@ -130,8 +133,10 @@
if (m->base && shmdt(m->base) == -1) {
rc = ACR_GET_OS_ERROR();
}
+ m->filename = NULL;
}
- x_free(m);
+ if (flags & ACR_IOH_CLEAR)
+ x_free(m);
return rc;
}
@@ -143,7 +148,7 @@
ACR_THROW_EX_IF_ERR(ACR_EX_EINVAL, ACR_EFTYPE);
return ACR_EFTYPE;
}
- rc = acr_ioh_close(shm);
+ rc = acr_ioh_clear(shm);
ACR_THROW_IO_IF_ERR(rc);
return rc;
}
@@ -503,6 +508,12 @@
{
int rc = ACR_SUCCESS;
switch (cm) {
+ case ACR_DESC_FINALIZE:
+ if (dp->di > 0)
+ rc = acr_ioh_clear(dp->di);
+ else
+ rc = ACR_EBADF;
+ break;
case ACR_DESC_CLOSE:
if (dp->di > 0)
rc = acr_ioh_close(dp->di);
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/dso.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/dso.c?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/dso.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/dso.c Thu Oct 1 13:46:48 2009
@@ -80,7 +80,7 @@
ACR_THROW_EX_IF_ERR(ACR_EX_EINVAL, ACR_EFTYPE);
return ACR_EFTYPE;
}
- rc = acr_ioh_close(dso);
+ rc = acr_ioh_clear(dso);
ACR_THROW_IO_IF_ERR(rc);
return rc;
}
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysio.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysio.c?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysio.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysio.c Thu Oct 1 13:46:48 2009
@@ -43,7 +43,11 @@
rc = ACR_SUCCESS;
}
x_free(fp->name);
- x_free(fp);
+ fp->name = NULL;
+ if (flags & ACR_IOH_CLEAR)
+ x_free(fp);
+ else
+ fp->fd = INVALID_HANDLE_VALUE;
return rc;
}
@@ -53,14 +57,20 @@
{
int rc = ACR_SUCCESS;
switch (cm) {
- case ACR_DESC_CLOSE:
+ case ACR_DESC_FINALIZE:
if (dp->di > 0) {
acr_file_t *fp = ACR_IOH_FDATA(dp->di);
if (fp->flags & ACR_FOPEN_NOCLEANUP) {
- rc = file_cleanup(fp, ACR_DT_FILE, 0);
- ACR_IOH_FDATA(dp->di) = NULL;
+ fp->fd = INVALID_HANDLE_VALUE;
}
- rc == 0 ? rc = acr_ioh_close(dp->di) : acr_ioh_close(dp->di);
+ rc = acr_ioh_clear(dp->di);
+ }
+ else
+ rc = ACR_EBADF;
+ break;
+ case ACR_DESC_CLOSE:
+ if (dp->di > 0) {
+ rc = acr_ioh_close(dp->di);
}
else
rc = ACR_EBADF;
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/ios.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/ios.c?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/ios.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/ios.c Thu Oct 1 13:46:48 2009
@@ -252,6 +252,23 @@
rc = (*acr_ioh_tab[i].c)(acr_ioh_tab[i].h, acr_ioh_tab[i].type,
acr_ioh_tab[i].flags);
}
+
+ return rc;
+}
+
+int acr_ioh_clear(int i)
+{
+ int rc = 0;
+
+ if (i < 0 || i >= acr_ioh_mask)
+ return ACR_EBADF;
+ if (!__bitmap)
+ return ACR_ENOMEM;
+ if (IS_VALID_HANDLE(acr_ioh_tab[i].h) && acr_ioh_tab[i].c) {
+ /* Run the cleanup */
+ rc = (*acr_ioh_tab[i].c)(acr_ioh_tab[i].h, acr_ioh_tab[i].type,
+ acr_ioh_tab[i].flags | ACR_IOH_CLEAR);
+ }
EnterCriticalSection(&ios_lock);
acr_ioh_tab[i] = nul_ioh_tab;
__CLR_BIT(__bitmap, i);
@@ -291,6 +308,14 @@
return rc;
}
+ACR_DECLARE(int) ACR_IoClear(JNIEnv *_E, int dh)
+{
+ int rc = acr_ioh_clear(dh);
+
+ ACR_THROW_IO_IF_ERR(rc);
+ return rc;
+}
+
#if defined(ACR_ENABLE_TEST)
void acr_ioh_dump_stats()
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/mmap.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/mmap.c?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/mmap.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/mmap.c Thu Oct 1 13:46:48 2009
@@ -74,7 +74,8 @@
if (!CloseHandle(m->fd))
rc = ACR_GET_OS_ERROR();
}
- x_free(m);
+ if (flags & ACR_IOH_CLEAR)
+ x_free(m);
return rc;
}
@@ -95,6 +96,12 @@
int rc = ACR_SUCCESS;
switch (cm) {
+ case ACR_DESC_FINALIZE:
+ if (dp->di > 0)
+ rc = acr_ioh_clear(dp->di);
+ else
+ rc = ACR_EBADF;
+ break;
case ACR_DESC_CLOSE:
if (dp->di > 0)
rc = acr_ioh_close(dp->di);
@@ -135,7 +142,7 @@
ACR_THROW_EX_IF_ERR(ACR_EX_EINVAL, ACR_EFTYPE);
return ACR_EFTYPE;
}
- rc = acr_ioh_close(map);
+ rc = acr_ioh_clear(map);
ACR_THROW_IO_IF_ERR(rc);
return rc;
}
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/mutex.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/mutex.c?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/mutex.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/mutex.c Thu Oct 1 13:46:48 2009
@@ -220,7 +220,7 @@
ACR_THROW_EX_IF_ERR(ACR_EX_EINVAL, ACR_EFTYPE);
return ACR_EINVAL;
}
- rc = acr_ioh_close(mutex);
+ rc = acr_ioh_clear(mutex);
ACR_THROW_IO_IF_ERR(rc);
return rc;
}
@@ -247,6 +247,12 @@
{
int rc = ACR_SUCCESS;
switch (cm) {
+ case ACR_DESC_FINALIZE:
+ if (dp->di > 0)
+ rc = acr_ioh_clear(dp->di);
+ else
+ rc = ACR_EBADF;
+ break;
case ACR_DESC_CLOSE:
if (dp->di > 0)
rc = acr_ioh_close(dp->di);
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/sema.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/sema.c?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/sema.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/sema.c Thu Oct 1 13:46:48 2009
@@ -133,7 +133,7 @@
/* Close will call the cleanup function
*/
- return acr_ioh_close(sema);
+ return acr_ioh_clear(sema);
}
ACR_DECLARE(int) ACR_SemaphorePermSet(JNIEnv *_E, int sema, int perms,
@@ -167,7 +167,7 @@
do {
rc = 0;
- ws = ACR_WaitForObjectOrSignal(s, INFINITE);
+ ws = ACR_WaitForObjectOrSignal(s, INFINITE);
switch (ws) {
case WAIT_IO_COMPLETION:
case WAIT_OBJECT_0:
@@ -292,6 +292,12 @@
{
int rc = ACR_SUCCESS;
switch (cm) {
+ case ACR_DESC_FINALIZE:
+ if (dp->di > 0)
+ rc = acr_ioh_clear(dp->di);
+ else
+ rc = ACR_EBADF;
+ break;
case ACR_DESC_CLOSE:
if (dp->di > 0)
rc = acr_ioh_close(dp->di);
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/shm.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/shm.c?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/shm.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/shm.c Thu Oct 1 13:46:48 2009
@@ -78,8 +78,12 @@
*/
DeleteFileW(m->filename);
x_free((void *)(m->filename));
+ m->filename = NULL;
}
- x_free(m);
+ m->memblk = NULL;
+ m->hmap = NULL;
+ if (flags & ACR_IOH_CLEAR)
+ x_free(m);
return rc;
}
@@ -92,7 +96,7 @@
ACR_THROW_EX_IF_ERR(ACR_EX_EINVAL, ACR_EFTYPE);
return ACR_EFTYPE;
}
- rc = acr_ioh_close(shm);
+ rc = acr_ioh_clear(shm);
ACR_THROW_IO_IF_ERR(rc);
return rc;
}
@@ -405,6 +409,12 @@
{
int rc = ACR_SUCCESS;
switch (cm) {
+ case ACR_DESC_FINALIZE:
+ if (dp->di > 0)
+ rc = acr_ioh_clear(dp->di);
+ else
+ rc = ACR_EBADF;
+ break;
case ACR_DESC_CLOSE:
if (dp->di > 0)
rc = acr_ioh_close(dp->di);
Modified: commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c Thu Oct 1 13:46:48 2009
@@ -95,6 +95,12 @@
"Ljava/lang/Object;"
};
+J_DECLARE_F_ID(0006) = {
+ NULL,
+ "ISVALID",
+ "I"
+};
+
ACR_CLASS_LDEF(Descriptor)
{
int rv;
@@ -107,6 +113,7 @@
J_LOAD_IFIELD(0003);
J_LOAD_IFIELD(0004);
J_LOAD_IFIELD(0005);
+ J_LOAD_IFIELD(0006);
J_LOAD_METHOD(0000);
return ACR_SUCCESS;
@@ -155,12 +162,10 @@
cb.dp = GET_IFIELD_V(0001, _O, void *);
handler = GET_IFIELD_V(0002, _O, acr_descriptor_handler_fn_t *);
- if (cb.di >= 0) {
- SET_IFIELD_I(0000, _O, -1);
- }
if (cb.dp) {
SET_IFIELD_P(0001, _O, NULL);
}
+ SET_IFIELD_I(0006, _O, 0);
if (handler) {
int rc;
cb.thiz = _O;
@@ -194,7 +199,7 @@
if (handler) {
cb.thiz = _O;
cb.data = GET_IFIELD_O(0005, _O);
- (*handler)(_E, _O, ACR_DESC_CLOSE, &cb);
+ (*handler)(_E, _O, ACR_DESC_FINALIZE, &cb);
}
}
}
Modified: commons/sandbox/runtime/trunk/src/main/native/test/testcase.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/test/testcase.c?rev=820656&r1=820655&r2=820656&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/test/testcase.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/test/testcase.c Thu Oct 1 13:46:48 2009
@@ -719,7 +719,7 @@
ACR_JNI_EXPORT_DECLARE(int, TestPrivate, test053)(ACR_JNISTDARGS, jint d)
{
- return acr_ioh_close(d);
+ return acr_ioh_clear(d);
}
extern void acr_ioh_dump_stats();
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=820656&r1=820655&r2=820656&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 Thu Oct 1 13:46:48 2009
@@ -620,8 +620,9 @@
assertEquals("Result ", 2303, r);
d.close();
int c = test024(d);
- // Second call must return -1
- assertEquals("Result ", -1, c);
+ // Second call must return 2303
+ // because close doesn't clear the int
+ assertEquals("Result ", 2303, c);
d = null;
System.gc();
@@ -658,11 +659,6 @@
System.out.println("Long JNI Call : " + (e-p));
System.out.println("Result is : " + r);
- d.close();
- int c = test024(d);
- // Second call must return -1
- assertEquals("Result ", -1, c);
-
d = null;
System.gc();
// This should be enough for a gc
@@ -782,8 +778,8 @@
assertEquals("Result ", 1964, n);
d.close();
int c = test024(d);
- // Second call must return -1
- assertEquals("Result ", -1, c);
+ // Second call must return 1964
+ assertEquals("Result ", 1964, c);
d = null;
System.gc();
@@ -820,11 +816,12 @@
assertTrue("Equals other", d1.equals(d2));
assertTrue("Equals self", d1.equals(d1));
d1.close();
- assertFalse("Equals closed", d1.equals(d2));
+ assertTrue("Equals closed", d1.equals(d2));
d2.close();
// They always match if both closed
assertTrue("Both closed", d1.equals(d2));
// If closed equals to NULL
+ d1.finalize();
assertTrue("Not NULL", d1.equals(Descriptor.NULL));
d1 = null;