package nachos.ag; import java.io.File; import nachos.machine.*; import nachos.threads.KThread; import nachos.userprog.UserProcess; /*** * @author Tianqi Chen * file system call auto grader for phase 2 */ public class UserGrader1 extends CoffGrader { private static final String testfilenames[]={ "f0","f1" }; private static final int ActionFileExist = 8; private static final int ActionNumOpen = 9; private static final int ActionStartID = 10; private static final int ActionAssertID = 11; private static final int ActionFileCmp = 12; private String filename; private boolean fileexist; private nachos.threads.Lock fileExistLock; public void run(){ fileExistLock = new nachos.threads.Lock(); for( int i = 0 ; i < testfilenames.length ; i ++ ) fileRemove( testfilenames[i] ); super.run(); } /** whether the file exist */ protected boolean fileExist( String name ){ fileExistLock.acquire(); this.filename = name; super.privilege.doPrivileged(new Runnable(){ public void run(){ File file = new File( testRoot,filename ); fileexist = file.exists(); } }); boolean exist = fileexist; fileExistLock.release(); return exist; } protected void fileRemove( String name ){ fileExistLock.acquire(); this.filename = name; super.privilege.doPrivileged(new Runnable(){ public void run(){ File file = new File( testRoot,filename ); if( file.exists() ){ Lib.assertTrue(file.delete(),"can't delete file "+ filename); } } }); fileExistLock.release(); } protected int handleTestSystemCall(int type, int a0, int a1, int a2){ switch( type ){ case ActionFileExist : return fileExist( testfilenames[a0] ) ? 1:0; case ActionNumOpen : return ((StubFileSystem)Machine.stubFileSystem()).getOpenCount(); case ActionStartID : System.out.println("start test #" + a0 ); break; case ActionAssertID : System.out.println("\tassert %" + a0 + (a1 != 0 ? " true" : " false") ); if( a1 == 0 ){ System.out.println("Test failed"); Machine.halt(); }else break; default: return super.handleTestSystemCall(type, a0, a1, a2); } return 0; } }