1. Run time driver support library

This package contains core types and routines to facilitate construction of drivers for felix shared libraries. A felix driver is the top level interface between the embedding application and the felix generated shared libraries.

The code we give is platform independent, except as noted.

The code all lives in directory rtl, the run time library support directory. The symbols are defined in namespace flx::rtl, except as noted.

Start python section to spkgs/flx.py[1 /1 ]
     1: #line 18 "./lpsrc/flx_rtl.pak"
     2: pkg_requires = ['flx_compiler','flx_drivers','flx_rtl','flx_gc','flx_pthread','demux','faio','flx_stdlib']
End python section to spkgs/flx.py[1]
Start python section to spkgs/flx_async.py[1 /1 ]
     1: #line 22 "./lpsrc/flx_rtl.pak"
     2: cpp_cpps = ['rtl/flx_async']
     3: provides_lib = "libflx_async"
     4: pkg_requires = ['faio','demux','flx_pthread','flx_rtl','flx_gc']
     5: lib_requires = ['libfaio','libdemux','libflx_pthread','libflx','libflx_gc']
     6: iscr_source = ['lpsrc/flx_rtl.pak']
     7: build_macro = "ASYNC"
End python section to spkgs/flx_async.py[1]
Start python section to spkgs/flx_rtl.py[1 /1 ]
     1: #line 31 "./lpsrc/flx_rtl.pak"
     2: RTL_CPPS = [
     3:   "rtl/flx_rtl",
     4:   "rtl/flx_dynlink",
     5:   "rtl/flx_sync",
     6:   "rtl/flx_eh",
     7:   "rtl/flx_i18n",
     8:   "rtl/flx_ioutil",
     9:   "rtl/flx_strutil",
    10:   "rtl/flx_executil",
    11:   "rtl/flx_main",
    12: ]
    13: 
    14: cpp_cpps = RTL_CPPS
    15: provides_lib = "libflx"
    16: lib_requires = ['libflx_gc']
    17: pkg_requires = ['flx_gc']
    18: iscr_source = ['lpsrc/flx_rtl.pak']
    19: build_macro = "RTL"
    20: weaver_directory = 'doc/rtl/flx_rtl/'
End python section to spkgs/flx_rtl.py[1]
Start python section to spkgs/flx_drivers.py[1 /1 ]
     1: #line 53 "./lpsrc/flx_rtl.pak"
     2: DRIVERS = [
     3:   ('static','rtl/flx_run','',[]),
     4:   ('dynamic','rtl/flx_run','bin/flx_run',[]),
     5:   ('static','test/drivers/flx_perf_drv1','',[]),
     6:   ('dynamic','test/drivers/flx_perf_drv1','test/drivers/flx_perf_drv1',[]),
     7:   ('static','test/drivers/mickey_mouse','',[]),
     8:   ('dynamic','test/drivers/mickey_mouse','bin/mickey_mouse',[]),
     9: ]
    10: 
    11: DRLIBS = [
    12:   'libflx_pthread',
    13:   'libflx',
    14:   'libflx_gc',
    15:   ]
    16: 
    17: drivers = DRIVERS
    18: drivers_require_libs = DRLIBS
    19: pkg_requires = ['flx_rtl','flx_pthread','flx_gc']
    20: lib_requires = ['libdemux','libflx_pthread','libflx']
    21: iscr_source = ['lpsrc/flx_rtl.pak']
End python section to spkgs/flx_drivers.py[1]
Start python section to spkgs/flx_async_drivers.py[1 /1 ]
     1: #line 76 "./lpsrc/flx_rtl.pak"
     2: DRIVERS = [
     3:   ('static','rtl/flx_arun','',[]),
     4:   ('dynamic','rtl/flx_arun','bin/flx_arun',[]),
     5: ]
     6: 
     7: DRLIBS = [
     8:   'libflx_async',
     9:   'libfaio',
    10:   'libdemux',
    11:   'libflx_pthread',
    12:   'libflx',
    13:   'libflx_gc',
    14:   ]
    15: 
    16: drivers = DRIVERS
    17: drivers_require_libs = DRLIBS
    18: pkg_requires = ['flx_gc','flx_rtl','flx_pthread','flx_async','demux','faio']
    19: iscr_source = ['lpsrc/flx_rtl.pak']
