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
ac9940e5
Vérifiée
Valider
ac9940e5
rédigé
il y a 2 ans
par
Leo LEMAIRE
Parcourir les fichiers
Options
Téléchargements
Correctifs
Plain Diff
separate receive routine
parent
48086ed7
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
+12
-10
12 ajouts, 10 suppressions
main.c
user.c
+60
-31
60 ajouts, 31 suppressions
user.c
user.h
+31
-9
31 ajouts, 9 suppressions
user.h
avec
103 ajouts
et
50 suppressions
main.c
+
12
−
10
Voir le fichier @
ac9940e5
...
...
@@ -38,21 +38,23 @@ 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
);
user_data_t
user_data
;
while
(
1
)
user_loop
(
user
,
user_data
);
while
(
1
)
user_loop
(
user
);
break
;
}
}
pipes
[
0
]
=
pipes_b
[
0
];
id_request
id_req
;
request
req
=
{
.
t
=
R_ID
};
memcpy
(
req
.
content
,
&
id_req
,
sizeof
(
id_req
));
send_message
(
pipes
[
1
],
0
,
&
req
,
sizeof
(
req
),
M_REQUEST
);
request
req
=
{
.
t
=
REQ_ID
};
id_request
id_req
=
{
.
parent
=
req
};
send_message
(
pipes
[
1
],
0
,
&
id_req
,
sizeof
(
id_req
),
M_REQUEST
);
send_message
(
pipes
[
1
],
3
,
&
id_req
,
sizeof
(
id_req
),
M_REQUEST
);
memcpy
(
req
.
content
,
&
id_req
,
sizeof
(
id_req
));
send_message
(
pipes
[
1
],
1
,
&
req
,
sizeof
(
req
),
M_REQUEST
);
send_message
(
pipes
[
1
],
1
,
&
id_req
,
sizeof
(
id_req
),
M_REQUEST
);
memcpy
(
req
.
content
,
&
id_req
,
sizeof
(
id_req
));
send_message
(
pipes
[
1
],
3
,
&
req
,
sizeof
(
req
),
M_REQUEST
);
send_message
(
pipes
[
1
],
2
,
&
id_req
,
sizeof
(
id_req
),
M_REQUEST
);
while
(
1
){
}
}
This diff is collapsed.
Cliquez pour l'agrandir.
user.c
+
60
−
31
Voir le fichier @
ac9940e5
...
...
@@ -8,7 +8,18 @@
user_t
user_init
(
unsigned
int
id
,
unsigned
int
nb_cheval
,
int
pipes
[]){
cheval_t
chevals
[
nb_cheval
];
receive_data_t
r_data
=
{
.
pipes
=
pipes
,
.
id
=
id
,
.
r_buf
=
malloc
(
R_CHUNK_SIZE
),
.
cont_id
=
-
1
,
.
cont_type
=
-
1
,
.
content_off
=
0
,
.
onRequest
=
user_onRequest
,
};
user_t
out
=
{
.
id
=
id
,
.
c
=
chevals
,
...
...
@@ -16,52 +27,60 @@ user_t user_init(unsigned int id, unsigned int nb_cheval, int pipes[]){
.
pipes
=
pipes
,
};
out
.
r_data
=
malloc
(
sizeof
(
r_data
));
memcpy
(
out
.
r_data
,
&
r_data
,
sizeof
(
r_data
));
return
out
;
}
void
user_loop
(
user_t
user
,
user_data_t
data
){
void
user_loop
(
user_t
user
){
receive_loop
(
user
.
r_data
);
}
void
receive_loop
(
receive_data_t
*
data
){
message
in
;
read
(
user
.
pipes
[
0
],
&
in
,
sizeof
(
message
));
read
(
data
->
pipes
[
0
],
&
in
,
sizeof
(
message
));
if
(
in
.
dest_id
!=
user
.
id
){
// si le message ne nous est pas destine on le passe au suivant de facon transparente
write
(
user
.
pipes
[
1
],
&
in
,
sizeof
(
message
));
if
(
in
.
dest_id
!=
data
->
id
){
// si le message ne nous est pas destine on le passe au suivant de facon transparente
write
(
data
->
pipes
[
1
],
&
in
,
sizeof
(
message
));
return
;
}
switch
(
in
.
t
){
case
M_REQUEST
:
memcpy
(
&
data
.
req
,
&
in
.
content
+
data
.
content_off
,
in
.
content_size
);
data
.
content_off
=
in
.
content_size
;
if
(
in
.
cont_id
!=
-
1
)
break
;
// si c'est le dernier message
data
->
content_off
=
0
;
data
->
r_buf
=
realloc
(
data
->
r_buf
,
R_CHUNK_SIZE
);
user_onRequest
(
user
,
data
.
req
);
memcpy
(
data
->
r_buf
,
&
in
.
content
+
data
->
content_off
,
in
.
content_size
);
data
->
content_off
=
in
.
content_size
;
break
;
case
M_CONT
:
if
(
in
.
id
!=
data
.
cont_id
)
fprintf
(
stderr
,
"Continuation message of an unknown source, dropping it"
);
if
(
in
.
t
!=
data
.
cont_type
)
fprintf
(
stderr
,
"Continuation message of the wrong type, dropping it"
);
void
*
target
;
switch
(
data
.
cont_type
){
case
M_REQUEST
:
target
=
&
data
.
req
;
break
;
default:
fprintf
(
stderr
,
"message type not implemented, dropping it"
);
break
;
if
(
in
.
id
!=
data
->
cont_id
){
fprintf
(
stderr
,
"Continuation message of an unknown source, dropping it"
);
return
;
}
if
(
in
.
t
!=
data
->
cont_type
){
fprintf
(
stderr
,
"Continuation message of the wrong type, dropping it"
);
return
;
}
memcpy
(
target
,
&
in
.
content
+
data
.
content_off
,
in
.
content_size
);
data
.
content_off
+=
in
.
content_size
;
if
(
in
.
cont_id
!=
-
1
)
break
;
user_onRequest
(
user
,
data
.
req
);
data
->
r_buf
=
realloc
(
data
->
r_buf
,
data
->
content_off
+
in
.
content_size
);
memcpy
(
data
->
r_buf
,
&
in
.
content
+
data
->
content_off
,
in
.
content_size
);
data
->
content_off
+=
in
.
content_size
;
break
;
case
M_RESPONSE
:
break
;
}
if
(
in
.
cont_id
!=
-
1
){
// si ce n'est pas le dernier message
data
->
cont_id
=
in
.
cont_id
;
data
->
cont_type
=
in
.
t
;
return
;
}
data
->
onRequest
(
data
);
}
void
send_message
(
int
pipe
,
int
dest_id
,
void
*
content
,
int
content_size
,
M_TYPE
type
){
...
...
@@ -85,10 +104,20 @@ void send_message(int pipe, int dest_id, void* content, int content_size, M_TYPE
}
}
void
user_onRequest
(
user_t
user
,
request
r
){
switch
(
r
.
t
){
case
R_ID
:
printf
(
"%d received id request
\n
"
,
user
.
id
);
void
user_onRequest
(
receive_data_t
*
data
){
request
req
;
memcpy
(
&
req
,
data
->
r_buf
,
sizeof
(
req
));
switch
(
req
.
t
){
case
REQ_ID
:
;
response
resp
=
{
.
t
=
RESP_ID
};
id_response
id_resp
=
{
.
parent
=
resp
,
.
id
=
data
->
id
,
};
send_message
(
data
->
pipes
[
1
],
-
1
,
&
id_resp
,
sizeof
(
id_resp
),
M_RESPONSE
);
printf
(
"%d received id request
\n
"
,
data
->
id
);
break
;
}
}
\ No newline at end of file
This diff is collapsed.
Cliquez pour l'agrandir.
user.h
+
31
−
9
Voir le fichier @
ac9940e5
...
...
@@ -4,11 +4,14 @@ typedef struct {
int
escalier
;
// si le cheval est dans l'escalier
}
cheval_t
;
typedef
struct
receive_data
receive_data_t
;
typedef
struct
{
unsigned
int
id
;
cheval_t
*
c
;
unsigned
char
nb_chevals
;
int
*
pipes
;
receive_data_t
*
r_data
;
}
user_t
;
#define M_SIZE 64
...
...
@@ -24,27 +27,46 @@ typedef struct {
int
cont_id
;
// id du message continuant celui-ci -1 si c'est le dernier
}
message
;
#define R_SIZE 64
#define R
EQ
_SIZE 64
typedef
enum
R_TYPE
{
R_ID
}
R_TYPE
;
typedef
enum
R
EQ
_TYPE
{
R
EQ
_ID
}
R
EQ
_TYPE
;
typedef
struct
{
R_TYPE
t
;
char
content
[
R_SIZE
];
REQ_TYPE
t
;
}
request
;
typedef
struct
{
request
parent
;
}
id_request
;
typedef
enum
RESP_TYPE
{
RESP_ID
}
RESP_TYPE
;
typedef
struct
{
RESP_TYPE
t
;
}
response
;
typedef
struct
{
request
req
;
// request actuelle
response
parent
;
int
id
;
}
id_response
;
#define R_CHUNK_SIZE 64
typedef
void
(
*
m_onRequest
)(
receive_data_t
*
buf
);
struct
receive_data
{
int
*
pipes
;
int
id
;
char
*
r_buf
;
int
cont_id
;
// id du prochain message attendu
M_TYPE
cont_type
;
// type de message en cours de reception
int
content_off
;
//offset de reception actuel
}
user_data_t
;
m_onRequest
onRequest
;
};
user_t
user_init
(
unsigned
int
id
,
unsigned
int
nb_cheval
,
int
pipes
[]);
void
user_loop
(
user_t
user
,
user_data_t
);
void
user_loop
(
user_t
user
);
void
receive_loop
(
receive_data_t
*
data
);
void
send_message
(
int
pipe
,
int
dest_id
,
void
*
content
,
int
content_size
,
M_TYPE
type
);
void
user_onRequest
(
user_t
user
,
request
r
);
\ No newline at end of file
void
user_onRequest
(
receive_data_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