impl oft to finish
This commit is contained in:
parent
3f3c79ec0c
commit
6ad3b36201
@ -0,0 +1,153 @@
|
||||
use super::openfile::OpenFile;
|
||||
|
||||
|
||||
pub const MAX_OF_TABLE_ENTRY : i32 = 500;
|
||||
|
||||
pub struct OpenFileTableEntry {
|
||||
name : String,
|
||||
pub file : Option<OpenFile>,
|
||||
pub num_thread : i32,//number of threads havng that file open
|
||||
//lock : Lock,
|
||||
pub to_be_deleted : bool,//si mis a true, quand ce fichier n'est plus ouvert par aucun thread, il doit etre supprimé
|
||||
pub sector : i32,//secteur disque ou se situe le header de ce fichier
|
||||
}
|
||||
|
||||
pub struct OpenFileTable{
|
||||
table : Vec<Option<OpenFileTableEntry>>,
|
||||
nb_entry : i32//numero du prochain fichier ouvert/prochaine entrée
|
||||
}
|
||||
|
||||
impl OpenFileTableEntry {
|
||||
|
||||
pub fn new() -> OpenFileTableEntry {
|
||||
|
||||
OpenFileTableEntry {
|
||||
name : String::new(),
|
||||
file : None,
|
||||
num_thread : 1,
|
||||
to_be_deleted : false,
|
||||
sector : -1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl OpenFileTable{
|
||||
|
||||
pub fn open(oft : &mut OpenFileTable, name : String)-> Option<OpenFile>{
|
||||
|
||||
let mut num : i32;
|
||||
let mut sector : i32;
|
||||
let mut dirsector : i32;
|
||||
let mut file_name = String::new();
|
||||
|
||||
//Impl le trait copy sur open file
|
||||
num = OpenFileTable::findl(oft, &name);
|
||||
|
||||
//no error
|
||||
if num != -1 {
|
||||
//the file is opened by another thread
|
||||
match oft.table[num as usize] {
|
||||
|
||||
Some(e) => {
|
||||
|
||||
if !e.to_be_deleted{
|
||||
e.num_thread += 1;
|
||||
|
||||
let new_file : OpenFile = OpenFile::open_file(e.sector);
|
||||
new_file.name = name.clone();
|
||||
|
||||
return Some(new_file);
|
||||
}
|
||||
else {
|
||||
return None;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
None => {
|
||||
println!("OpenFileTale :: open :: Error opening {}", name);
|
||||
return None;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//file is not opened yet
|
||||
else {
|
||||
if(oft.nb_entry != -1){
|
||||
//il reste de la place
|
||||
let mut new_entry : OpenFileTableEntry = OpenFileTableEntry::new();
|
||||
let mut open_file : OpenFile;
|
||||
let mut new_file : OpenFile;
|
||||
//on va creer, si fichier present sur disque, deux objet open_file,
|
||||
//open_file ira dans la table
|
||||
//new_file sera renvoyé
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
return None;
|
||||
|
||||
}
|
||||
|
||||
pub fn close(name : String){
|
||||
|
||||
}
|
||||
|
||||
pub fn file_lock(name : String){
|
||||
|
||||
}
|
||||
|
||||
pub fn file_release(name : String){
|
||||
|
||||
}
|
||||
|
||||
pub fn remove(name : String)-> i32{
|
||||
0
|
||||
}
|
||||
|
||||
pub fn next_entry(oft : &mut OpenFileTable)-> i32{
|
||||
let mut i = 0;
|
||||
|
||||
for entry in oft.table.iter(){
|
||||
match entry {
|
||||
None => {
|
||||
return i;
|
||||
}
|
||||
|
||||
_ => {
|
||||
i+=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
0
|
||||
}
|
||||
|
||||
pub fn findl(oft : &mut OpenFileTable, name : &String)-> i32{
|
||||
let mut i = 0;
|
||||
|
||||
for entry in oft.table.iter(){
|
||||
|
||||
match entry {
|
||||
|
||||
Some(e) => {
|
||||
if e.name.eq(name){
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
_ => {}
|
||||
}
|
||||
|
||||
i+=1
|
||||
}
|
||||
|
||||
-1
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user