Agnostic subscribers and requests
Introduce virtual method tables (VMT) to subscribers and publishers, so according objects can be used the same way, regardless of their real-time class (RT class).
A pointer to the appropriate VMT should be set in the ...Init() methods and macros should be provided for generalized access to these functions.
urt_status_t status;
...
// old API calls (still available)
status = urtNrtRequestAcquire(nrtrequest);
status = urtSrtRequestAcquire(srtrequest);
status = urtFrtRequestAcquire(frtrequest);
status = urtHrtRequestAcquire(hrtrequest);
// VMT-based API
#define urtRequestAcquire(r) (r)->vmt->acquire((void*)(r))
status = urtRequestAcquire(nrtrequest);
status = urtRequestAcquire(srtrequest);
status = urtRequestAcquire(frtrequest);
status = urtRequestAcquire(hrtrequest);
Note that the VMT-based API is the same for all four cases whilst the old API is specific for each RT class.
The VMT pointer can also be used to determine the RT class of an object, as there should be only one static VMT for each RT class and all instances point to that data.
Furthermore, new general 'classes' can be provided for subscribers and requests:
graph TD;
urt_nrtrequest --> urt_baserequest;
urt_srtrequest --> urt_baserequest;
urt_frtrequest --> urt_baserequest;
urt_hrtrequest --> urt_baserequest;
urt_request --> urt_nrtrequest;
urt_request --> urt_srtrequest;
urt_request --> urt_frtrequest;
urt_request --> urt_hrtrequest;
This new urt_request
structure could just be a union
type, providing enough memory for either specific request type.
A similar urt_subscriber
structure can be provided for publish-subscribe as well.