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