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