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.
>>
>>

Reply via email to