Greetings !!
Je suis en train de m'arracher les dreadlocks...
Voilà l'extrait du thread principal...
J'ai déjà bien galéré pour que le compilateur ne bronche plus...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 let connection = establish_connection(); let mut connection_handle = connection.unwrap(); let arc_connection = Arc::new(Mutex::new(&mut connection_handle)); let threadscope = thread::scope ( |thescope| { 'connexion: loop { for stream in Listener.incoming() { match stream { Ok(saloperie) => { let arc_stream = Arc::new(Mutex::new(saloperie)); println!("[{:?}] Connection granted !!", Local::now()); let rc = thescope.spawn(|| client_handler(arc_stream,&arc_connection)); let value = rc.join().unwrap(); if value.is_negative() { break 'connexion; } } Err(erreur) => { eprintln!("Error: {}", erreur); } } // end match } // end for sleep(Duration::from_millis(80)); } // end loop } );
Manifestement je ne maîtrise pas du tout cette boîte noire appelée "borrowing" et ça commence tout doucement à me ca**er les c...
Je pourrais taper le handler en static mutable mais je me suis dit que je pourrais faire cela sans devoir me taper des unsafe à tout bout de champs.
Du coup voilà le client_handlerDans ce client handler je fais une première fois
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 pub fn client_handler(arc_stream :Arc<Mutex<TcpStream>>, arc_connect :&Arc<Mutex<&mut PooledConn>> ) -> i32 { ... let res_connection = arc_connect.lock(); ... }
...avec une larme de joie sur la joue ça marche... je me dis "c'est bon je continue"...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 let result = player_fromDB.getIDbyName(&mut res_connection.unwrap(), onePlayer.getString()); if result > 0 { println!("[DB] {} found !!",onePlayer.getString()); // In this case some computing must be done... later. } else { println!("[DB] {} not found !!",onePlayer.getString()); // In this case the player must be inserted to the DB... later. }
...puis je fais un peu plus loin...
...et là mes croyances se sont effondrées :{
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 if player_fromDB.getID() > 0 { // update player_fromDB.setScore(onePlayer.getScoreP(),onePlayer.getScoreO()); GEN_updateDB(player_fromDB,&mut res_connection.unwrap()); }
Pas moyen de cloner, pas moyen de rien...| let res_connection = arc_connect.lock();
| -------------- move occurs because `res_connection` has type `Result<MutexGuard<'_, &mut PooledConn>, PoisonError<...>>`, which does not implement the `Copy` trait
...
229 | let result = player_fromDB.getIDbyName(&mut res_connection.unwrap(), onePlayer.getString());
| -------------- -------- `res_connection` moved due to this method call
| |
| help: consider calling `.as_ref()` or `.as_mut()` to borrow the type's contents
...
339 | GEN_updateDB(player_fromDB,&mut res_connection.unwrap());
| ^^^^^^^^^^^^^^ value used here after move
Je fais comment maintenant ???
C'est tellement de la merde Rust qu'il "suffisait" de taper le unwrap dans une bête variable...
Code : Sélectionner tout - Visualiser dans une fenêtre à part let couillonade = &mut res_connection.unwrap();









Répondre avec citation
Partager