001/* 002 * This file is part of the Jikes RVM project (http://jikesrvm.org). 003 * 004 * This file is licensed to You under the Eclipse Public License (EPL); 005 * You may not use this file except in compliance with the License. You 006 * may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/eclipse-1.0.php 009 * 010 * See the COPYRIGHT.txt file distributed with this work for information 011 * regarding copyright ownership. 012 */ 013 014package org.mmtk.utility.heap; 015 016import org.mmtk.utility.Log; 017import org.mmtk.plan.CollectorContext; 018import org.mmtk.utility.options.Options; 019import org.mmtk.vm.Monitor; 020import org.mmtk.vm.VM; 021 022import org.vmmagic.pragma.*; 023 024/** 025 * This context concurrently zeroes a space when triggered. 026 */ 027@Uninterruptible 028public class ConcurrentZeroingContext extends CollectorContext { 029 030 private final PageResource pr; 031 private final Monitor lock; 032 private volatile int trigger; 033 034 public ConcurrentZeroingContext(PageResource pr) { 035 this.pr = pr; 036 this.lock = VM.newHeavyCondLock("ConcurrentZeroingLock"); 037 } 038 039 public void trigger() { 040 lock.lock(); 041 trigger++; 042 lock.broadcast(); 043 lock.unlock(); 044 } 045 046 @Override 047 public void run() { 048 if (Options.verbose.getValue() >= 2) { 049 Log.writeln("ZeroingThread running"); 050 } 051 while (true) { 052 lock.lock(); 053 while (trigger == 0) { 054 lock.await(); 055 } 056 trigger--; 057 lock.unlock(); 058 pr.concurrentZeroing(); 059 } 060 } 061}