Hi, Leo, I've just checked only FileChannelImpl changes with the latest svn snapshot and got VM crash (in IBM VME) in threadstart WIN API function. Could you repeat this?
Thanks, Mikhail On 8/22/07, Leo Li <[EMAIL PROTECTED]> wrote: > > Hi, Mikhail: > I have just focused on the problem about how to ensure direct byte > buffer to be release in time. And after I applied the patch at r567561, > although the problem of releasing direct byte buffer seems resolved, I > found > one testcase in FileChannel failed. > After some studying I found the problem is coincident with > HARMONY-4081, in that there is a bug in FileChannel.write() that there is > no > holder for temporarily allocated direct buffers then the they might be > gc-ed > and the related memory resource reallocated. My patch, which might > intrigue GC, aggravates this problem and leads to failure in normal > testsuite. > So could you please first commit the part of FileChannel.write() and > let current tests pass? > > Thanks. > > On 8/21/07, Mikhail Markov <[EMAIL PROTECTED]> wrote: > > > > Thanks for detailed comments! > > You are right about the memory auto-freeing, so my modifications of > > AbstractMemorySpy are not correct. > > See my comments for MappedByteBuffer below inlined. > > > > Still the changes in FileChannelImpl alone do not work: I've just > > re-tried: > > the test still fails and the following messages starts printing: > > ... > > Memory Spy! Fixed attempt to free memory that was not allocated > > PlatformAddress[29968352] > > ... > > I've added debug stack-trace printing and found that these messages are > > printed when tried to free DirectBuffers at the end of > > FileChannelImpl.write() > > method. It's strange at least, that we could not explicitly free > > DirectBuffer which we allocated. > > Seems like these buffers were freed in AbstractMemorySpy.orphanedMemory > () > > method. > > The comment for DirectByteBuffer.free() method says: > > "Explicitly free the memory used by this direct byte buffer. If the > memory > > has already been freed then this is a no-op. > > ... > > Note this is is possible that the memory is freed by code that reaches > > into > > the address and explicitly frees it 'beneith' us -- this is bad form." > > Does it mean that freeing in AbstractMemorySpy.orphanedMemory() is "bad > > form"? :-) > > We should somehow "synchronize" the explicit memory freeing and > > auto-freeing > > in AbstractMemorySpy. > > Looking into the code, i could propose to add additional boolean > parameter > > to AbstractMemorySpy.free() method to indicate if warning message should > > be > > printed or not but the main problem here is that reproducer still fails > if > > modify just FileChannelImpl, which means that auto-freeing does not work > > as > > expected. And I'm not quite understand why it's so. > > Do you have any ideas? > > > > Thanks, > > Mikhail > > > > > > On 8/17/07, Yang Paulex <[EMAIL PROTECTED]> wrote: > > > > > > I'm forwarding this discussion to dev-list to make the discussion > > > easier:). > > > Please see my comments inline. > > > > > > 2007/8/16, Mikhail Markov (JIRA) <[EMAIL PROTECTED]>: > > > > > > > > > > > > [ > > > > > > > > > > https://issues.apache.org/jira/browse/HARMONY-4081?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12520216 > > > ] > > > > > > > > Mikhail Markov commented on HARMONY-4081: > > > > ----------------------------------------- > > > > > > > > Paulex, > > > > > > > > Thanks for the patch review! > > > > > > > > In the beginning, i've created the patch withouth > > MappedPlatformAddress > > > > and AbstractMemorySpy modifications, but this lead to exceptions. > > Seems > > > like > > > > after explicit temporary buffers freeing at the end of > > > > FileChannelImpl.write() method, another attempt to free the same > > > resources > > > > is made in RuntimeMemorySpy.alloc() method. > > > > > > > > About MappedPlatformAddress modification: yes - on Linux it's as you > > > > described, but unfortunately on Windows UnmapViewOfFile function is > > > used, > > > > which does not physically free the memory. > > > > > > > > > > > > > > > I missed to mention windows implementation last time, but I don't > catch > > > you > > > up here on the UnmapViewOfFile, because I cannot find the relevant > > > explanation in MSDN that this method needs further free() to release > > > physical memory [1], and the sample code of MSDN doesn't add any > further > > > memory free for this[2]. Even if UnmapViewOfFile doesn't free the > > memory, > > > I > > > prefer we modify the unmap() implementation on Windows to add memory > > free, > > > so that the the platform neutral behavior can be kept for portlib, > > > otherwise > > > on Linux we may put the situation in risk that free same memory twice. > > how > > > do you think? > > > > > > I've just checked the info again and agree with you - no explicit memory > > freeing is needed. > > > > But I did see some potential problems, although not sure because MSDN is > > not > > > very clear here:- > > > > > > The CloseHandle() needs to be invoked after all file view is unmapped, > > in > > > our case, we don't support multi-view for same file mapping object, so > > > it's > > > OK to close the handle right after unmap. But for some unknown > reasons, > > > currently CloseHandle() is done in windows version's mmapImpl(Ln. 151, > > > luni/src/main/native/luni/windows/OSMemoryWin32.c) right after > > > MapViewOfFile, I'm not sure if this is right action or not. Some > > relevant > > > MSDN pages: > > > > > > "Unmapping a file view invalidates the pointer to the process's > virtual > > > address space. If any of the pages of the file view have changed since > > the > > > view was mapped, the system writes the changed pages of the file to > disk > > > using caching. To commit all data to disk before unmapping the file > > view, > > > use the *FlushViewOfFile*< > > > http://msdn2.microsoft.com/en-us/library/aa366563.aspx>function. > > > > > > When each process finishes using the file mapping object and has > > unmapped > > > all views, it must close the file mapping object's handle and the file > > on > > > disk by calling > > > *CloseHandle*<http://msdn2.microsoft.com/en-us/library/ms724211.aspx>. > > > These calls to *CloseHandle* succeed even when there are file views > that > > > are > > > still open. However, leaving file views mapped causes memory leaks." > > > In Harmony implementation, we actually call CloseHandle before the > only > > > mapped file view is unmapped, but from the document above, I cannot > say > > > it's > > > safe or not. I'll try to find some time to test later. > > > > > > I've read in [1] in Remarks: > > "Although an application may close the file handle used to create a file > > mapping object, the system holds the corresponding file open until the > > last > > view of the file is unmapped: Files for which the last view has not yet > > been > > unmapped are held open with no sharing restrictions." > > > > So, seems like immediate closing file handles after mapping looks ok... > > > > > > [1] http://msdn2.microsoft.com/en-us/library/aa366882.aspx > > > [2] http://msdn2.microsoft.com/en-us/library/aa366548.aspx > > > [3] http://msdn2.microsoft.com/en-us/library/aa366532.aspx > > > > > > About AbstractMemorySpy modification: the modification is related to > the > > > one > > > > in MappedPlatformAddress. Usually, the following construction is > used > > > for > > > > resources explicit freeing: > > > > if(memorySpy.free(this)){ > > > > osMemory.free(osaddr); > > > > } > > > > i.e. after removing the address from memoryInUse, physical freeing > > > happens > > > > - in this case. The only place where this was not so is > > > > MappedPlatformAddress (at least for Windows), so after i added > > explicit > > > > memory freeing in MappedPlatformAddress, the address could be safely > > > removed > > > > from refToShadow. > > > > You're right - is this case the mechanizm of auto-freeing is not > > > > necessary. > > > > I did not found places where free() method explicity used > > > > except *PlatformAddress classes. Do you know any? > > > > If not then do we really need this mechanizm if all physical freeing > > is > > > > done in *PlatformAddress classes? > > > > > > > > > PlatformAddress is used not only by MappedDirectBuffer but by common > > > direct > > > buffer, too. We cannot ask applications running on Harmony to > explicitly > > > free all direct buffer, so the automatic reallocation mechanism is > > still > > > necessary. If the number/size of direct buffer used by > > FileChannelImpl's > > > gather/scatter IO make you uncomfortable so that they are expected to > be > > > released explicitly and quickly, I prefer we find some way to deal > with > > > this > > > within FileChannelImpl rather than in a method of PlatformAddress or > > > AbstractMemorySpy, which may be depended on by other classlib and in > > turn > > > by > > > applications. How do you think? > > > > > > -- > > > Paulex Yang > > > China Software Development laboratory > > > IBM > > > > > > > > > -- > Leo Li > China Software Development Lab, IBM >
