-*- mode: outline; outline-regexp: " *\\[" -*- This document presents the status of the ACE port to Windows CE. We present hints on writing portable code using ACE on Windows CE and other Win32 platforms. Moreover, we outline current unresolved technical issues with the port and with Windows CE development tools. Finally, we describe the status of all the ACE regression tests on Windows CE. [Hints on writing portable code using ACE] [Testing Non-Window based ACE programs] Rumor has it that Microsoft will provide a DOS shell in their next release of CE. Oh well, I made it up and there'll probably no DOS prompt in the future CE. All current ACE programs are text-based. They all need a shell to start from. [Dialog Based] This is a collection of files that combined with any ACE program to run on CE. To use this template, compile your main project with all the cpp and rc files under $ACE_ROOT/windoezCE/. The program will start by asking you the command line argument that you want to pass to the original ACE program. We should be able to get this infomation automatically if we execute the program from "Start -> Run...". However, that'll require us to implement this window using Win32 API (it's written with MFC classes now.) Notice that GetCommandLine is not available on CE. [Future Improvement] Get the command line argument automatically. Buffered keyboard input (stdin.) Scrollable output. [Unicode Trivia] Since most APIs take wide char strings as their arguments when strings are needed, some pre-cautions must be taken... Here are some macros that help converting string types back and forth based on your platform settings. Here, under CE is equivalent to have ACE_HAS_MOSTLY_UNICODE_APIS defined. [ASYS_TCHAR] Defined as wchar_t under CE, but as char under all other paltforms. [ASYS_TEXT] A macro that converts a char text to a wchar text only under CE. [ASYS_WIDE_STRING] A macro that converts char strings to wchar strings using ACE_WString only when ACE_HAS_MOSTLY_UNICODE_APIS is defined. [ASYS_MULTIBYTE_STRING] A macro that converts wchar strings to char strings using ACE_WString while ACE_HAS_MOSTLY_UNICODE_APIS is not defined but UNICODE is defined. [ASYS_ONLY_MULTIBYTE_STRING] Like ASYS_MULTIBYTE_STRING but only convert a string when ACE_HAS_MOSTLY_UNICODE_APIS defined and UNICODE not defined. [ACE_TRACE] When using ACE_TRACE macros, you don't need to use wide char string in it. ACE converts the char string to wchar string for you. [Current difficulties] [Bugs in cross compiler for SH series CPU] [Inline functions] are not supported at least for debug build for DLL. I have to un-inline _all_ inline functions in ACE to get it to work. Not sure if inlining works for Release version or other CPUs (namely, MIPS series.) It appears to work fine for x86 emulator builds. [Lost string literals] The following format string in ACE_OS::ctime_r was misteriously replaced with garbage by SH compiler: ACE_OS::sprintf (buf, __TEXT ("%3s %3s %02d %02d:%02d:%02d %04d\n"),..... The solution for this is to define the format string in global namespace as: static const ASYS_TCHAR *fmtstr = __TEXT ("%3s %3s %02d %02d:%02d:%02d %04d\n"); And call the sprintf as: ACE_OS::sprintf (buf, fmtstr,....); There doesn't seem to be any recognizable pattern on how this will happen (otherwise, I'll call this a feature.) [HPC issues] The only testbed we have locally is an HP 360LX. Some tests that use sockets must have the ethernet card installed in order to run successfully. If you don't, the test will either hang or worse, render the serial connection unusable. Sometimes, some programs will screw up the whole system completely. Reset button is you best friend when this happens. [CE Toolkit issues] [CE Toolkit] Using CE toolkit for C++ is simply a pain in the ass. It takes around 30 seconds to start up a debug session and 5+ seconds to single step thru a statement. It only allows remote debugging using the serial link but not the network. (BTW, currently, CE only support NE2000 compatible PCMCIA ethernet card.) [SH3 compiler] * The SH3 compiler does not generate string literals when they are used inside a function and when a precompiled header is also used. This problem can be seen when a variable inside a function is defined by initializing it to a string literal. Two solutions are available: - Use a global variable, if you want to initialize it to a string literal, or - Do not use precompiled headers if you initialize a variable, defined inside a function, with a string literal. * The SH3 compiler generates a fatal internal error, when __declspec(dllimport) is used for a class with a virtual function in it. To avoid the internal error, change the imported class to not use any virtual functions. [Tidbits] [Web resources] http://www.sockets.com/ws_wince.htm [FILETIME] Win32's FILETIME format can be converted to struct timeval thru a simple conversion. However, the tricky part here is, FILETIME is the total 100ns elapse since _1601_ (why the heck did Microsoft choose this time?) whereas POSIX timeval gives you the accumulated time in us since 1970. This leads to data overflow in timeval struture which ACE uses internally for its ACE_Time_Value. This also confuses ACE_OS::ctime, which, under CE, is a home-brewed implementation, and corrupt the whole program image. I don't know of a way to deal with this yet except adjusting for the time difference between the two everytime a conversion is necessary. This, of course, doesn't seem to be a good choice. [Status of one-button tests] [Convention of project files settings] Procedures: * Create a new "Win32 Application" project file. It should support the following platforms: WCE x86em, WCE MIPS, and WCE SH3. Notice the project location should Be under $ACE_ROOT/tests/WinCE. * Add the cpp file(s) along with all .cpp and .rc files under $ACE_ROOT/WindozeCE. * Open Project settings. * General Settings are: "Using MFC in a Shared DLL" for all platforms. Both "Intermediate files" and "Output files" should be the same path. They should be one of "x86emDbg", "WMIPSDbg", and "WCESHDbg" depend on the target platform. * "C/C++" Settings: Add "ACE_HAS_DLL=1", "ACE_HAS_WINCE" to preprocessor definitions for all target platforms. Set "Code Generation" -> "Use run-time library" to "Debug Multithreaded". Add to "Preprocessor" -> "Additional include directories" the following: "..\,..\..\,..\..\WindozeCE\". * "Link" Settings: Added "aced.lib" into "Input" -> "Object/library modules". Set "Input" -> "Additional library path" according to the target platform. It should one of the following: "..\..\ace\WCE\x86em", "..\..\ace\WCE\MIPS", or, "..\..\ace\WCE\SH". * You are all done. [Legend:] X - test working properly F - compile but doesn't work correctly. C - compilation trouble . - work pending (deferred) N - Not supported by CE For each test, Section [EM] describes the status of the test on x86 emulator. Section [SH] describes the status of the test under SH series machines. (I use an HP 360LX as my testbed.) [MIPS] information is unavailable at the moment. [N] Aio_Platform_Test Asynch I/O is not supported on CE. [X] Atomic_Op_Test [EM] Runs successfully [SH] Runs successfully [X] Barrier_Test [EM] Runs successfully [SH] Runs successfully [X] Basic_Types_Test [EM] Runs successfully [SH] Runs successfully [X] Buffer_Stream_Test [EM] Runs successfully [SH] Runs successfully [F] Conn_Test [EM] Runs successfully [SH] Hangs at halfway. (Can't have two server threads running at the same time.) I managed the test to run to completion when setting n_server = 1 and n_client = 4. But I don't think that considered a successful run. [X] Enum_Interfaces_Test Sort of working right. [EM] Report get_ip_interface error [SH] Report get_ip_interface error [N] Env_Value_Test [X] Future_Test [EM] Runs successfully [SH] Runs successfully [X] Handle_Set_Test [EM] Runs successfully [SH] Runs successfully [X] Hash_Map_Manager_Test [EM] Runs successfully [SH] Runs successfully [N] IOStream_Test ??? [N] MM_Shared_Memory_Test ??? [X] MT_SOCK_Test This one takes some time.....zzzzz..... [EM] Runs successfully [SH] Runs if client threads reduced to 5. (And I reverted my change back, so it won't runs on our HP 360LX.) [X] Map_Manager_Test [EM] Runs successfully [SH] Runs successfully [F] Mem_Map_Test [EM] [SH] [X] Message_Block_Test inline functions in auto-generated ctors. [EM] Runs successfully [SH] Runs successfully [F] Message_Queue_Notifications_Test Hang at termination. [EM] Runs successfully [SH] There appears to be more compiler bugs that affect this test. The notify pipe used by the reactor was not set to non-blocking mode and thus the test hang at termination. I was not able to set any break points into places I wanted. CE sucks. [X] Message_Queue_Test [EM] Runs successfully [SH] Runs successfully [.] Naming_Test Registry is not added into CE yet. [F] Notify_Performance_Test [EM] Runs successfully [SH] ??? [X] OrdMultiSet_Test [EM] Runs successfully [SH] Runs successfully [N] Pipe_Test This test will have to rewriten in ACE. [X] Priority_Buffer_Test [EM] Runs successfully [SH] Runs successfully [N] Priority_Reactor_Test Not supported yet. [X] Priority_Task_Test [EM] Runs successfully [SH] Runs successfully [N] Process_Mutex_Test Don't know how to start a process as a console application. [N] Process_Strategy_Test Let's skip process related tests for now. [N] Reactor_Exceptions_Test Exceptions are not support on CE. [F] Reactor_Notify_Test Hang at "starting limited notifications test." [EM] Runs successfully [SH] ??? [F] Reactor_Performance_Test [EM] Runs successfully [SH] ??? [X] Reactor_Timer_Test [EM] Runs successfully [SH] Runs successfully [F] Reactors_Test Hang after done_count reaches 0. Reactors were not shutting down. [EM] ??? [SH] [X] Reader_Writer_Test [EM] Runs successfully [SH] Runs successfully [X] Recursive_Mutex_Test The test succeeded after reducing the iteration from 100 to 50. It appears that windows' CEdit buffer overflowed from the exccessive amount of output from this test. [EM] Runs successfully [SH] Runs successfully [X] SOCK_Connector_Test [EM] Runs successfully [SH] Runs successfully [X] SOCK_Test [EM] Runs successfully [SH] Runs successfully [N] SPIPE_Test SPIPE is not supported yet. [X] SString_Test [EM] Runs successfully [SH] Runs successfully [N] SV_Shared_Memory_Test [X] Semaphore_Test [EM] Runs successfully [SH] Runs successfully [.] Service_Config_Test I don't have confidence on this test.... [X] Sigset_Ops_Test [EM] Runs successfully [SH] Runs successfully [X] Simple_Message_Block_Test [EM] Runs successfully [SH] Runs successfully [X] TSS_Test TlsGetValue appearently acts differently from most Win32 platforms. If we check the return value and the error code, then, ACE_OS::key_getspecific will never succeed. [EM] Runs successfully [SH] Runs successfully [X] Task_Test [EM] Runs successfully [SH] Runs successfully [X] Thread_Manager_Test [EM] Runs successfully [SH] Runs successfully [X] Thread_Mutex_Test [EM] Runs successfully [SH] Runs successfully [X] Thread_Pool_Test [EM] Runs successfully [SH] Runs successfully [.] Time_Service_Test [X] Time_Value_Test [EM] Runs successfully [SH] Runs successfully [X] Timer_Queue_Test [EM] Runs successfully [SH] Runs successfully [.] Tokens_Test [N] UPIPE_SAP_Test [ACE File list] Here is a trace of ACE files about their status on CE. [Legend] (.) Defered. (x) Compiled successfully. (Doesn't mean it will run. ;-) (@) Not compile yet. (T) Template codes. (N) Not planning to support ( ) ??? [ACE] [CORBA] (.) CORBA_Handler.cpp (.) CORBA_Handler.h (.) CORBA_Handler.i (.) CORBA_Ref.cpp (.) CORBA_Ref.h (.) CORBA_Ref.i [Collections] (x) Array.cpp (x) Array.h (x) Array.i (T) Containers.cpp (T) Containers.i (T) Containers.h (T) Hash_Map_Manager.cpp (T) Hash_Map_Manager.h (T) Filecache.cpp (T) Filecache.h (T) Free_List.cpp (T) Free_List.i (T) Free_List.h (T) Managed_Object.cpp (T) Managed_Object.h (T) Managed_Object.i (T) Map_Manager.cpp (T) Map_Manager.h (T) Map_Manager.i (x) Object_Manager.cpp (x) Object_Manager.i (x) Object_Manager.h (x) SString.cpp (x) SString.h (x) SString.i [Concurrency] (x) Activation_Queue.h (x) Activation_Queue.cpp (x) Atomic_Op.i (.) Future.h (.) Future.cpp (x) Method_Object.h (x) Method_Object.cpp (x) Process.cpp (x) Process.h (x) Process.i (x) Process_Manager.cpp (x) Process_Manager.h (x) Process_Manager.i (x) Sched_Params.cpp (x) Sched_Params.h (x) Sched_Params.i (x) Synch.cpp (x) Synch.h (x) Synch.i (x) Synch_Options.cpp (x) Synch_Options.h (x) Synch_Options.i (T) Synch_T.cpp (T) Synch_T.h (T) Synch_T.i (x) Thread.cpp (x) Thread.h (x) Thread.i (x) Thread_Manager.cpp (x) Thread_Manager.h (x) Thread_Manager.i (x) Token.cpp (x) Token.h (x) Token.i [Config] (x) config.h (x) Basic_Types.cpp (x) Basic_Types.h (x) Basic_Types.i (x) Version.h [Connection] (T) Acceptor.cpp (T) Acceptor.h (T) Acceptor.i (.) Asynch_Acceptor.cpp (.) Asynch_Acceptor.h (.) Asynch_Acceptor.i (x) Asynch_IO.cpp (x) Asynch_IO.h (x) Asynch_IO.i (T) Connector.cpp (T) Connector.h (T) Connector.i (T) Dynamic_Service.cpp (T) Dynamic_Service.h (T) Dynamic_Service.i (x) Strategies.cpp (x) Strategies.h (x) Strategies.i (T) Strategies_T.cpp (T) Strategies_T.h (T) Strategies_T.i (T) Svc_Handler.cpp (T) Svc_Handler.h (T) Svc_Handler.i [IPC] [IO_SAP] (x) IO_SAP.cpp (x) IO_SAP.h (x) IO_SAP.i [DEV_SAP] (N) DEV.cpp (N) DEV.h (N) DEV.i (N) DEV_Connector.cpp (N) DEV_Connector.h (N) DEV_Connector.i (N) DEV_IO.cpp (N) DEV_IO.h (N) DEV_IO.i (N) TTY_IO.cpp (N) TTY_IO.h [FILE_SAP] (.) FILE.cpp (.) FILE.h (.) FILE.i (.) FILE_Connector.cpp (.) FILE_Connector.h (.) FILE_Connector.i (.) FILE_IO.cpp (.) FILE_IO.h (.) FILE_IO.i [IPC_SAP] (x) IPC_SAP.cpp (x) IPC_SAP.h (x) IPC_SAP.i [Addr] (x) Addr.cpp (x) Addr.h (x) Addr.i (N) DEV_Addr.cpp (N) DEV_Addr.h (N) DEV_Addr.i (.) FILE_Addr.cpp (.) FILE_Addr.h (.) FILE_Addr.i (x) INET_Addr.cpp (x) INET_Addr.h (x) INET_Addr.i (.) SPIPE_Addr.cpp (.) SPIPE_Addr.h (.) SPIPE_Addr.i (N) UNIX_Addr.cpp (N) UNIX_Addr.h (N) UNIX_Addr.i (.) UPIPE_Addr.h [FIFO_SAP] (.) FIFO.cpp (.) FIFO.h (.) FIFO.i (.) FIFO_Recv.cpp (.) FIFO_Recv.h (.) FIFO_Recv.i (.) FIFO_Recv_Msg.cpp (.) FIFO_Recv_Msg.h (.) FIFO_Recv_Msg.i (.) FIFO_Send.cpp (.) FIFO_Send.h (.) FIFO_Send.i (.) FIFO_Send_Msg.cpp (.) FIFO_Send_Msg.h (.) FIFO_Send_Msg.i [SOCK_SAP] ( ) LOCK_SOCK_Acceptor.cpp ( ) LOCK_SOCK_Acceptor.h ( ) LSOCK.cpp ( ) LSOCK.h ( ) LSOCK.i ( ) LSOCK_Acceptor.cpp ( ) LSOCK_Acceptor.h ( ) LSOCK_Acceptor.i ( ) LSOCK_CODgram.cpp ( ) LSOCK_CODgram.h ( ) LSOCK_CODgram.i ( ) LSOCK_Connector.cpp ( ) LSOCK_Connector.h ( ) LSOCK_Connector.i ( ) LSOCK_Dgram.cpp ( ) LSOCK_Dgram.h ( ) LSOCK_Dgram.i ( ) LSOCK_Stream.cpp ( ) LSOCK_Stream.h ( ) LSOCK_Stream.i (x) SOCK.cpp (x) SOCK.h (x) SOCK.i (x) SOCK_Acceptor.cpp (x) SOCK_Acceptor.h (x) SOCK_Acceptor.i (x) SOCK_CODgram.cpp (x) SOCK_CODgram.h (x) SOCK_CODgram.i (x) SOCK_Connector.cpp (x) SOCK_Connector.h (x) SOCK_Connector.i (x) SOCK_Dgram.cpp (x) SOCK_Dgram.h (x) SOCK_Dgram.i (x) SOCK_Dgram_Bcast.cpp (x) SOCK_Dgram_Bcast.h (x) SOCK_Dgram_Bcast.i (x) SOCK_Dgram_Mcast.cpp (x) SOCK_Dgram_Mcast.h (x) SOCK_Dgram_Mcast.i (x) SOCK_IO.cpp (x) SOCK_IO.h (x) SOCK_IO.i (x) SOCK_Stream.cpp (x) SOCK_Stream.h (x) SOCK_Stream.i [SPIPE_SAP] (.) SPIPE.cpp (.) SPIPE.h (.) SPIPE.i (.) SPIPE_Acceptor.cpp (.) SPIPE_Acceptor.h (.) SPIPE_Acceptor.i (.) SPIPE_Connector.cpp (.) SPIPE_Connector.h (.) SPIPE_Connector.i (.) SPIPE_Stream.cpp (.) SPIPE_Stream.h (.) SPIPE_Stream.i [TLI_SAP] (N) TLI.cpp (N) TLI.h (N) TLI.i (N) TLI_Acceptor.cpp (N) TLI_Acceptor.h (N) TLI_Acceptor.i (N) TLI_Connector.cpp (N) TLI_Connector.h (N) TLI_Connector.i (N) TLI_Stream.cpp (N) TLI_Stream.h (N) TLI_Stream.i [UPIPE_SAP] (N) UPIPE_Acceptor.cpp (N) UPIPE_Acceptor.h (N) UPIPE_Acceptor.i (N) UPIPE_Connector.cpp (N) UPIPE_Connector.h (N) UPIPE_Connector.i (N) UPIPE_Stream.cpp (N) UPIPE_Stream.h (N) UPIPE_Stream.i [Utils] (N) IOStream.cpp // CE doesn't have iostream stuff (N) IOStream.h (N) IOStream_T.cpp (N) IOStream_T.h (N) IOStream_T.i (x) Pipe.cpp (x) Pipe.h (x) Pipe.i (x) Signal.cpp (x) Signal.h (x) Signal.i [Logging and Tracing] (x) Dump.cpp (x) Dump.h (x) Dump_T.cpp (T) Dump_T.h (T) Log_Msg.cpp (x) Log_Msg.h (x) Log_Msg.i (x) Log_Priority.h (x) Log_Record.cpp (x) Log_Record.h (x) Log_Record.i (x) Trace.cpp (x) Trace.h (x) Trace.i [Memory] [Mem_Map] (x) Mem_Map.cpp (x) Mem_Map.h (x) Mem_Map.i [Shared_Malloc] (x) Malloc.cpp (x_) Malloc.h (x) Malloc.i (T) Malloc_T.cpp (T) Malloc_T.h (T) Malloc_T.i (x) Memory_Pool.cpp (x_) Memory_Pool.h (x) Memory_Pool.i [Shared_Memory] ( ) Shared_Memory.h ( ) Shared_Memory_MM.cpp ( ) Shared_Memory_MM.h ( ) Shared_Memory_MM.i ( ) Shared_Memory_SV.cpp ( ) Shared_Memory_SV.h ( ) Shared_Memory_SV.i [Utils] (x) Obstack.cpp (x) Obstack.h (@) Read_Buffer.cpp (@) Read_Buffer.h (@) Read_Buffer.i [Misc] (x) ARGV.cpp (x) ARGV.h (x) ARGV.i (T) Auto_Ptr.cpp (T) Auto_Ptr.h (T) Auto_Ptr.i (x) Dynamic.cpp (x) Dynamic.h (x) Dynamic.i (x) Get_Opt.cpp (x) Get_Opt.h (x) Get_Opt.i (.) Registry.cpp (.) Registry.h (T) Singleton.cpp (T) Singleton.h (T) Singleton.i (x) System_Time.cpp (x) System_Time.h [Name_Service] (.) Local_Name_Space.cpp (.) Local_Name_Space.h (.) Local_Name_Space_T.cpp (.) Local_Name_Space_T.h (.) Name_Options.cpp (.) Name_Options.h (.) Name_Proxy.cpp (.) Name_Proxy.h (.) Name_Request_Reply.cpp (.) Name_Request_Reply.h (.) Name_Space.cpp (.) Name_Space.h (.) Naming_Context.cpp (.) Naming_Context.h (.) Registry_Name_Space.cpp (.) Registry_Name_Space.h (.) Remote_Name_Space.cpp (.) Remote_Name_Space.h [OS Adapters] (x) ACE.cpp (x) ACE.h (x) ACE.i (x) OS.cpp (x) OS.h (x) OS.i [Reactor] (x) Event_Handler.cpp (x) Event_Handler.h (x) Event_Handler.i (T) Event_Handler_T.cpp (T) Event_Handler_T.h (T) Event_Handler_T.i (x) Handle_Set.cpp (x) Handle_Set.h (x) Handle_Set.i ( ) Priority_Reactor.cpp ( ) Priority_Reactor.i ( ) Priority_Reactor.h ( ) Proactor.h ( ) Proactor.i ( ) Proactor.cpp (x) Reactor.cpp (x) Reactor.h (x) Reactor.i (x) Reactor_Impl.h (x) Select_Reactor.cpp (x) Select_Reactor.h (x) Select_Reactor.i (@) WFMO_Reactor.cpp (@) WFMO_Reactor.h (@) WFMO_Reactor.i (x) XtReactor.cpp (x) XtReactor.h [Service_Configurator] (x) Parse_Node.cpp (x) Parse_Node.h (x) Parse_Node.i (x) Service_Config.cpp (x) Service_Config.h (x) Service_Config.i (x) Service_Manager.cpp (x) Service_Manager.h (x) Service_Manager.i (x) Service_Object.cpp (x) Service_Object.h (x) Service_Object.i (x) Service_Repository.cpp (x) Service_Repository.h (x) Service_Repository.i (x) Service_Types.cpp (x) Service_Types.i (x) Service_Types.h (x) Shared_Object.cpp (x) Shared_Object.h (x) Shared_Object.i (x) Svc_Conf.h (x) Svc_Conf_l.cpp (x) Svc_Conf_y.cpp [Streams] (x) IO_Cntl_Msg.cpp (x_) IO_Cntl_Msg.h (x) IO_Cntl_Msg.i (x) Message_Block.cpp (x) Message_Block.h (x) Message_Block.i (T) Message_Queue.cpp (T) Message_Queue.h (T) Message_Queue.i (T) Module.cpp (T) Module.h (T) Module.i (.) Multiplexor.cpp (.) Multiplexor.h (.) Multiplexor.i (T) Stream.cpp (T) Stream.h (T) Stream.i (T) Stream_Modules.cpp (T) Stream_Modules.h (T) Stream_Modules.i (x) Task.cpp (x) Task.h (x) Task.i (T) Task_T.cpp (T) Task_T.h (T) Task_T.i [System_V_IPC] [System_V_Message_Queues] ( ) SV_Message.cpp ( ) SV_Message.h ( ) SV_Message.i ( ) SV_Message_Queue.cpp ( ) SV_Message_Queue.h ( ) SV_Message_Queue.i ( ) Typed_SV_Message.cpp ( ) Typed_SV_Message.h ( ) Typed_SV_Message.i ( ) Typed_SV_Message_Queue.cpp ( ) Typed_SV_Message_Queue.h ( ) Typed_SV_Message_Queue.i [System_V_Semaphores] ( ) SV_Semaphore_Complex.cpp ( ) SV_Semaphore_Complex.h ( ) SV_Semaphore_Complex.i ( ) SV_Semaphore_Simple.cpp ( ) SV_Semaphore_Simple.h ( ) SV_Semaphore_Simple.i [System_V_Shared_Memory] ( ) SV_Shared_Memory.cpp ( ) SV_Shared_Memory.h ( ) SV_Shared_Memory.i [Timers] (x) High_Res_Timer.cpp (x) High_Res_Timer.h (x) High_Res_Timer.i (x) Profile_Timer.cpp (x) Profile_Timer.h (x) Profile_Timer.i (.) Time_Request_Reply.cpp (.) Time_Request_Reply.h (x) Time_Value.h (x) Timer_Hash.cpp (x) Timer_Hash.h (T) Timer_Hash_T.cpp (T) Timer_Hash_T.h (x) Timer_Heap.cpp (x) Timer_Heap.h (x) Timer_Heap.i (T) Timer_Heap_T.cpp (T) Timer_Heap_T.h (T) Timer_Heap_T.i (x) Timer_List.cpp (x) Timer_List.h (x) Timer_List.i (T) Timer_List_T.cpp (T) Timer_List_T.h (T) Timer_List_T.i (x) Timer_Queue.cpp (x) Timer_Queue.h (x) Timer_Queue.i (T) Timer_Queue_Adapters.cpp (T) Timer_Queue_Adapters.h (T) Timer_Queue_Adapters.i (T) Timer_Queue_T.cpp (T) Timer_Queue_T.h (T) Timer_Queue_T.i (x) Timer_Wheel.cpp (x) Timer_Wheel.h (x) Timer_Wheel.i (T) Timer_Wheel_T.cpp (T) Timer_Wheel_T.h (T) Timer_Wheel_T.i [Token_Service] (x) Local_Tokens.cpp (x) Local_Tokens.h (x) Local_Tokens.i (.) Remote_Tokens.cpp (.) Remote_Tokens.h (.) Remote_Tokens.i (.) Token_Collection.cpp (.) Token_Collection.h (.) Token_Collection.i (x) Token_Manager.cpp (x) Token_Manager.h (x) Token_Manager.i (.) Token_Request_Reply.cpp (.) Token_Request_Reply.h (.) Token_Request_Reply.i (.) Token_Invariants.h (.) Token_Invariants.i (.) Token_Invariants.cpp