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 014 package org.mmtk.utility.heap; 015 016 import org.mmtk.utility.Log; 017 import org.mmtk.plan.CollectorContext; 018 import org.mmtk.utility.options.Options; 019 import org.mmtk.vm.Monitor; 020 import org.mmtk.vm.VM; 021 022 import org.vmmagic.pragma.*; 023 024 /** 025 * This context concurrently zeroes a space when triggered. 026 */ 027 @Uninterruptible 028 public class ConcurrentZeroingContext extends CollectorContext { 029 030 private PageResource pr; 031 private 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 }