nucleo
Nucleo di Calcolatori Elettronici
Caricamento in corso...
Ricerca in corso...
Nessun risultato
mailbox-dyn.cpp
1/*
2 * Mailbox con memoria dinamica
3 */
4
5#include <all.h>
6
7const int NMESG = 5;
8const int MSG_SIZE = 100;
9
10natl mailbox_piena;
11natl mailbox_vuota;
12natl terminati;
13
14struct mess {
15 int mittente;
16 char corpo[MSG_SIZE];
17};
18
19mess* mailbox;
20
21void pms(natq a)
22{
23 mess *ptr;
24 for (int i = 0; i < NMESG; i++) {
25 ptr = new mess;
26 if (!ptr) {
27 flog(LOG_WARN, "memoria esaurita");
28 break;
29 }
30 ptr->mittente = a;
31 snprintf(ptr->corpo, MSG_SIZE, "Messaggio numero %d", i);
32 sem_wait(mailbox_vuota);
33 mailbox = ptr;
34 sem_signal(mailbox_piena);
35 delay(20);
36 }
37 printf("fine scrittore %lu\n", a);
38 sem_signal(terminati);
39
41}
42void pml(natq a)
43{
44 mess *ptr;
45 for (int i = 0; i < 2 * NMESG; i++) {
46 sem_wait(mailbox_piena);
47 ptr = mailbox;
48 sem_signal(mailbox_vuota);
49 printf("messaggio %d da %d: %s\n",
50 i, ptr->mittente, ptr->corpo);
51 delete ptr;
52 ptr = 0;
53 }
54 printf("fine lettore\n");
55 sem_signal(terminati);
56
58}
59
60extern "C" void main()
61{
62 if ( (mailbox_piena = sem_ini(0)) == 0xFFFFFFFF )
63 fpanic("Impossibile creare semaforo mailbox_piena");
64 if ( (mailbox_vuota = sem_ini(1)) == 0xFFFFFFFF )
65 fpanic("Impossibile creare semaforo mailbox_vuota");
66 if ( (terminati = sem_ini(0)) == 0xFFFFFFFF )
67 fpanic("Impossibile creare semaforo terminati");
68 if (activate_p(pms, 1, 5, LIV_UTENTE) == 0xFFFFFFFF)
69 fpanic("Impossibile creare processo pms(1)");
70 if (activate_p(pms, 2, 5, LIV_UTENTE) == 0xFFFFFFFF)
71 fpanic("Impossibile creare processo pms(2)");
72 if (activate_p(pml, 0, 5, LIV_UTENTE) == 0xFFFFFFFF)
73 fpanic("Impossibile creare processo pml");
74 for (int i = 0; i < 3; i++)
75 sem_wait(terminati);
76 pause();
77
79}
File da includere nei programmi utente.
unsigned long natq
void main(natl magic, multiboot_info_t *mbi)
#define LIV_UTENTE
unsigned int natl
void flog(log_sev sev, const char *fmt,...)
void pause()
void fpanic(const char *fmt,...)
int printf(const char *fmt,...)
int snprintf(char *buf, natl n, const char *fmt,...)
LOG_WARN
natl sem_ini(int val)
Crea un nuovo semaforo.
void sem_wait(natl sem)
Estrae un gettone da un semaforo.
void sem_signal(natl sem)
Inserisce un gettone in un semaforo.
void delay(natl n)
Sospende il processo corrente.
natl activate_p(void f(natq), natq a, natl prio, natl liv)
Crea un nuovo processo.
void terminate_p()
Termina il processo corrente.