]> wirehaze git hosting - ppos.git/blob - ppos/test/pingpong-memoria.c

wirehaze git hosting

add ppos/
[ppos.git] / ppos / test / pingpong-memoria.c
1 // PingPongOS - PingPong Operating System
2 // Prof. Carlos A. Maziero, DINF UFPR
3 // Versão 2.0 -- Junho de 2025
4
5 // ATENÇÃO: ESTE ARQUIVO NÃO DEVE SER ALTERADO;
6 // ALTERAÇÕES SERÃO DESCARTADAS NA CORREÇÃO.
7
8 // Teste das operações de alocação de memória heap
9
10 #include <assert.h>
11 #include "lib/libc.h"
12 #include "ppos.h"
13
14 extern int bkl; // Big Kernel Lock (from task.c)
15
16 #define MAX_BLOCKS (1024 * 1024)
17
18 static unsigned char *block[MAX_BLOCKS];
19 static int bsize[MAX_BLOCKS];
20
21 // corpo da tarefa principal
22 void user_main()
23 {
24 int size, nblocks, avail, avail_before, avail_after;
25 void *ptr;
26 int status;
27
28 // testa mem_size
29 printf("Testando mem_size\n");
30 size = mem_size();
31 printf("mem_size retornou %d bytes\n", size);
32 assert(size > 0);
33
34 // testa mem_avail
35 printf("Testando mem_avail\n");
36 avail = mem_avail();
37 printf("mem_avail retornou %d bytes\n", avail);
38 assert(avail > 0);
39 assert(avail <= size);
40
41 // testa alocação de tamanho zero
42 printf("Testando mem_alloc com tamanho 0\n");
43 ptr = mem_alloc(0);
44 assert(ptr == NULL);
45
46 // testa alocação negativa
47 printf("Testando mem_alloc com tamanho negativo\n");
48 ptr = mem_alloc(-100);
49 assert(ptr == NULL);
50
51 // testa alocação maior que a memória disponível
52 printf("Testando mem_alloc tamanho excessivo\n");
53 avail = mem_avail();
54 ptr = mem_alloc(avail + 1);
55 assert(ptr == NULL);
56
57 // testa free nulo
58 printf("Testando mem_free com ponteiro nulo\n");
59 status = mem_free(NULL);
60 assert(status == ERROR);
61
62 // testa free inválido
63 printf("Testando mem_free com ponteiro inválido\n");
64 status = mem_free(&status);
65 assert(status == ERROR);
66
67 // alocações aleatórias
68 printf("Criando blocos de tamanho aleatório\n");
69 avail_before = mem_avail();
70 nblocks = 0;
71 do
72 {
73 // aloca um bloco de tamanho aleatorio
74 size = randnum() % (mem_size() / 1024);
75 ptr = mem_alloc(size);
76
77 if (ptr)
78 {
79 // guarda o bloco alocado
80 block[nblocks] = ptr;
81 bsize[nblocks] = size;
82 nblocks++;
83
84 // ao chegar em 10 blocos, gera relatório
85 if (nblocks == 10)
86 {
87 printf("Testando mem_report (10 alocações)\n");
88 mem_report();
89 }
90 }
91 } while (mem_avail() > 4096);
92
93 printf("Foram alocados %d blocos\n", nblocks);
94
95 // testa se alocações estão alinhadas em 16 bytes
96 printf("Testando alinhamento dos blocos alocados\n");
97 for (int i = 0; i < nblocks; i++)
98 assert(((unsigned long)block[i] % 16) == 0);
99
100 // preenche os blocos alocados
101 printf("Preenchendo blocos com bytes fixos\n");
102 for (int i = 0; i < nblocks; i++)
103 {
104 // preenche bloco com valor fixo
105 for (int j = 0; j < bsize[i]; j++)
106 block[i][j] = i % 256;
107 }
108
109 // verifica o conteúdo dos blocos alocados
110 printf("Verificando conteúdo dos blocos preenchidos\n");
111 for (int i = 0; i < nblocks; i++)
112 {
113 // verifica o conteúdo do bloco
114 for (int j = 0; j < bsize[i]; j++)
115 assert(block[i][j] == i % 256);
116 }
117
118 // liberando os blocos alocados acima
119 printf("Liberando os blocos alocados\n");
120 for (int i = 0; i < nblocks; i++)
121 {
122 status = mem_free(block[i]);
123 assert(status == NOERROR);
124
125 // ao chegar aos últimos N blocos, gera relatório
126 if (nblocks - (i + 1) == 10)
127 {
128 printf("Testando mem_report (10 alocações)\n");
129 mem_report();
130 }
131 }
132
133 // verificando se toda a memória foi liberada
134 printf("Verificando a memória disponível\n");
135 avail_after = mem_avail();
136 printf("mem_avail retornou %d bytes\n", avail_after);
137 assert(avail_after == avail_before);
138 printf("Testando mem_report (sem alocações do usuário)\n");
139 mem_report();
140
141 printf("Testes concluídos com sucesso!\n");
142
143 task_exit(0);
144 }