impl oft to finish

This commit is contained in:
Moysan Gabriel 2023-04-05 01:26:17 +02:00
parent 3f3c79ec0c
commit 6ad3b36201

View File

@ -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
}
}