Those are precisely the ones I was referring to that we'd want to avoid when requesting a safepoint for this scenario. That ought to be a matter of simply passing a flag to safepoint synchronization telling it to skip cleanup tasks.
sent from my phone On Sep 11, 2015 6:01 AM, "David Holmes" <david.hol...@oracle.com> wrote: > On 11/09/2015 6:37 PM, Andrew Haley wrote: > >> On 09/11/2015 07:15 AM, David Holmes wrote: >> >>> On 11/09/2015 12:56 AM, Vitaly Davidovich wrote: >>> >>>> >>>>> Sure, if you like, but that's a detail. We are arguing about what >>>>> colour to paint the bike shed. :) >>>>> >>>> >>>> >>>> The reason it may be more than just a bikeshed is because if this >>>> requires >>>> more cleverness in the segfault handler, then it's yet more work to make >>>> this happen. I agree it's an implementation detail, but I don't think >>>> it's >>>> trivial (unless someone comes along and says that modifying the trap >>>> handler to account for this type of scenario is trivial). One would >>>> also >>>> need to modify the safepoint code in the VM to allow skipping all the >>>> housekeeping it does typically, but I suspect this part is fairly easy. >>>> >>> >>> Not sure how the safepoint code is supposed to know this particular >>> safepoint is "special". >>> >> >> I guess I don't know what the problem is: when you request a safepoint you >> also pass a code saying what you want to happen. >> > > There are actions that can also happen at a safepoint that are not part of > the VMOperation for which the safepoint was initiated: > > // Various cleaning tasks that should be done periodically at safepoints > void SafepointSynchronize::do_cleanup_tasks() { > { > TraceTime t1("deflating idle monitors", TraceSafepointCleanupTime); > ObjectSynchronizer::deflate_idle_monitors(); > } > > { > TraceTime t2("updating inline caches", TraceSafepointCleanupTime); > InlineCacheBuffer::update_inline_caches(); > } > { > TraceTime t3("compilation policy safepoint handler", > TraceSafepointCleanupTime); > CompilationPolicy::policy()->do_safepoint_work(); > } > > { > TraceTime t4("mark nmethods", TraceSafepointCleanupTime); > NMethodSweeper::mark_active_nmethods(); > } > > if (SymbolTable::needs_rehashing()) { > TraceTime t5("rehashing symbol table", TraceSafepointCleanupTime); > SymbolTable::rehash_table(); > } > > if (StringTable::needs_rehashing()) { > TraceTime t6("rehashing string table", TraceSafepointCleanupTime); > StringTable::rehash_table(); > } > > // rotate log files? > if (UseGCLogFileRotation) { > gclog_or_tty->rotate_log(false); > } > > { > // CMS delays purging the CLDG until the beginning of the next > safepoint and to > // make sure concurrent sweep is done > TraceTime t7("purging class loader data graph", > TraceSafepointCleanupTime); > ClassLoaderDataGraph::purge_if_needed(); > } > } > > All the above happens at the end of SafepointSynchronize::begin, before > the VMOperation is processed. > > David > ----- > > > Andrew. >> >>