Repository navigation
AIB Stability & Library Evolution
This project aims to produce ABI compliant Frameworks and Services that can function as fully drop in replacements under Mac OS X Server 1.2v3 and Rhapsody OS.
This is done through #if defined(…) statements throughout the source code.
This project defines several of these
-DDistributionRhapsodyOS-DDistributionRhapsodiOS-
-DDistributionOpenNext(eqiv to DDistributionRhapsodiOS)
When new features are added to our Frameworks, they have to be done in such a way that are ABI compatible. New classes and methods are not considered ABI breaking changes to a framework, but changing ivar (adding, removing or reordering) are ABI breaking.
On RhapsodyOS, ivars are never removed or reordered; however, new ivars are implemented using a global variable NSMapTable. When an object is deinited, it must clean up its entry in that map.
When building for RhapsodiOS or OpenNext, classes get an ivar whose type is a pointer void *_evolution_ProductName_className_ to a private brother class which ultimately stores the variables. We may switch to using a structure in the future, but for now it will be a class. The public class must be sure to release the brother class when it is released.
Source code will use #if defined(DistributionRhapsodyOS) and #if defined(DistributionRhapsodiOS) || defined(DistributionOpenNext) to decide how this is implemented.
If a feature requires an ABI breaking change, we only implement it for RhapsodiOS and OpenNext.