|
Objectively
Object oriented framework for C.
|
#include "Config.h"#include <assert.h>#include <dlfcn.h>#include <pthread.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include "Class.h"#include "Object.h"Go to the source code of this file.
Data Structures | |
| struct | ClassImage |
A registered image: the handle the application holds, and the base address that the Classes it declares record in Class::image. More... | |
Functions | |
| ident | _alloc (Class *clazz) |
| Instantiate a type through the given Class. | |
| ident | _cast (const Class *clazz, const ident obj) |
| Perform a type-checking cast. | |
| Class * | _initialize (const ClassDef *def) |
| Initializes the given Class. | |
| void | addClassImage (ident handle, const ident address) |
| Registers an image that provides Classes, e.g. a plugin. | |
| Class * | classForName (const char *name) |
| static const ident | imageForAddress (const ident address) |
| ident | release (ident obj) |
Atomically decrement the given Object's reference count. If the resulting reference count is 0, the Object is deallocated. | |
| void | removeClassImage (ident handle) |
| Unregisters an image, and every Class it declared. | |
| ident | retain (ident obj) |
| Atomically increment the given Object's reference count. | |
| static void | setup (void) |
Called when initializing Object to setup Objectively. | |
| static void | teardown (void) |
Called atexit to teardown Objectively. | |
Variables | |
| static Class * | _classes |
| static pthread_mutex_t | _classesLock = PTHREAD_MUTEX_INITIALIZER |
Guards the structure of _classes. MUST NOT be held across dlsym, dlopen, or a Class initializer, each of which can reenter _initialize. | |
| static ClassImage * | _images |
The registered images providing Classes, most recently added first. Published atomically rather than under _classesLock, which cannot be held across the dlsym this list exists for. A plain list rather than a MutableArray, because Class is beneath the collections. | |
| size_t | _pageSize |
Instantiate a type through the given Class.
Definition at line 198 of file Class.c.
Perform a type-checking cast.
Definition at line 212 of file Class.c.
Initializes the given Class.
| clazz | The Class descriptor. |
Definition at line 151 of file Class.c.
Registers an image that provides Classes, e.g. a plugin.
| handle | A handle from dlopen. |
| address | Any address within that image, such as the entry point the application resolved from handle. |
classForName resolves a name it has not yet initialized through the process-wide namespace, which holds only images loaded RTLD_GLOBAL, and which Windows does not have at all. An application that loads Classes from a plugin registers it here instead, and may then load it RTLD_LOCAL - which is how it keeps two plugins exporting the same symbols from coalescing.
address is what identifies the image. Classes record the base address of the image that declared them, and the platforms report that for an address, not for a handle, so this takes one that the caller can vouch for. Aborts if no loaded image contains it. Definition at line 231 of file Class.c.
| Class * classForName | ( | const char * | name | ) |
Definition at line 300 of file Class.c.
address, or NULL. dladdr. UNCHANGED_REFCOUNT matters: without it this would pin the very module the caller is about to release. Definition at line 131 of file Class.c.
Atomically decrement the given Object's reference count. If the resulting reference count is 0, the Object is deallocated.
NULL. Definition at line 356 of file Class.c.
| void removeClassImage | ( | ident | handle | ) |
Unregisters an image, and every Class it declared.
| handle | The handle given to addClassImage. |
classForName answers from that cache ahead of any image. On a platform where closing an image really unmaps it - which dlclose does on Linux and FreeLibrary does on Windows - the next lookup would then read a ClassDef that is no longer mapped. classForName compares the name of every Class it walks, so one left behind breaks every lookup, not only its own. dlclose does not unmap on macOS, so an archetype that has already run keeps answering from its own static Class * for as long as the process lives, and would hand back whatever this freed. Unregistering is the only thing that is safe whether the image goes away or stays: the Class becomes unreachable by name, and remains valid for the archetype that owns it. The cost is the Class and its interface, which are not reclaimed. handle was not registered, rather than leaving the Classes it declared behind, which is the failure this exists to prevent. Two calls for the same handle abort on the second, whichever order they arrive in. Definition at line 255 of file Class.c.
Atomically increment the given Object's reference count.
retain with calls to release. Definition at line 372 of file Class.c.
|
static |
|
static |
Called atexit to teardown Objectively.
Definition at line 76 of file Class.c.
|
static |
|
static |
The registered images providing Classes, most recently added first. Published atomically rather than under _classesLock, which cannot be held across the dlsym this list exists for. A plain list rather than a MutableArray, because Class is beneath the collections.