summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorPaul Marquess <paul.marquess@btinternet.com>2001-10-29 23:11:58 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2001-10-30 14:54:12 +0000
commita129b8464589d5dad30757dd98425feafa1446f5 (patch)
tree2c620763b15301f6a1df0cf7b982e4b456bb0f7b /utils
parent62d2ec24858d98c7cac34211067c703869254a17 (diff)
downloadperl-a129b8464589d5dad30757dd98425feafa1446f5.tar.gz
RE: [PATCH h2xs] Use of static data in XS modules
Message-ID: <AIEAJICLCBDNAAOLLOKLMEJGDDAA.Paul_Marquess@Yahoo.co.uk> Add compat.h. p4raw-id: //depot/perl@12780
Diffstat (limited to 'utils')
-rw-r--r--utils/h2xs.PL134
1 files changed, 134 insertions, 0 deletions
diff --git a/utils/h2xs.PL b/utils/h2xs.PL
index 6d6169b824..b856d891ad 100644
--- a/utils/h2xs.PL
+++ b/utils/h2xs.PL
@@ -818,6 +818,139 @@ my %vdecl_hash;
my @vdecls;
if( ! $opt_X ){ # use XS, unless it was disabled
+ open(COMPAT, ">compat.h") || die "Can't create $ext$modpname/compat.h: $!\n";
+ warn "Writing $ext$modpname/compat.h\n";
+ print COMPAT <<EOM, <<'EOM';
+/* WARNING: This file has been autogenerated by h2xs $H2XS_VERSION */
+
+EOM
+
+
+#ifndef PERL_VERSION
+
+# include "patchlevel.h"
+# define PERL_REVISION 5
+# define PERL_VERSION PATCHLEVEL
+# define PERL_SUBVERSION SUBVERSION
+
+#endif /* PERL_VERSION */
+
+
+
+/*
+ * This file is taken from perl.h & modified slightly to make it backward
+ * comapable with older versions of Perl.
+ *
+ */
+
+#if PERL_REVISION == 5 && \
+ (PERL_VERSION < 7 || (PERL_VERSION == 7 && PERL_SUBVERSION < 2 ))
+
+/*
+ * Boilerplate macros for initializing and accessing interpreter-local
+ * data from C. All statics in extensions should be reworked to use
+ * this, if you want to make the extension thread-safe. See ext/re/re.xs
+ * for an example of the use of these macros.
+ *
+ * Code that uses these macros is responsible for the following:
+ * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
+ * 2. Declare a typedef named my_cxt_t that is a structure that contains
+ * all the data that needs to be interpreter-local.
+ * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
+ * 4. Use the MY_CXT_INIT macro such that it is called exactly once
+ * (typically put in the BOOT: section).
+ * 5. Use the members of the my_cxt_t structure everywhere as
+ * MY_CXT.member.
+ * 6. Use the dMY_CXT macro (a declaration) in all the functions that
+ * access MY_CXT.
+ */
+
+#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \
+ defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT)
+
+/* This must appear in all extensions that define a my_cxt_t structure,
+ * right after the definition (i.e. at file scope). The non-threads
+ * case below uses it to declare the data as static. */
+#define START_MY_CXT
+
+#if PERL_REVISION == 5 && \
+ (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION < 68 ))
+/* Fetches the SV that keeps the per-interpreter data. */
+#define dMY_CXT_SV \
+ SV *my_cxt_sv = perl_get_sv(MY_CXT_KEY, FALSE)
+#else /* >= perl5.004_68 */
+#define dMY_CXT_SV \
+ SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \
+ sizeof(MY_CXT_KEY)-1, TRUE)
+#endif /* < perl5.004_68 */
+
+/* This declaration should be used within all functions that use the
+ * interpreter-local data. */
+#define dMY_CXT \
+ dMY_CXT_SV; \
+ my_cxt_t *my_cxtp = (my_cxt_t*)SvUV(my_cxt_sv)
+
+/* Creates and zeroes the per-interpreter data.
+ * (We allocate my_cxtp in a Perl SV so that it will be released when
+ * the interpreter goes away.) */
+#define MY_CXT_INIT \
+ dMY_CXT_SV; \
+ /* newSV() allocates one more than needed */ \
+ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+ Zero(my_cxtp, 1, my_cxt_t); \
+ sv_setuv(my_cxt_sv, (UV)my_cxtp)
+
+/* This macro must be used to access members of the my_cxt_t structure.
+ * e.g. MYCXT.some_data */
+#define MY_CXT (*my_cxtp)
+
+/* Judicious use of these macros can reduce the number of times dMY_CXT
+ * is used. Use is similar to pTHX, aTHX etc. */
+#define pMY_CXT my_cxt_t *my_cxtp
+#define pMY_CXT_ pMY_CXT,
+#define _pMY_CXT ,pMY_CXT
+#define aMY_CXT my_cxtp
+#define aMY_CXT_ aMY_CXT,
+#define _aMY_CXT ,aMY_CXT
+
+#else /* single interpreter */
+
+#ifndef NOOP
+# define NOOP (void)0
+#endif
+
+#ifdef HASATTRIBUTE
+# define PERL_UNUSED_DECL __attribute__((unused))
+#else
+# define PERL_UNUSED_DECL
+#endif
+
+#ifndef dNOOP
+# define dNOOP extern int Perl___notused PERL_UNUSED_DECL
+#endif
+
+#define START_MY_CXT static my_cxt_t my_cxt;
+#define dMY_CXT_SV dNOOP
+#define dMY_CXT dNOOP
+#define MY_CXT_INIT NOOP
+#define MY_CXT my_cxt
+
+#define pMY_CXT void
+#define pMY_CXT_
+#define _pMY_CXT
+#define aMY_CXT
+#define aMY_CXT_
+#define _aMY_CXT
+
+#endif
+
+#endif /* perl < 5.7.2 */
+
+/* End of file compat.h */
+
+EOM
+ close COMPAT ;
+
open(XS, ">$modfname.xs") || die "Can't create $ext$modpname/$modfname.xs: $!\n";
if ($opt_x) {
require Config; # Run-time directive
@@ -1197,6 +1330,7 @@ print XS <<"END";
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
+#include "compat.h"
END
if( @path_h ){