Contents

  1. Motivation for Splitting ACE into Multiple Libraries
  2. Configuration Management
  3. Classes in Each ACE Library Subset
  4. Current ACE Subsetting Status
  5. ACE Library Size Breakdown
  6. Building ACE Subsets
  7. ACE_OS Adaptation Layer
  8. Minimum TAO


Motivation for Splitting ACE into Multiple Libraries

This document describes how we are splitting ACE into multiple libraries, each of which will contain a smaller subset of the overall ACE functionality. The primary motivations for subsetting ACE are: The main design goals of our approach are as follows:

  1. Support the original libACE as before. Thus, for users who want to use the existing ACE library as is, there will be no changes, i.e., just link with libACE as usual.

  2. Allow ACE (and TAO) programmers to use smaller subsets of the entire libACE library. These subsets will include the following libraries:

    o libACE_OS -- This library contains the OS adaptation layer and its supporting classes. All other ACE libraries will depend on libACE_OS and it will depend on no other ACE libraries.

    o libACE_Utils -- This library contains the various ACE container classes and other miscellaneous classes, such as Singleton, auto_ptr, timers, etc. This library will depend only on libACE_OS.

    o libACE_Logging -- This library contains the various ACE logging and tracing classes. This library will depend only on libACE_OS.

    o libACE_Threads -- This library contains the ACE thread/process management and synchronization classes. This library will depend only on libACE_OS.

    o libACE_Demux -- This library contains the ACE Reactor and Proactor classes. This library will depend on libACE_OS and libACE_Thread.

    o libACE_Connection -- This library contains the ACE Connection components, i.e., Acceptor, Connector, and Svc_Handler. This library will depend on libACE_OS, libACE_Thread, and libACE_Demux.

    o libACE_Sockets -- This library contains the ACE C++ wrappers for sockets. This library will depend on libACE_OS.

    o libACE_IPC -- This library contains all the ACE C++ wrappers for the other types of IPC and FILE I/O other than sockets. This library will depend on libACE_OS and libACE_Sockets.

    o libACE_Svcconf -- This library contains the ACE C++ wrappers for the Service Configurator. This library will depend on libACE_OS, libACE_Demux, libACE_Thread, and libACE_Sockets.

    o libACE_Streams -- This library contains the ACE Streams classes. This library will depend on libACE_OS, libACE_Demux, and libACE_Thread.

    o libACE_Memory -- This library contains the ACE C++ wrappers for shared memory and memory-mapped files. This library will depend on libACE_OS.

In addition, we will create libACE_TAO, which contains just the core set of components in ACE that are required to support TAO. This library is targeted at embedded systems developers who want to minimize the footprint of ACE+TAO. We are also planning to support the OMG's Minimum CORBA specification as part of a separate effort. Preliminary results of prototypes for Minimum CORBA we've integrate to TAO have been very promising, yielding a 40% reduction in ORB footprint.

Note that the ACE library subsets described above are intended as a guideline, not a complete specification. The actual partitioning of files in the final ACE library subsets may differ somewhat to improve footprint and simplify common use-cases.


Configuration Management

Configuration management for the ACE library subsets described above will be organized as follows:
  1. A single source tree with a single "version" for the source tree.

  2. Releases of libACE and its "subsets" will be atomic, i.e., all or nothing.


Classes in Each ACE Library Subset

Below, we describe the classes in each ACE library subset.

libACE_OS

This library contains the OS adaptation layer and its supporting classes. The classes in this library should not depend on any other ACE library subsets. All of the other libraries will depend on this library. The following classes are included in this library.

config.h
Basic_Types
OS
Sched_Params

libACE_Utils

This library contains the following ACE container classes and other miscellaneous classes.

ACE 
Active_Map_Manager 
Arg_Shifter 
ARGV 
Containers 
Dirent 
Dynamic 
Filecache 
Functor 
Get_Opt 
Hash_Map_Manager 
High_Res_Timer 
Method_Request 
Object_Manager 
Profile_Timer 
Registry 
SString 
Stats 
System_Time 
Time_Request_Reply 
Timeprobe 
Timer_Hash 
Timer_Heap 
Timer_List 
Timer_Queue 
Timer_Wheel
LOGGING_FILES = 
Dump 
Log_Msg 
Log_Record 
Trace

