]>
wirehaze git hosting - ppos.git/blob - 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
5 // ATENÇÃO: ESTE ARQUIVO NÃO DEVE SER ALTERADO;
6 // ALTERAÇÕES SERÃO DESCARTADAS NA CORREÇÃO.
8 // Teste das operações de alocação de memória heap
14 extern int bkl
; // Big Kernel Lock (from task.c)
16 #define MAX_BLOCKS (1024 * 1024)
18 static unsigned char *block
[MAX_BLOCKS
];
19 static int bsize
[MAX_BLOCKS
];
21 // corpo da tarefa principal
24 int size
, nblocks
, avail
, avail_before
, avail_after
;
29 printf("Testando mem_size\n");
31 printf("mem_size retornou %d bytes\n", size
);
35 printf("Testando mem_avail\n");
37 printf("mem_avail retornou %d bytes\n", avail
);
39 assert(avail
<= size
);
41 // testa alocação de tamanho zero
42 printf("Testando mem_alloc com tamanho 0\n");
46 // testa alocação negativa
47 printf("Testando mem_alloc com tamanho negativo\n");
48 ptr
= mem_alloc(-100);
51 // testa alocação maior que a memória disponível
52 printf("Testando mem_alloc tamanho excessivo\n");
54 ptr
= mem_alloc(avail
+ 1);
58 printf("Testando mem_free com ponteiro nulo\n");
59 status
= mem_free(NULL
);
60 assert(status
== ERROR
);
62 // testa free inválido
63 printf("Testando mem_free com ponteiro inválido\n");
64 status
= mem_free(&status
);
65 assert(status
== ERROR
);
67 // alocações aleatórias
68 printf("Criando blocos de tamanho aleatório\n");
69 avail_before
= mem_avail();
73 // aloca um bloco de tamanho aleatorio
74 size
= randnum() % (mem_size() / 1024);
75 ptr
= mem_alloc(size
);
79 // guarda o bloco alocado
81 bsize
[nblocks
] = size
;
84 // ao chegar em 10 blocos, gera relatório
87 printf("Testando mem_report (10 alocações)\n");
91 } while (mem_avail() > 4096);
93 printf("Foram alocados %d blocos\n", nblocks
);
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);
100 // preenche os blocos alocados
101 printf("Preenchendo blocos com bytes fixos\n");
102 for (int i
= 0; i
< nblocks
; i
++)
104 // preenche bloco com valor fixo
105 for (int j
= 0; j
< bsize
[i
]; j
++)
106 block
[i
][j
] = i
% 256;
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
++)
113 // verifica o conteúdo do bloco
114 for (int j
= 0; j
< bsize
[i
]; j
++)
115 assert(block
[i
][j
] == i
% 256);
118 // liberando os blocos alocados acima
119 printf("Liberando os blocos alocados\n");
120 for (int i
= 0; i
< nblocks
; i
++)
122 status
= mem_free(block
[i
]);
123 assert(status
== NOERROR
);
125 // ao chegar aos últimos N blocos, gera relatório
126 if (nblocks
- (i
+ 1) == 10)
128 printf("Testando mem_report (10 alocações)\n");
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");
141 printf("Testes concluídos com sucesso!\n");