Differences between revisions 6 and 12 (spanning 6 versions)
Revision 6 as of 2014-07-01 07:27:00
Size: 2269
Editor: HungTa
Comment:
Revision 12 as of 2014-07-22 14:00:44
Size: 3115
Editor: AndrewStone
Comment:
Deletions are marked like this. Additions are marked like this.
Line 13: Line 13:
=== Header === SAFplus services rely on other SAFplus services, but the application is not required to understand these dependencies. Instead, services will define what they rely upon in an enum names LibDep. During initialization a service will create a bitmap of all the services it uses in the form LibDep::LOG | LibDep::CKPT. This will automatically create the full bitmap of all required services because LibDep::CKPT (for example) is a bitmap of CKPT and all service CKPT requires.

==== Header ====
Line 15: Line 17:
=== APIs === ==== APIs ====
Line 25: Line 27:
  enum   enum class LibSet
Line 31: Line 33:
    OSAL=16,
    LOG=32
    OSAL=0x10,
    LOG=0x20,
    GRP=0x40
 
Line 35: Line 39:
  void safplusInitialize(uint16_t svc)   enum class LibDep
  {
    LOG = LibSet::LOG | LibSet::OSAL | LibSet::UTILS,
    OSAL = LibSet::OSAL | LibSet::LOG | LibSet::UTILS,
    UTILS = LibSet::UTILS | LibSet::OSAL,
    CKPT = LibSet::CKPT | LibSet::IOC | LibSet::UTILS | LibSet::GRP,
    GRP = LibSet::GRP | LibSet::CKPT | LibSet::IOC,
  };

  void safplusInitialize(LibDep svc)
Line 49: Line 62:
The idea is based on SAFplus 6. An app can be configured with options named svcs as 'log', 'utils', 'ioc'... or 'all' and pass it to an environment variable. Then, following its value, the preface.mk will define accordingly:
==== preface.mk ====
Somehow, an app can be configured with options so-called use_services as 'log', 'utils', 'ioc'... or 'all' and pass it to an environment variable. Then, following its values, the preface.mk will define services accordingly:
==== Makefile ====
include preface.mk

SAFplus initialization

SAFplus provides library initialization infrastructure: log, utils, osal, timer... They're the basic libraries that most applications should use. However, not all of them would be used. Furthermore, it's necessary to be able to explicitly link individual libraries for highly embedded users.

Implementation

SAFplus initialization can be implemented in 2 methods:

According to GNU weak attribute declaration, we can declare initialization functions as the weak linked functions. Therefore, their definitions can be omitted (in case they're not used), or replaced by different libraries (in case they're used). The linker will fill in NULL for undefined weak symbols.

SAFplus services rely on other SAFplus services, but the application is not required to understand these dependencies. Instead, services will define what they rely upon in an enum names LibDep. During initialization a service will create a bitmap of all the services it uses in the form LibDep::LOG | LibDep::CKPT. This will automatically create the full bitmap of all required services because LibDep::CKPT (for example) is a bitmap of CKPT and all service CKPT requires.

#include <clGlobals.hxx>

APIs

   1 namespace SAFplus
   2 {
   3   extern void utilsInitialize() __attribute__((weak));
   4   extern void logInitialize() __attribute__((weak));
   5   // TODO: other initialization functions declaration here
   6 
   7   enum class LibSet
   8   {
   9     RPC=1,
  10     CKPT=2,
  11     IOC=4,
  12     UTILS=8,
  13     OSAL=0x10,
  14     LOG=0x20,
  15     GRP=0x40
  16  
  17   };
  18 
  19   enum class LibDep
  20   {
  21     LOG = LibSet::LOG | LibSet::OSAL | LibSet::UTILS,
  22     OSAL = LibSet::OSAL | LibSet::LOG | LibSet::UTILS,
  23     UTILS = LibSet::UTILS | LibSet::OSAL,
  24     CKPT = LibSet::CKPT | LibSet::IOC | LibSet::UTILS | LibSet::GRP,
  25     GRP = LibSet::GRP | LibSet::CKPT | LibSet::IOC,
  26   }; 
  27 
  28   void safplusInitialize(LibDep svc)
  29   {
  30     if(svc&LOG)
  31       if(logInitialize) logInitialize();
  32     if(svc&UTILS)
  33       if(utilsInitialize) utilsInitialize();
  34     // TODO: other ones here
  35   }
  36     
  37 }

Method 2: configuring the app with options

Somehow, an app can be configured with options so-called use_services as 'log', 'utils', 'ioc'... or 'all' and pass it to an environment variable. Then, following its values, the preface.mk will define services accordingly:

Makefile

include preface.mk

   1 $DSVCS:=
   2 ifeq ($(SVCS),log)
   3        $DSVCS += -DLOG
   4 ifeq ($(SVCS),utils)
   5        $DSVCS += -DUTILS
   6 #...
   7 LINK_EXE    = g++ $DSVCS -g -O0 -fPIC $(LINK_FLAGS) -o

Header

#include <clGlobals.hxx>

APIs

   1 namespace SAFplus
   2 {
   3 
   4   enum
   5   {
   6     RPC=1,
   7     CKPT=2,
   8     IOC=4,
   9     UTILS=8,
  10     OSAL=16,
  11     LOG=32
  12   };
  13 
  14   void safplusInitialize(uint16_t svc)
  15   {
  16     if(svc&LOG)
  17 #ifdef LOG
  18       logInitialize();
  19 #endif
  20     if(svc&UTILS)
  21 #ifdef UTILS
  22       utilsInitialize();
  23 #endif
  24     // TODO: other ones here
  25   }
  26     
  27 }

SAFplus: SAFplus-initialization (last edited 2014-07-22 14:00:44 by AndrewStone)