End python section to spkgs/flx_async_drivers.py[1]
Start data section to config/flx.fpc[1 /1 ]
     1: Name: flx
     2: Description: Felix core runtime support
     3: Version: $Id: flx_rtl.pak 1356 2007-04-10 18:25:53Z skaller $
     4: provides_dlib: -lflx_dynamic
     5: provides_slib: -lflx_static
     6: Requires: flx_gc
End data section to config/flx.fpc[1]
Start data section to config/flx_arun.fpc[1 /1 ]
     1: Name: flx_arun
     2: Description: Felix standard driver, async support
     3: Version: $Id: flx_rtl.pak 1356 2007-04-10 18:25:53Z skaller $
     4: Requires: flx_async faio demux flx_pthread flx flx_gc
End data section to config/flx_arun.fpc[1]
Start data section to config/flx_run.fpc[1 /1 ]
     1: Name: flx_run
     2: Description: Felix standard driver, no async support
     3: Version: $Id: flx_rtl.pak 1356 2007-04-10 18:25:53Z skaller $
     4: Requires: flx_pthread flx flx_gc
End data section to config/flx_run.fpc[1]
Start data section to config/flx_async.fpc[1 /1 ]
     1: Name: flx_async
     2: Description: Async hook
     3: Version: $Id: flx_rtl.pak 1356 2007-04-10 18:25:53Z skaller $
     4: provides_dlib: -lflx_async_dynamic
     5: provides_slib: -lflx_async_static
     6: Requires: faio demux flx_pthread flx flx_gc
End data section to config/flx_async.fpc[1]
Start cpp section to rtl/flx_meta.hpp[1 /1 ]
     1: #line 138 "./lpsrc/flx_rtl.pak"
     2: #ifndef __FLX_META_H__
     3: #define __FLX_META_H__
     4: // taken from BOOST
     5: #line 146 "./lpsrc/flx_rtl.pak"
     6: #define FLX_HAVE_INCLASS_MEMBER_INITIALIZATION 1
     7: #line 146 "./lpsrc/flx_rtl.pak"
     8: #if FLX_HAVE_INCLASS_MEMBER_INITIALIZATION
     9: #  define FLX_STATIC_CONSTANT(type, assignment) static const type assignment
    10: #else
    11: #  define FLX_STATIC_CONSTANT(type, assignment) enum { assignment }
    12: #endif
    13: 
    14: #include <cstddef>
    15: 
    16: template <std::size_t> struct type_with_alignment;
    17: #line 159 "./lpsrc/flx_rtl.pak"
    18: template <> struct type_with_alignment<8>{ typedef long double type; };
    19: #line 159 "./lpsrc/flx_rtl.pak"
    20: template <> struct type_with_alignment<1>{ typedef char type; };
    21: #line 159 "./lpsrc/flx_rtl.pak"
    22: template <> struct type_with_alignment<2>{ typedef short type; };
    23: #line 159 "./lpsrc/flx_rtl.pak"
    24: template <> struct type_with_alignment<4>{ typedef void* type; };
    25: #line 159 "./lpsrc/flx_rtl.pak"
    26: template <typename T> struct alignment_of;
    27: 
    28: template <typename T>
    29: struct alignment_of_hack
    30: {
    31:   char c;
    32:   T t;
    33:   alignment_of_hack();
    34: };
    35: 
    36: template <unsigned A, unsigned S>
    37: struct alignment_logic
    38: {
    39:   FLX_STATIC_CONSTANT(std::size_t, value = A < S ? A : S);
    40: };
    41: 
    42: template< typename T >
    43: struct alignment_of
    44: {
    45:   FLX_STATIC_CONSTANT(std::size_t, value =
    46:     (alignment_logic<
    47:       sizeof(alignment_of_hack<T>) - sizeof(T),
    48:       sizeof(T)
    49:     >::value));
    50: };
    51: 
    52: template<std::size_t L, std::size_t A>
    53: struct aligned_storage
    54: {
    55:   union type
    56:   {
    57:     unsigned char data_[ L ];
    58:     typename type_with_alignment<A>::type align_;
    59:   };
    60: };
    61: 
    62: template<typename T>
    63: struct store_of
    64: {
    65:   typedef typename aligned_storage<sizeof(T), alignment_of<T>::value>::type type;
    66: };
    67: 
    68: // convert an rvalue to an lvalue
    69: template<typename T>
    70: T const &lvalue(T const &x)
    71: {
    72:   return x;
    73: }
    74: 
    75: // this reinterpret cast works with rvalues too
    76: template<typename T, typename U>
    77: T &reinterpret(U const &x) {
    78:   return reinterpret_cast<T&>(const_cast<U&>(x));
    79: }
    80: #endif