libACE_Logging

This library contains the various ACE logging and tracing classes.

Dump 
Log_Msg 
Log_Record 
Trace

libACE_Threads

This library contains the ACE thread/process management and synchronization classes.

Activation_Queue 
Process 
Process_Manager 
Synch 
Synch_Options 
Thread 
Thread_Manager 
Token

libACE_Demux

This library contains the ACE Reactor and its associated classes, including the ACE Connection components.

Event_Handler 
Handle_Set 
POSIX_Proactor 
Priority_Reactor 
Proactor 
Reactor 
Select_Reactor 
Select_Reactor_Base 
WFMO_Reactor

libACE_Connection

This library contains the ACE Connection components, i.e., Acceptor, Connector, and Svc_Handler.

Asynch_IO 
Asynch_IO_Impl 
POSIX_Asynch_IO 
Strategies

libACE_Sockets

This library contains the ACE C++ wrappers for sockets.

IPC_SAP 
LSOCK 
LSOCK_Acceptor 
LSOCK_CODgram 
LSOCK_Connector 
LSOCK_Dgram 
LSOCK_Stream 
SOCK 
SOCK_Acceptor 
SOCK_CODgram 
SOCK_Connector 
SOCK_Dgram 
SOCK_Dgram_Bcast 
SOCK_Dgram_Mcast 
SOCK_IO 
SOCK_Stream

libACE_IPC

This library contains all the ACE C++ wrappers for the other types of IPC and FILE I/O other than sockets. This library will depend on the libACE_Socket library.

Addr 
DEV 
DEV_Addr 
DEV_Connector 
DEV_IO 
FIFO 
FIFO_Recv 
FIFO_Recv_Msg 
FIFO_Send 
FIFO_Send_Msg 
FILE_Addr 
FILE 
FILE_Connector 
FILE_IO 
INET_Addr 
IO_SAP 
IOStream 
Pipe 
Signal 
SPIPE_Addr 
SPIPE 
SPIPE_Acceptor 
SPIPE_Connector 
SPIPE_Stream 
SV_Message 
SV_Message_Queue 
SV_Semaphore_Complex 
SV_Semaphore_Simple 
SV_Shared_Memory 
TLI 
TLI_Acceptor 
TLI_Connector 
TLI_Stream 
TTY_IO 
UNIX_Addr 
UPIPE_Acceptor 
UPIPE_Connector 
UPIPE_Stream

libACE_Svcconf

This library contains the ACE C++ wrappers for the Service Configurator component.

DLL 
Parse_Node 
Service_Config 
Service_Manager 
Service_Object 
Service_Repository 
Service_Types 
Shared_Object 
Svc_Conf_l 
Svc_Conf_y

libACE_Streams

This library contains the ACE Streams classes.

CDR_Stream 
Message_Block 
Message_Queue 
Task

libACE_Memory

This library contains the ACE C++ wrappers for shared memory and memory-mapped files.

Malloc 
Mem_Map 
Memory_Pool 
Obstack 
Read_Buffer 
Shared_Memory 
Shared_Memory_MM 
Shared_Memory_SV

libACE_Token

This componenty contains the ACE C++ wrappers for Token classes.

Local_Tokens 
Remote_Tokens 
Token_Collection 
Token_Invariants 
Token_Manager 
Token_Request_Reply

libACE_Other

This component contains miscellaneous ACE C++ wrappers.

CORBA_Handler 
CORBA_Ref 
Local_Name_Space 
Msg_WFMO_Reactor 
Name_Proxy 
Name_Request_Reply 
Name_Space 
Naming_Context 
Registry_Name_Space 
Remote_Name_Space 
TP_Reactor 
XtReactor

Current ACE Subsetting Status

The following are the remaining major subsetting issues:

Please let us know if you're able to contribute to this effort.


ACE Library Size Breakdown

Here is an example size breakdown, by ACE library component. It is for ACE 4.6.25, statically built with these make flags:

    debug=0 optimize=1 static_libs_only=1 DEFFLAGS=-DACE_USE_RCSID=0

