|
Packit |
b8b331 |
/* gen-posix-lock-obj.c - Build tool to construct the lock object.
|
|
Packit |
b8b331 |
Copyright (C) 2014 g10 Code GmbH
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
This file is part of libgpg-error.
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
libgpg-error is free software; you can redistribute it and/or
|
|
Packit |
b8b331 |
modify it under the terms of the GNU Lesser General Public License
|
|
Packit |
b8b331 |
as published by the Free Software Foundation; either version 2.1 of
|
|
Packit |
b8b331 |
the License, or (at your option) any later version.
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
libgpg-error is distributed in the hope that it will be useful, but
|
|
Packit |
b8b331 |
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
b8b331 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
b8b331 |
Lesser General Public License for more details.
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
You should have received a copy of the GNU Lesser General Public
|
|
Packit |
b8b331 |
License along with this program; if not, see <https://www.gnu.org/licenses/>.
|
|
Packit |
b8b331 |
*/
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
#if HAVE_CONFIG_H
|
|
Packit |
b8b331 |
#include <config.h>
|
|
Packit |
b8b331 |
#endif
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
#ifdef HAVE_W32_SYSTEM
|
|
Packit |
b8b331 |
# error This module may not be build for Windows.
|
|
Packit |
b8b331 |
#endif
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
#include <stdlib.h>
|
|
Packit |
b8b331 |
#include <string.h>
|
|
Packit |
b8b331 |
#include <stdio.h>
|
|
Packit |
b8b331 |
#include <errno.h>
|
|
Packit |
b8b331 |
#ifdef USE_POSIX_THREADS
|
|
Packit |
b8b331 |
# include <pthread.h>
|
|
Packit |
b8b331 |
#endif
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
#include "posix-lock-obj.h"
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
#define PGM "gen-posix-lock-obj"
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
/* Check that configure did its job. */
|
|
Packit |
b8b331 |
#ifdef USE_POSIX_THREADS
|
|
Packit |
b8b331 |
#if SIZEOF_PTHREAD_MUTEX_T < 4
|
|
Packit |
b8b331 |
# error sizeof pthread_mutex_t is not known.
|
|
Packit |
b8b331 |
#endif
|
|
Packit |
b8b331 |
#endif
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
/* Special requirements for certain platforms. */
|
|
Packit |
b8b331 |
# define USE_LONG_DOUBLE_FOR_ALIGNMENT 0
|
|
Packit |
b8b331 |
#if defined(__sun) && !defined (__LP64__) && !defined(_LP64)
|
|
Packit |
b8b331 |
/* Solaris on 32-bit architecture. */
|
|
Packit |
b8b331 |
# define USE_DOUBLE_FOR_ALIGNMENT 1
|
|
Packit |
b8b331 |
#else
|
|
Packit |
b8b331 |
# define USE_DOUBLE_FOR_ALIGNMENT 0
|
|
Packit |
b8b331 |
#endif
|
|
Packit |
b8b331 |
#if defined(__hppa__)
|
|
Packit |
b8b331 |
# define USE_16BYTE_ALIGNMENT 1
|
|
Packit |
b8b331 |
#else
|
|
Packit |
b8b331 |
# define USE_16BYTE_ALIGNMENT 0
|
|
Packit |
b8b331 |
#endif
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
#if USE_16BYTE_ALIGNMENT && !HAVE_GCC_ATTRIBUTE_ALIGNED
|
|
Packit |
b8b331 |
# error compiler is not able to enforce a 16 byte alignment
|
|
Packit |
b8b331 |
#endif
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
#ifdef USE_POSIX_THREADS
|
|
Packit |
b8b331 |
static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
|
|
Packit |
b8b331 |
#endif
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
int
|
|
Packit |
b8b331 |
main (void)
|
|
Packit |
b8b331 |
{
|
|
Packit |
b8b331 |
#ifdef USE_POSIX_THREADS
|
|
Packit |
b8b331 |
unsigned char *p;
|
|
Packit |
b8b331 |
int i;
|
|
Packit |
b8b331 |
#endif
|
|
Packit |
b8b331 |
struct {
|
|
Packit |
b8b331 |
long vers;
|
|
Packit |
b8b331 |
#ifdef USE_POSIX_THREADS
|
|
Packit |
b8b331 |
pthread_mutex_t mtx;
|
|
Packit |
b8b331 |
#endif
|
|
Packit |
b8b331 |
} dummyobj;
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
#ifdef USE_POSIX_THREADS
|
|
Packit |
b8b331 |
if (sizeof mtx != SIZEOF_PTHREAD_MUTEX_T)
|
|
Packit |
b8b331 |
{
|
|
Packit |
b8b331 |
fprintf (stderr, PGM ": pthread_mutex_t mismatch\n");
|
|
Packit |
b8b331 |
exit (1);
|
|
Packit |
b8b331 |
}
|
|
Packit |
b8b331 |
#endif /*USE_POSIX_THREADS*/
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
if (sizeof (dummyobj) != sizeof (_gpgrt_lock_t))
|
|
Packit |
b8b331 |
{
|
|
Packit |
b8b331 |
fprintf (stderr, PGM ": internal and external lock object mismatch\n");
|
|
Packit |
b8b331 |
exit (1);
|
|
Packit |
b8b331 |
}
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
printf ("## lock-obj-pub.%s.h%s\n"
|
|
Packit |
b8b331 |
"## File created by " PGM " - DO NOT EDIT\n"
|
|
Packit |
b8b331 |
"## To be included by mkheader into gpg-error.h\n"
|
|
Packit |
b8b331 |
"\n",
|
|
Packit |
b8b331 |
HOST_TRIPLET_STRING,
|
|
Packit |
b8b331 |
#ifdef USE_POSIX_THREADS
|
|
Packit |
b8b331 |
""
|
|
Packit |
b8b331 |
#else
|
|
Packit |
b8b331 |
" - NO LOCK SUPPORT"
|
|
Packit |
b8b331 |
#endif
|
|
Packit |
b8b331 |
);
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
#ifdef USE_POSIX_THREADS
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
/* To force a probably suitable alignment of the structure we use a
|
|
Packit |
b8b331 |
union and include a long and a pointer to a long. */
|
|
Packit |
b8b331 |
printf ("typedef struct\n"
|
|
Packit |
b8b331 |
"{\n"
|
|
Packit |
b8b331 |
" long _vers;\n"
|
|
Packit |
b8b331 |
" union {\n"
|
|
Packit |
b8b331 |
" volatile char _priv[%d];\n"
|
|
Packit |
b8b331 |
"%s"
|
|
Packit |
b8b331 |
" long _x_align;\n"
|
|
Packit |
b8b331 |
" long *_xp_align;\n"
|
|
Packit |
b8b331 |
" } u;\n"
|
|
Packit |
b8b331 |
"} gpgrt_lock_t;\n"
|
|
Packit |
b8b331 |
"\n"
|
|
Packit |
b8b331 |
"#define GPGRT_LOCK_INITIALIZER {%d,{{",
|
|
Packit |
b8b331 |
SIZEOF_PTHREAD_MUTEX_T,
|
|
Packit |
b8b331 |
# if USE_16BYTE_ALIGNMENT
|
|
Packit |
b8b331 |
" int _x16_align __attribute__ ((aligned (16)));\n",
|
|
Packit |
b8b331 |
# elif USE_DOUBLE_FOR_ALIGNMENT
|
|
Packit |
b8b331 |
" double _xd_align;\n",
|
|
Packit |
b8b331 |
# elif USE_LONG_DOUBLE_FOR_ALIGNMENT
|
|
Packit |
b8b331 |
" long double _xld_align;\n",
|
|
Packit |
b8b331 |
# else
|
|
Packit |
b8b331 |
"",
|
|
Packit |
b8b331 |
# endif
|
|
Packit |
b8b331 |
LOCK_ABI_VERSION);
|
|
Packit |
b8b331 |
p = (unsigned char *)&mt;;
|
|
Packit |
b8b331 |
for (i=0; i < sizeof mtx; i++)
|
|
Packit |
b8b331 |
{
|
|
Packit |
b8b331 |
if (i && !(i % 8))
|
|
Packit |
b8b331 |
printf (" \\\n%*s", 36, "");
|
|
Packit |
b8b331 |
printf ("%u", p[i]);
|
|
Packit |
b8b331 |
if (i < sizeof mtx - 1)
|
|
Packit |
b8b331 |
putchar (',');
|
|
Packit |
b8b331 |
}
|
|
Packit |
b8b331 |
fputs ("}}}\n", stdout);
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
#else /*!USE_POSIX_THREADS*/
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
printf ("/* Dummy object - no locking available. */\n"
|
|
Packit |
b8b331 |
"typedef struct\n"
|
|
Packit |
b8b331 |
"{\n"
|
|
Packit |
b8b331 |
" long _vers;\n"
|
|
Packit |
b8b331 |
"} gpgrt_lock_t;\n"
|
|
Packit |
b8b331 |
"\n"
|
|
Packit |
b8b331 |
"#define GPGRT_LOCK_INITIALIZER {%d}\n",
|
|
Packit |
b8b331 |
LOCK_ABI_VERSION);
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
#endif /*!USE_POSIX_THREADS*/
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
fputs ("##\n"
|
|
Packit |
b8b331 |
"## Loc" "al Variables:\n"
|
|
Packit |
b8b331 |
"## mode: c\n"
|
|
Packit |
b8b331 |
"## buffer-read-only: t\n"
|
|
Packit |
b8b331 |
"## End:\n"
|
|
Packit |
b8b331 |
"##\n", stdout);
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
if (ferror (stdout))
|
|
Packit |
b8b331 |
{
|
|
Packit |
b8b331 |
fprintf (stderr, PGM ": error writing to stdout: %s\n", strerror (errno));
|
|
Packit |
b8b331 |
return 1;
|
|
Packit |
b8b331 |
}
|
|
Packit |
b8b331 |
|
|
Packit |
b8b331 |
return 0;
|
|
Packit |
b8b331 |
}
|