Author: mturk Date: Thu Nov 26 13:19:25 2009 New Revision: 884551 URL: http://svn.apache.org/viewvc?rev=884551&view=rev Log: Fix pipe cleanup
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysrw.c commons/sandbox/runtime/trunk/src/main/native/os/win32/pipe.c Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysrw.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysrw.c?rev=884551&r1=884550&r2=884551&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysrw.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysrw.c Thu Nov 26 13:19:25 2009 @@ -32,6 +32,60 @@ extern int do_lock(acr_file_t *f, DWORD flags); extern int do_unlock(acr_file_t *f); +static DWORD overlapped_wait(acr_file_t *f, DWORD *nbytes) +{ + DWORD ws; + DWORD rc = 0; + + do { + switch (ws = ACR_WaitForObjectOrSignal(f->overlap.hEvent, + f->timeout)) { + case WAIT_IO_COMPLETION: + case WAIT_ABANDONED_0: + case WAIT_ABANDONED_1: + case WAIT_OBJECT_0: + /* Signal event is set. + * Get it's status. + */ + rc = ACR_DeliverSignals(); + break; + case WAIT_OBJECT_1: + /* Operation success */ + rc = 0; + break; + case WAIT_FAILED: + /* We got the error while waiting + */ + rc = ACR_GET_OS_ERROR(); + break; + case WAIT_TIMEOUT: + rc = ACR_TIMEUP; + break; + default: + rc = ACR_EINVAL; + break; + } + } while (rc == ACR_EINTR); + + if (rc) { + /* There is one case that represents entirely + * successful operations, otherwise we will cancel + * the operation in progress. + */ + CancelIo(f->fd); + } + if (!GetOverlappedResult(f->fd, + &f->overlap, + nbytes, + FALSE)) { + rc = GetLastError(); + if (rc == ERROR_IO_INCOMPLETE || + rc == ERROR_OPERATION_ABORTED) + rc = ACR_TIMEUP; + } + return rc; +} + static DWORD overlapped_wait_all(acr_file_t *f, DWORD *nbytes) { DWORD ws; Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/pipe.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/pipe.c?rev=884551&r1=884550&r2=884551&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/win32/pipe.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/win32/pipe.c Thu Nov 26 13:19:25 2009 @@ -392,7 +392,6 @@ { int rc = 0; int fo; - jobject od; fo = acr_ioh_open(fp, ACR_DT_FILE, 0, file_cleanup); if (fo < 0) { @@ -400,27 +399,17 @@ goto finally; } /* Create File Descriptor Object */ - od = ACR_DescriptorCreate(_E, ACR_DT_FILE, fo, NULL, - descriptor_cleanup); - if (!od) { - rc = ACR_GET_OS_ERROR(); - goto finally; - } - /* Create Pipe object */ - fp->descriptor = (*_E)->NewWeakGlobalRef(_E, *fdo); - *fdo = ACR_NewPipeObject(_E, flags, od, NULL); + *fdo = ACR_DescriptorCreate(_E, ACR_DT_FILE, fo, NULL, + descriptor_cleanup); if (!*fdo) { rc = ACR_GET_OS_ERROR(); goto finally; } -finally: - if (rc) { - if (fp && fp->descriptor) - (*_E)->DeleteWeakGlobalRef(_E, fp->descriptor); - /* ### close the fp */ - x_free(fp); - } + fp->descriptor = (*_E)->NewWeakGlobalRef(_E, *fdo); +finally: + if (rc) + file_cleanup(fp, ACR_DT_FILE, ACR_IOH_CLEAR); return rc; } @@ -451,25 +440,18 @@ ACR_THROW_IO_IF_ERR(rc); return NULL; } - rc = do_popen(_E, pd[0], flags & ACR_PIPE_RD, &fd[0]); + rc = do_popen(_E, pd[0], flags & ACR_PIPE_RD, &fd[0]); if (rc) { - goto cleanup; + goto finally; } rc = do_popen(_E, pd[1], flags & ACR_PIPE_WR, &fd[1]); if (rc) { - /* ### fd[0] will be closed by GC ? - */ - pd[0] = NULL; - goto cleanup; + ACR_DescriptorCleanup(_E, fd[0]); + goto finally; } - return ACR_NewPipeObject(_E, flags, fd[0], fd[1], NULL); - -cleanup: - if (pd[0]) - file_cleanup(pd[0], ACR_DT_FILE, ACR_IOH_CLEAR); - if (pd[1]) - file_cleanup(pd[1], ACR_DT_FILE, ACR_IOH_CLEAR); + return ACR_NewPipeObject(_E, flags, fd[0], fd[1], pd[0]->name); +finally: ACR_THROW_IO_IF_ERR(rc); return NULL; }