Nantes Université
Skip to content
GitLab
Explorer
Connexion
S'inscrire
Navigation principale
Rechercher ou aller à…
Projet
C
Chevaux_OS
Gestion
Activité
Membres
Labels
Programmation
Tickets
Tableaux des tickets
Jalons
Wiki
Code
Requêtes de fusion
Dépôt
Branches
Validations
Étiquettes
Graphe du dépôt
Comparer les révisions
Extraits de code
Compilation
Pipelines
Jobs
Planifications de pipeline
Artéfacts
Déploiement
Releases
Registre de paquets
Registre de conteneur
Registre de modèles
Opération
Environnements
Modules Terraform
Surveillance
Incidents
Service d'assistance
Analyse
Données d'analyse des chaînes de valeur
Analyse des contributeurs
Données d'analyse CI/CD
Données d'analyse du dépôt
Expériences du modèle
Aide
Aide
Support
Documentation de GitLab
Comparer les forfaits GitLab
Forum de la communauté
Contribuer à GitLab
Donner votre avis
Raccourcis clavier
?
Extraits de code
Groupes
Projets
Afficher davantage de fils d'Ariane
Leo LEMAIRE
Chevaux_OS
Validations
8b2a2c35
Vérifiée
Valider
8b2a2c35
rédigé
il y a 2 ans
par
Leo LEMAIRE
Parcourir les fichiers
Options
Téléchargements
Correctifs
Plain Diff
lancer de de+jeu
parent
cb9b053b
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
Modifications
3
Masquer les modifications d'espaces
En ligne
Côte à côte
Affichage de
3 fichiers modifiés
main.c
+48
-8
48 ajouts, 8 suppressions
main.c
user.c
+63
-6
63 ajouts, 6 suppressions
user.c
user.h
+29
-3
29 ajouts, 3 suppressions
user.h
avec
140 ajouts
et
17 suppressions
main.c
+
48
−
8
Voir le fichier @
8b2a2c35
...
...
@@ -47,12 +47,14 @@ int main(int argc, char ** argv){
p
[
1
]
=
pipes_b
[
1
];
// pipe d'entree du fils suivant
user_t
user
=
user_init
(
i
,
NB_CHEVALS
,
p
,
i
*
NB_STEPS
);
while
(
1
)
user_loop
(
user
);
while
(
1
)
user_loop
(
&
user
);
break
;
}
}
pipes
[
0
]
=
pipes_b
[
0
];
printf
(
"%d
\n
"
,
getpid
());
receive_data_t
master_data
=
{
.
pipes
=
pipes
,
.
id
=
-
1
,
...
...
@@ -68,13 +70,14 @@ int main(int argc, char ** argv){
.
r_data
=
&
master_data
,
};
request
req
=
{
.
t
=
REQ_ID
,
.
send_id
=
-
1
};
id_request
id_req
=
{
.
parent
=
req
};
print_board
(
&
master_user
,
print_board_onResponse
);
int
current_player
=
0
;
//for(int i = 0; i < 100; i++)
// send_message(pipes[1], rand()%4, &id_req, sizeof(id_req), M_REQUEST);
request
req
=
{
.
t
=
REQ_PLAY
,
.
send_id
=
-
1
};
play_request
p_req
=
{
.
parent
=
req
};
send_message
(
pipes
[
1
],
0
,
&
p_req
,
sizeof
(
p_req
),
M_REQUEST
);
print_board
(
&
master_user
,
print_board_onResponse
);
while
(
1
){
receive_loop
(
&
master_user
);
...
...
@@ -102,6 +105,9 @@ void print_board_onResponse(user_t* u){
else
print_board_flag
=
1
;
break
;
default:
fprintf
(
stderr
,
"Unexpected response handler called while printing board"
);
break
;
}
}
...
...
@@ -149,7 +155,26 @@ void print_board(user_t* u, m_onResponse cb){
}
void
master_onRequest
(
user_t
*
u
){
printf
(
"master received request
\n
"
);
request
req
;
receive_data_t
*
data
=
u
->
r_data
;
memcpy
(
&
req
,
data
->
r_buf
,
sizeof
(
req
));
switch
(
req
.
t
){
case
REQ_DICE
:
{
response
resp
=
{
.
t
=
RESP_DICE
,
.
id
=
data
->
id
};
dice_response
d_resp
=
{
.
parent
=
resp
,
.
nb
=
rand
()
%
6
+
1
,
};
send_message
(
data
->
pipes
[
1
],
req
.
send_id
,
&
d_resp
,
sizeof
(
d_resp
),
M_RESPONSE
);
printf
(
"Master received dice request from %d
\n
"
,
req
.
send_id
);
}
break
;
default:
fprintf
(
stderr
,
"Unimplemented request handler called, dropping it, (not good)"
);
break
;
}
}
int
cmp
=
0
;
...
...
@@ -165,8 +190,23 @@ void master_onResponse(user_t* u){
;
id_response
id_res
;
memcpy
(
&
id_res
,
data
->
r_buf
,
sizeof
(
id_response
));
cmp
++
;
printf
(
"Master received response from id request : %d (n°%d)
\n
"
,
id_res
.
id
,
cmp
);
break
;
case
RESP_PLAY
:
;
play_response
p_res
;
memcpy
(
&
p_res
,
data
->
r_buf
,
sizeof
(
p_res
));
printf
(
"Master received response for play order from player %d : %d
\n
"
,
res
.
id
,
p_res
.
can
);
if
(
!
p_res
.
can
){
printf
(
"Resending order to play to %d
\n
"
,
res
.
id
);
request
req
=
{
.
t
=
REQ_PLAY
,
.
send_id
=
-
1
};
play_request
p_req
=
{
.
parent
=
req
};
send_message
(
u
->
pipes
[
1
],
res
.
id
,
&
p_req
,
sizeof
(
p_req
),
M_REQUEST
);
}
break
;
default:
fprintf
(
stderr
,
"Unimplemented response callback called, dropping it
\n
"
);
break
;
}
}
This diff is collapsed.
Cliquez pour l'agrandir.
user.c
+
63
−
6
Voir le fichier @
8b2a2c35
...
...
@@ -21,12 +21,14 @@ user_t user_init(unsigned int id, unsigned int nb_cheval, int pipes[], int start
.
cont_type
=
-
1
,
.
content_off
=
0
,
.
onRequest
=
user_onRequest
,
.
onResponse
=
user_onResponse
,
};
user_t
out
=
{
.
id
=
id
,
.
nb_chevals
=
nb_cheval
,
.
pipes
=
pipes
,
.
dice
=
-
1
,
};
out
.
c
=
malloc
(
sizeof
(
cheval
)
*
nb_cheval
);
...
...
@@ -38,8 +40,8 @@ user_t user_init(unsigned int id, unsigned int nb_cheval, int pipes[], int start
return
out
;
}
void
user_loop
(
user_t
user
){
receive_loop
(
&
user
);
void
user_loop
(
user_t
*
user
){
receive_loop
(
user
);
}
void
receive_loop
(
user_t
*
u
){
...
...
@@ -79,7 +81,6 @@ void receive_loop(user_t* u){
return
;
}
switch
(
in
.
t
){
case
M_REQUEST
:
data
->
onRequest
(
u
);
...
...
@@ -87,7 +88,7 @@ void receive_loop(user_t* u){
case
M_CONT
:
break
;
case
M_RESPONSE
:
data
->
onResponse
(
u
);
break
;
...
...
@@ -123,7 +124,7 @@ void user_onRequest(user_t* u){
switch
(
req
.
t
){
case
REQ_ID
:
{
response
resp
=
{
.
t
=
RESP_ID
};
response
resp
=
{
.
t
=
RESP_ID
,
.
id
=
data
->
id
};
id_response
id_resp
=
{
.
parent
=
resp
,
.
id
=
data
->
id
,
...
...
@@ -137,7 +138,7 @@ void user_onRequest(user_t* u){
case_request
c_req
;
memcpy
(
&
c_req
,
data
->
r_buf
,
sizeof
(
c_req
));
response
resp
=
{
.
t
=
RESP_CASE
};
response
resp
=
{
.
t
=
RESP_CASE
,
.
id
=
data
->
id
};
case_response
case_resp
=
{
.
parent
=
resp
,
.
player_id
=
u
->
id
,
...
...
@@ -154,5 +155,61 @@ void user_onRequest(user_t* u){
send_message
(
data
->
pipes
[
1
],
req
.
send_id
,
&
case_resp
,
sizeof
(
case_resp
),
M_RESPONSE
);
}
break
;
case
REQ_PLAY
:
{
play_request
p_req
;
memcpy
(
&
p_req
,
data
->
r_buf
,
sizeof
(
p_req
));
response
resp
=
{
.
t
=
RESP_PLAY
,
.
id
=
data
->
id
};
play_response
p_resp
=
{
.
parent
=
resp
,
.
can
=
0
,
};
printf
(
"%d : pret à jouer (de=%d / %d)
\n
"
,
u
->
id
,
u
->
dice
,
&
u
->
dice
);
if
(
u
->
dice
==
-
1
){
// si on as besoin d'un nouveau lancer de de
p_resp
.
can
=
0
;
// on dis qu'on peut pas jouer
send_message
(
u
->
pipes
[
1
],
req
.
send_id
,
&
p_resp
,
sizeof
(
p_resp
),
M_RESPONSE
);
request
d_req
=
{
.
t
=
REQ_DICE
,
.
send_id
=
u
->
id
};
dice_request
dc_req
=
{
.
parent
=
d_req
};
send_message
(
u
->
pipes
[
1
],
req
.
send_id
,
&
dc_req
,
sizeof
(
dc_req
),
M_REQUEST
);
}
else
{
p_resp
.
can
=
1
;
send_message
(
u
->
pipes
[
1
],
req
.
send_id
,
&
p_resp
,
sizeof
(
p_resp
),
M_RESPONSE
);
user_play
(
u
);
}
}
break
;
default:
fprintf
(
stderr
,
"%d non implemented request handler called (bad), type=%d
\n
"
,
u
->
id
,
req
.
t
);
break
;
}
}
void
user_onResponse
(
user_t
*
u
){
receive_data_t
*
data
=
u
->
r_data
;
response
res
;
memcpy
(
&
res
,
data
->
r_buf
,
sizeof
(
res
));
switch
(
res
.
t
)
{
case
RESP_DICE
:
;
dice_response
dice_res
;
memcpy
(
&
dice_res
,
data
->
r_buf
,
sizeof
(
dice_res
));
u
->
dice
=
dice_res
.
nb
;
printf
(
"%d received response from dice request : %d (from %d) %d
\n
"
,
u
->
id
,
u
->
dice
,
res
.
id
,
getpid
());
break
;
default:
fprintf
(
stderr
,
"%d : Unimplemented response callback called, dropping it
\n
"
,
u
->
id
);
break
;
}
}
void
user_play
(
user_t
*
user
){
printf
(
"user %d pret à jouer
\n
"
,
user
->
id
);
//user->dice = -1; // on invalide le lancer de de maintenant qu'on l'a utilise
}
\ No newline at end of file
This diff is collapsed.
Cliquez pour l'agrandir.
user.h
+
29
−
3
Voir le fichier @
8b2a2c35
...
...
@@ -13,6 +13,7 @@ typedef struct {
cheval_t
*
c
;
unsigned
char
nb_chevals
;
int
*
pipes
;
int
dice
;
// valeur de de stockee, -1 pour une valeur invalide (usee)
receive_data_t
*
r_data
;
}
user_t
;
...
...
@@ -34,6 +35,8 @@ typedef struct {
typedef
enum
REQ_TYPE
{
REQ_ID
,
// request d'id (sert a rien, juste un test)
REQ_CASE
,
// request si il y as un pion sur la case
REQ_PLAY
,
// demande a un joueur de jouer
REQ_DICE
,
// demande un lancer de de
}
REQ_TYPE
;
typedef
struct
{
...
...
@@ -50,10 +53,19 @@ typedef struct {
int
case_nb
;
}
case_request
;
typedef
enum
RESP_TYPE
{
RESP_ID
,
RESP_CASE
}
RESP_TYPE
;
typedef
struct
{
request
parent
;
}
play_request
;
typedef
struct
{
request
parent
;
}
dice_request
;
typedef
enum
RESP_TYPE
{
RESP_ID
,
RESP_CASE
,
RESP_PLAY
,
RESP_DICE
}
RESP_TYPE
;
typedef
struct
{
RESP_TYPE
t
;
int
id
;
}
response
;
typedef
struct
{
...
...
@@ -67,6 +79,16 @@ typedef struct {
int
player_id
;
}
case_response
;
typedef
struct
{
response
parent
;
int
can
;
// boolean si le joueur a pu joueur (ex si il as besoin d'un lancer de avant de jouer)
}
play_response
;
typedef
struct
{
response
parent
;
unsigned
int
nb
;
}
dice_response
;
#define R_CHUNK_SIZE 64
typedef
void
(
*
m_onRequest
)(
user_t
*
buf
);
...
...
@@ -84,7 +106,11 @@ struct receive_data {
};
user_t
user_init
(
unsigned
int
id
,
unsigned
int
nb_cheval
,
int
pipes
[],
int
start
);
void
user_loop
(
user_t
user
);
void
user_loop
(
user_t
*
user
);
void
receive_loop
(
user_t
*
data
);
void
user_play
(
user_t
*
user
);
void
send_message
(
int
pipe
,
int
dest_id
,
void
*
content
,
int
content_size
,
M_TYPE
type
);
void
user_onRequest
(
user_t
*
data
);
\ No newline at end of file
void
user_onRequest
(
user_t
*
data
);
void
user_onResponse
(
user_t
*
data
);
\ No newline at end of file
This diff is collapsed.
Cliquez pour l'agrandir.
Aperçu
0%
Chargement en cours
Veuillez réessayer
ou
joindre un nouveau fichier
.
Annuler
You are about to add
0
people
to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Enregistrer le commentaire
Annuler
Veuillez vous
inscrire
ou vous
se connecter
pour commenter