root/maint/gnulib/tests/test-memalign.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. main
  2. main

   1 /* Test of allocating memory with given alignment.
   2 
   3    Copyright (C) 2020-2021 Free Software Foundation, Inc.
   4 
   5    This program is free software: you can redistribute it and/or modify
   6    it under the terms of the GNU General Public License as published by
   7    the Free Software Foundation; either version 3 of the License, or
   8    (at your option) any later version.
   9 
  10    This program is distributed in the hope that it will be useful,
  11    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13    GNU General Public License for more details.
  14 
  15    You should have received a copy of the GNU General Public License
  16    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
  17 
  18 /* Written by Bruno Haible <bruno@clisp.org>, 2020.  */
  19 
  20 #include <config.h>
  21 
  22 #if HAVE_MEMALIGN
  23 
  24 /* Specification.  */
  25 # include <malloc.h>
  26 
  27 # include <stdint.h>
  28 # include <stdlib.h>
  29 # include <string.h>
  30 
  31 # include "macros.h"
  32 
  33 int
  34 main (int argc, char *argv[])
     /* [previous][next][first][last][top][bottom][index][help] */
  35 {
  36   static size_t sizes[] =
  37     { 13, 8, 17, 450, 320, 1, 99, 4, 15, 16, 2, 76, 37, 127, 2406, 641, 5781 };
  38   void *aligned2_blocks[SIZEOF (sizes)];
  39   void *aligned4_blocks[SIZEOF (sizes)];
  40   void *aligned8_blocks[SIZEOF (sizes)];
  41   void *aligned16_blocks[SIZEOF (sizes)];
  42   void *aligned32_blocks[SIZEOF (sizes)];
  43   void *aligned64_blocks[SIZEOF (sizes)];
  44   size_t i;
  45 
  46   for (i = 0; i < SIZEOF (sizes); i++)
  47     {
  48       size_t size = sizes[i];
  49 
  50       aligned2_blocks[i] = memalign (2, size);
  51       ASSERT (aligned2_blocks[i] != NULL);
  52       ASSERT (((uintptr_t) aligned2_blocks[i] % 2) == 0);
  53       memset (aligned2_blocks[i], 'u', size);
  54 
  55       aligned4_blocks[i] = memalign (4, size);
  56       ASSERT (aligned4_blocks[i] != NULL);
  57       ASSERT (((uintptr_t) aligned4_blocks[i] % 4) == 0);
  58       memset (aligned4_blocks[i], 'v', size);
  59 
  60       aligned8_blocks[i] = memalign (8, size);
  61       ASSERT (aligned8_blocks[i] != NULL);
  62       ASSERT (((uintptr_t) aligned8_blocks[i] % 8) == 0);
  63       memset (aligned8_blocks[i], 'w', size);
  64 
  65       aligned16_blocks[i] = memalign (16, size);
  66       ASSERT (aligned16_blocks[i] != NULL);
  67       ASSERT (((uintptr_t) aligned16_blocks[i] % 16) == 0);
  68       memset (aligned16_blocks[i], 'x', size);
  69 
  70       aligned32_blocks[i] = memalign (32, size);
  71       ASSERT (aligned32_blocks[i] != NULL);
  72       ASSERT (((uintptr_t) aligned32_blocks[i] % 32) == 0);
  73       memset (aligned32_blocks[i], 'y', size);
  74 
  75       aligned64_blocks[i] = memalign (64, size);
  76       ASSERT (aligned64_blocks[i] != NULL);
  77       ASSERT (((uintptr_t) aligned64_blocks[i] % 64) == 0);
  78       memset (aligned64_blocks[i], 'z', size);
  79     }
  80 
  81   for (i = 0; i < SIZEOF (sizes); i++)
  82     {
  83       free (aligned2_blocks[i]);
  84       free (aligned4_blocks[i]);
  85       free (aligned8_blocks[i]);
  86       free (aligned16_blocks[i]);
  87       free (aligned32_blocks[i]);
  88       free (aligned64_blocks[i]);
  89     }
  90 
  91   return 0;
  92 }
  93 
  94 #else
  95 
  96 # include <stdio.h>
  97 
  98 int
  99 main (int argc, char *argv[])
     /* [previous][next][first][last][top][bottom][index][help] */
 100 {
 101   fputs ("Skipping test: function 'memalign' does not exist\n", stderr);
 102   return 77;
 103 }
 104 
 105 #endif

/* [previous][next][first][last][top][bottom][index][help] */