End cpp section to rtl/flx_meta.hpp[1]
Start cpp section to rtl/flx_host_config.hpp[1 /1 ]
     1: #line 217 "./lpsrc/flx_rtl.pak"
     2: #ifndef __FLX_HOST_CONFIG_H__
     3: #define __FLX_HOST_CONFIG_H__
     4: 
     5: #line 225 "./lpsrc/flx_rtl.pak"
     6: #define FLX_WIN32 0
     7: #line 230 "./lpsrc/flx_rtl.pak"
     8: #define FLX_HAVE_BOOL 1
     9: #line 235 "./lpsrc/flx_rtl.pak"
    10: #define FLX_HAVE_LONGLONG 1
    11: #line 240 "./lpsrc/flx_rtl.pak"
    12: #define FLX_HAVE_LONGDOUBLE 1
    13: #line 240 "./lpsrc/flx_rtl.pak"
    14: #if !defined(FLX_STATIC_LINK) && FLX_WIN32
    15: #define FLX_EXPORT __declspec(dllexport)
    16: #define FLX_IMPORT __declspec(dllimport)
    17: #else
    18: #define FLX_EXPORT
    19: #define FLX_IMPORT
    20: #endif
    21: 
    22: 
    23: #line 255 "./lpsrc/flx_rtl.pak"
    24: #define FLX_RAWADDRESS unsigned
    25: #define FLX_MAX_ALIGN 8
    26: 
    27: #if FLX_WIN32
    28: #define _WIN32_WINNT 0x500 // Require Windows NT5 (2K, XP, 2K3)
    29: #endif
    30: 
    31: 
    32: #endif
    33: 