To build an ACE static library, if shared libraries are the default, use make static_libs_only=1.

Platform Component Total For TAO
subset
OS Utils Logging Threads Demux Con-
nection
Sockets IPC Svcconf Streams Memory Token Other
Linux (RedHat 5.2)
egcs 1.0.3
Size, bytes 527445 395541 10645 111542 13783 54239 33880 650 12565 32391 91919 16773 17154 69346 62558
Percentage of
total size
100 75 2 21 3 10 6 0 2 6 17 3 3 13 12
LynxOS 3.0.0
g++ 2.7-97r1
Size, bytes 547004 429944 17056 100712 11104 44548 45780 52888 11468 29184 84236 15664 17304 62312 54748
Percentage of
total size
100 78 3 18 2 8 8 10 2 5 15 3 3 11 10
SunOS5.7
egcs 1.1.1
Size, bytes 587059 446609 21651 116410 14005 58063 39620 770 13719 40362 101543 19611 20855 75806 64644
Percentage of
total size
100 76 4 20 2 10 7 0 2 7 17 3 4 13 11
SunOS 5.5.1
GreenHills 1.8.9
Size, bytes 677237 527133 15232 147857 18336 64732 49220 976 19084 56662 109686 19652 25696 78792 71312
Percentage of
total size
100 77 2 22 3 10 7 0 3 8 16 3 4 12 11
SunOS 5.7
Sun C++ 4.2
Size, bytes 512538 344815 13433 63314 15570 61947 58158 864 16609 71484 50155 17747 22279 70771 96952
Percentage of
total size
100 67 3 12 3 12 11 0 3 14 10 3 4 14 19
VxWorks 5.3.1
GreenHills 1.8.8
Size, bytes 669176 519284 26248 143632 16860 60468 49964 868 18660 42512 120384 21444 19252 79112 70780
Percentage of
total size
100 77 4 21 3 9 7 0 3 6 18 3 3 12 11
VxWorks 5.3.1
g++ cygnus-
2.7.2-960126
(with implicit templates)
Size, bytes 999608 742832 21232 164948 14752 66728 138008 9788 13116 108128 146528 39552 20052 108140 148636
Percentage of
total size
100 74 2 17 1 7 14 1 1 11 15 4 2 11 15


Building ACE Subsets

By default, the ACE library contains all of the components that ACE currently supports. To reduce build time and library size, you can exclude unused components. To do that, define an ACE_COMPONENTS variable using one of these approaches:

  1. In your $(ACE_ROOT)/include/makeinclude/platform_macros.GNU file, e.g., add:
    ACE_COMPONENTS = OS
    or

  2. On the make command line, e.g.,
    make ACE_COMPONENTS=OS
    or

  3. Set (and export) the ACE_COMPONENTS environment variable to contain the components that you want to build.

Please see ../ace/Makefile for the default contents of ACE_COMPONENTS.

A special value of ACE_COMPONENTS can be used to build an ACE library that supports TAO. The special value is FOR_TAO. So, for example, you can add this to your $(ACE_ROOT)/include/makeinclude/platform_macros.GNU to restrict ACE support to just that which is needed for TAO:


ACE_COMPONENTS = FOR_TAO

Please note the current limitations:

  1. We currently don't check for interdependencies between components. For example, if you build any component beside OS, you must explicitly include OS in your ACE_COMPONENTS.

  2. We currently don't check this macro in other ACE or TAO Makefiles, or in their tests. We'll add those checks as time allows.

ACE_OS Adaptation Layer

The lowest-level component, OS, is also called the ACE_OS adaption layer. It provides the ACE interface to the underlying operating system, but little else. It can be used standalone.

To create the ACE_OS adaptation layer, build your libACE with ACE_COMPONENTS set to OS. In addition, add #include "ace/config-minimal.h" to your ACE_wrappers/ace/config.h file.

When using the ACE_OS adaptation layer, you'll be limited to the the ACE_OS member functions, ACE's Basic_Types and Sched_Params, and macros defined in ace/OS.h. See ACE's Basic_Types_Test.cpp for an example of usage.


Back to the ACE home page.