Other APIs are provided with the ChorusOS operating system. Depending on their nature, they may be available to both basic and extended environments or restricted to a single environment. The following subsections give a description of the libraries implementing these APIs.
Routines implementing the MRTP (Micro Real-time Profile) API are included within the libcx and libebd libraries. They are available to both basic and extended actors.
Routines implementing the Mathematical API are packaged in an independent library kernel/lib/libm/libm.a. This library is available to both basic and extended actors.
Routines implementing the Sun RPC API are packaged in an independent library os/lib/classix/librpc.a which is not thread-safe. This API is restricted to extended actors.
The C++ library os/lib/CC/libC.a provides support for C++ applications with a complete and thread-safe library package. Every service offered by libC.a ensures that shared data is only accessed after signaling the relevant synchronization objects.
To allow atomic manipulation of any stream class (iostream or fstream for example), the API of libC.a has been extended with the following two services:
The ios::lock()service is used to lock any stream class object. The ios::unlock() service is used to unlock any stream class object. All services called upon a given stream object StrObj which are preceded by StrObj.lock() and followed by StrObj.unlock() are executed in an atomic way. It is guaranteed that no other thread can access StrObj as long as the lock is on.
An I/O stream object can be locked in two ways. For example, if cout is an I/O stream object:
cout.lock(); cout << "atomic " << "output"; ... (any other operation on cout) cout.unlock();In this case the member function ios::lock() is called.
The following syntax could also be used:
cout << lock << "atomic " << "output" << unlock;
Embedded C++ actors can be linked with os/lib/CC/libC.a if they do not make use of the iostream and fstream packages.