End cpp section to rtl/flx_host_config.hpp[1]
Start cpp section to rtl/flx_rtl_config.hpp[1 /1 ]
     1: #line 266 "./lpsrc/flx_rtl.pak"
     2: #ifndef __FLX_RTL_CONFIG_H__
     3: #define __FLX_RTL_CONFIG_H__
     4: 
     5: #line 274 "./lpsrc/flx_rtl.pak"
     6: #define FLX_HAVE_VSNPRINTF 1
     7: #line 279 "./lpsrc/flx_rtl.pak"
     8: #define FLX_HAVE_BOOL 1
     9: #line 284 "./lpsrc/flx_rtl.pak"
    10: #define FLX_HAVE_LONGLONG 1
    11: #line 289 "./lpsrc/flx_rtl.pak"
    12: #define FLX_HAVE_LONGDOUBLE 1
    13: #line 294 "./lpsrc/flx_rtl.pak"
    14: #define FLX_HAVE_ISNAN_IN_IEEEFP 0
    15: #line 299 "./lpsrc/flx_rtl.pak"
    16: #define FLX_HAVE_GNU 1
    17: #line 304 "./lpsrc/flx_rtl.pak"
    18: #define FLX_HAVE_GNU_X86 0
    19: #line 309 "./lpsrc/flx_rtl.pak"
    20: #define FLX_HAVE_GNU_X86_64 0
    21: #line 317 "./lpsrc/flx_rtl.pak"
    22: #define FLX_UNLIKELY(x) __builtin_expect(long(x),0)
    23: #line 317 "./lpsrc/flx_rtl.pak"
    24: #define FLX_LIKELY(x) !__builtin_expect(!long(x),0)
    25: #line 322 "./lpsrc/flx_rtl.pak"
    26: #define FLX_HAVE_CGOTO 1
    27: #line 327 "./lpsrc/flx_rtl.pak"
    28: #define FLX_USE_REGPARM3 0
    29: #line 332 "./lpsrc/flx_rtl.pak"
    30: #define FLX_HAVE_ASM_LABELS 1
    31: #line 337 "./lpsrc/flx_rtl.pak"
    32: #define FLX_HAVE_DLOPEN 1
    33: #line 342 "./lpsrc/flx_rtl.pak"
    34: #define FLX_WIN32 0
    35: #line 347 "./lpsrc/flx_rtl.pak"
    36: #define FLX_MACOSX 0
    37: #line 352 "./lpsrc/flx_rtl.pak"
    38: #define FLX_LINUX 1
    39: #line 357 "./lpsrc/flx_rtl.pak"
    40: #define FLX_WIN32 0
    41: #line 362 "./lpsrc/flx_rtl.pak"
    42: #define FLX_WIN64 0
    43: #line 367 "./lpsrc/flx_rtl.pak"
    44: #define FLX_CYGWIN 0
    45: #line 372 "./lpsrc/flx_rtl.pak"
    46: #define FLX_POSIX 1
    47: #line 377 "./lpsrc/flx_rtl.pak"
    48: #define FLX_SOLARIS 0
    49: #line 382 "./lpsrc/flx_rtl.pak"
    50: #define FLX_HAVE_MSVC 0
    51: #line 387 "./lpsrc/flx_rtl.pak"
    52: #define FLX_HAVE_KQUEUE_DEMUXER 0
    53: #line 392 "./lpsrc/flx_rtl.pak"
    54: #define FLX_HAVE_POLL 1
    55: #line 397 "./lpsrc/flx_rtl.pak"
    56: #define FLX_HAVE_EPOLL 1
    57: #line 402 "./lpsrc/flx_rtl.pak"
    58: #define FLX_HAVE_EVTPORTS 0
    59: #line 402 "./lpsrc/flx_rtl.pak"
    60: //
    61: #if FLX_HAVE_CGOTO && FLX_HAVE_ASM_LABELS
    62: #define FLX_CGOTO 1
    63: #else
    64: #define FLX_CGOTO 0
    65: #endif
    66: 
    67: #if FLX_WIN32
    68: #define _WIN32_WINNT 0x0600 // Require Windows NT5 (2K, XP, 2K3)
    69: #define WINVER 0x0600 // Require Windows NT5 (2K, XP, 2K3)
    70: // vs windows.h just LOVES to include winsock version 1 headers by default.
    71: // that's bad for everyone, so quit it.
    72: #define _WINSOCKAPI_
    73: #endif
    74: 
    75: 
    76: #if !defined(FLX_STATIC_LINK) && FLX_WIN32
    77: #define FLX_EXPORT __declspec(dllexport)
    78: #define FLX_IMPORT __declspec(dllimport)
    79: #else
    80: #define FLX_EXPORT
    81: #define FLX_IMPORT
    82: #endif
    83: 
    84: 
    85: #ifdef BUILD_RTL
    86: #define RTL_EXTERN FLX_EXPORT
    87: #else
    88: #define RTL_EXTERN FLX_IMPORT
    89: #endif
    90: 
    91: #if FLX_MACOSX && !FLX_HAVE_DLOPEN
    92: #define FLX_MACOSX_NODLCOMPAT 1
    93: #else
    94: #define FLX_MACOSX_NODLCOMPAT 0
    95: #endif
    96: 
    97: #if FLX_HAVE_GNU
    98: #define FLX_ALWAYS_INLINE __attribute__ ((always_inline))
    99: #define FLX_NOINLINE __attribute__ ((noinline))
   100: #define FLX_CONST __attribute__ ((const))
   101: #define FLX_PURE __attribute__ ((pure))
   102: #define FLX_GXX_PARSER_HACK (void)0,
   103: #define FLX_UNUSED __attribute__((unused))
   104: #else
   105: #define FLX_ALWAYS_INLINE
   106: #define FLX_NOINLINE
   107: #define FLX_CONST
   108: #define FLX_PURE
   109: #define FLX_GXX_PARSER_HACK
   110: #define FLX_UNUSED
   111: #endif
   112: 
   113: #line 461 "./lpsrc/flx_rtl.pak"
   114: #define FLX_RAWADDRESS unsigned
   115: #define FLX_MAX_ALIGN 8
   116: #endif
End cpp section to rtl/flx_rtl_config.hpp[1]


1.1. Procedure Continuation Abstraction
1.2. Unix Dynamic linker
1.3. Universal Program Driver