mirror of
https://git.proxmox.com/git/mirror_corosync
synced 2025-08-14 15:02:39 +00:00
Event marshalling patch for 32/64/endian support.
git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@1131 fd59a12c-fef9-0310-b244-a6a79926bd2f
This commit is contained in:
parent
bca534f38c
commit
a0c8b0c9d9
262
exec/evt.c
262
exec/evt.c
@ -264,6 +264,76 @@ __attribute__ ((constructor)) static void evt_comp_register (void) {
|
||||
lcr_component_register (&evt_comp_ver0);
|
||||
}
|
||||
|
||||
/*
|
||||
* MESSAGE_REQ_EXEC_EVT_CHANCMD
|
||||
*
|
||||
* Used for various event related operations.
|
||||
*
|
||||
*/
|
||||
enum evt_chan_ops {
|
||||
EVT_OPEN_CHAN_OP, /* chc_chan */
|
||||
EVT_CLOSE_CHAN_OP, /* chc_close_unlink_chan */
|
||||
EVT_UNLINK_CHAN_OP, /* chc_close_unlink_chan */
|
||||
EVT_CLEAR_RET_OP, /* chc_event_id */
|
||||
EVT_SET_ID_OP, /* chc_set_id */
|
||||
EVT_CONF_DONE, /* no data used */
|
||||
EVT_OPEN_COUNT, /* chc_set_opens */
|
||||
EVT_OPEN_COUNT_DONE /* no data used */
|
||||
};
|
||||
|
||||
/*
|
||||
* Used during recovery to set the next issued event ID
|
||||
* based on the highest ID seen by any of the members
|
||||
*/
|
||||
struct evt_set_id {
|
||||
mar_uint32_t chc_nodeid __attribute__((aligned(8)));
|
||||
mar_uint64_t chc_last_id __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
/*
|
||||
* For set open count used during recovery to syncronize all nodes
|
||||
*
|
||||
* chc_chan_name: Channel name.
|
||||
* chc_open_count: number of local opens of this channel.
|
||||
*/
|
||||
struct evt_set_opens {
|
||||
mar_name_t chc_chan_name __attribute__((aligned(8)));
|
||||
mar_uint32_t chc_open_count __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
/*
|
||||
* Used to communicate channel to close or unlink.
|
||||
*/
|
||||
#define EVT_CHAN_ACTIVE 0
|
||||
struct evt_close_unlink_chan {
|
||||
mar_name_t chcu_name __attribute__((aligned(8)));
|
||||
mar_uint64_t chcu_unlink_id __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
struct open_chan_req {
|
||||
mar_name_t ocr_name __attribute__((aligned(8)));
|
||||
mar_uint64_t ocr_serial_no __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
/*
|
||||
* Sent via MESSAGE_REQ_EXEC_EVT_CHANCMD
|
||||
*
|
||||
* chc_head: Request head
|
||||
* chc_op: Channel operation (open, close, clear retentiontime)
|
||||
* u: union of operation options.
|
||||
*/
|
||||
struct req_evt_chan_command {
|
||||
mar_req_header_t chc_head __attribute__((aligned(8)));
|
||||
mar_uint32_t chc_op __attribute__((aligned(8)));
|
||||
union {
|
||||
struct open_chan_req chc_chan __attribute__((aligned(8)));
|
||||
mar_evteventid_t chc_event_id __attribute__((aligned(8)));
|
||||
struct evt_set_id chc_set_id __attribute__((aligned(8)));
|
||||
struct evt_set_opens chc_set_opens __attribute__((aligned(8)));
|
||||
struct evt_close_unlink_chan chcu __attribute__((aligned(8)));
|
||||
} u;
|
||||
};
|
||||
|
||||
/*
|
||||
* list of all retained events
|
||||
* struct event_data
|
||||
@ -344,9 +414,9 @@ enum recovery_phases {
|
||||
*/
|
||||
|
||||
#define BASE_ID_MASK 0xffffffffLL
|
||||
static SaEvtEventIdT base_id = 1;
|
||||
static SaEvtEventIdT base_id_top = 0;
|
||||
static SaClmNodeIdT my_node_id = 0;
|
||||
static mar_evteventid_t base_id = 1;
|
||||
static mar_evteventid_t base_id_top = 0;
|
||||
static mar_uint32_t my_node_id = 0;
|
||||
static int checked_in = 0;
|
||||
static int recovery_node = 0;
|
||||
static struct list_head *next_retained = 0;
|
||||
@ -377,10 +447,10 @@ static int processed_open_counts = 0;
|
||||
*/
|
||||
struct open_chan_pending {
|
||||
int ocp_async;
|
||||
SaInvocationT ocp_invocation;
|
||||
SaNameT ocp_chan_name;
|
||||
mar_invocation_t ocp_invocation;
|
||||
mar_name_t ocp_chan_name;
|
||||
void *ocp_conn;
|
||||
SaEvtChannelOpenFlagsT ocp_open_flag;
|
||||
mar_evtchannelopenflags_t ocp_open_flag;
|
||||
timer_handle ocp_timer_handle;
|
||||
uint64_t ocp_c_handle;
|
||||
uint64_t ocp_serial_no;
|
||||
@ -425,7 +495,7 @@ static DECLARE_LIST_INIT(unlink_pending);
|
||||
* rtc_entry: list entry for pending clear list.
|
||||
*/
|
||||
struct retention_time_clear_pending {
|
||||
SaEvtEventIdT rtc_event_id;
|
||||
mar_evteventid_t rtc_event_id;
|
||||
void *rtc_conn;
|
||||
struct list_head rtc_entry;
|
||||
};
|
||||
@ -471,7 +541,7 @@ char lost_evt[] = SA_EVT_LOST_EVENT;
|
||||
static int dropped_event_size;
|
||||
static struct event_data *dropped_event;
|
||||
struct evt_pattern {
|
||||
SaEvtEventPatternT pat;
|
||||
mar_evt_event_pattern_t pat;
|
||||
char str[sizeof(lost_evt)];
|
||||
};
|
||||
static struct evt_pattern dropped_pattern = {
|
||||
@ -482,12 +552,12 @@ static struct evt_pattern dropped_pattern = {
|
||||
.str = {SA_EVT_LOST_EVENT}
|
||||
};
|
||||
|
||||
SaNameT lost_chan = {
|
||||
mar_name_t lost_chan = {
|
||||
.value = LOST_CHAN,
|
||||
.length = sizeof(LOST_CHAN)
|
||||
};
|
||||
|
||||
SaNameT dropped_publisher = {
|
||||
mar_name_t dropped_publisher = {
|
||||
.value = LOST_PUB,
|
||||
.length = sizeof(LOST_PUB)
|
||||
};
|
||||
@ -496,7 +566,7 @@ struct event_svr_channel_open;
|
||||
struct event_svr_channel_subscr;
|
||||
|
||||
struct open_count {
|
||||
SaClmNodeIdT oc_node_id;
|
||||
mar_uint32_t oc_node_id;
|
||||
int32_t oc_open_count;
|
||||
};
|
||||
|
||||
@ -519,7 +589,7 @@ struct open_count {
|
||||
* so they get delivered to the proper recipients.
|
||||
*/
|
||||
struct event_svr_channel_instance {
|
||||
SaNameT esc_channel_name;
|
||||
mar_name_t esc_channel_name;
|
||||
int32_t esc_total_opens;
|
||||
int32_t esc_local_opens;
|
||||
uint32_t esc_oc_size;
|
||||
@ -611,7 +681,7 @@ struct event_svr_channel_open {
|
||||
struct event_svr_channel_subscr {
|
||||
struct event_svr_channel_open *ecs_open_chan;
|
||||
uint32_t ecs_sub_id;
|
||||
SaEvtEventFilterArrayT *ecs_filters;
|
||||
mar_evt_event_filter_array_t *ecs_filters;
|
||||
struct list_head ecs_entry;
|
||||
};
|
||||
|
||||
@ -628,45 +698,45 @@ struct event_svr_channel_subscr {
|
||||
struct member_node_data {
|
||||
unsigned int mn_nodeid;
|
||||
SaClmClusterNodeT mn_node_info;
|
||||
SaEvtEventIdT mn_last_msg_id;
|
||||
SaClmNodeIdT mn_started;
|
||||
mar_evteventid_t mn_last_msg_id;
|
||||
mar_uint32_t mn_started;
|
||||
struct member_node_data *mn_next;
|
||||
struct list_head mn_entry;
|
||||
};
|
||||
DECLARE_LIST_INIT(mnd);
|
||||
/*
|
||||
* Take the filters we received from the application via the library and
|
||||
* make them into a real SaEvtEventFilterArrayT
|
||||
* make them into a real mar_evt_event_filter_array_t
|
||||
*/
|
||||
static SaAisErrorT evtfilt_to_aisfilt(struct req_evt_event_subscribe *req,
|
||||
SaEvtEventFilterArrayT **evtfilters)
|
||||
mar_evt_event_filter_array_t **evtfilters)
|
||||
{
|
||||
|
||||
SaEvtEventFilterArrayT *filta =
|
||||
(SaEvtEventFilterArrayT *)req->ics_filter_data;
|
||||
SaEvtEventFilterArrayT *filters;
|
||||
SaEvtEventFilterT *filt = (void *)filta + sizeof(SaEvtEventFilterArrayT);
|
||||
SaUint8T *str = (void *)filta + sizeof(SaEvtEventFilterArrayT) +
|
||||
(sizeof(SaEvtEventFilterT) * filta->filtersNumber);
|
||||
mar_evt_event_filter_array_t *filta =
|
||||
(mar_evt_event_filter_array_t *)req->ics_filter_data;
|
||||
mar_evt_event_filter_array_t *filters;
|
||||
mar_evt_event_filter_t *filt = (void *)filta + sizeof(mar_evt_event_filter_array_t);
|
||||
SaUint8T *str = (void *)filta + sizeof(mar_evt_event_filter_array_t) +
|
||||
(sizeof(mar_evt_event_filter_t) * filta->filters_number);
|
||||
int i;
|
||||
int j;
|
||||
|
||||
filters = malloc(sizeof(SaEvtEventFilterArrayT));
|
||||
filters = malloc(sizeof(mar_evt_event_filter_array_t));
|
||||
if (!filters) {
|
||||
return SA_AIS_ERR_NO_MEMORY;
|
||||
}
|
||||
|
||||
filters->filtersNumber = filta->filtersNumber;
|
||||
filters->filters = malloc(sizeof(SaEvtEventFilterT) *
|
||||
filta->filtersNumber);
|
||||
filters->filters_number = filta->filters_number;
|
||||
filters->filters = malloc(sizeof(mar_evt_event_filter_t) *
|
||||
filta->filters_number);
|
||||
if (!filters->filters) {
|
||||
free(filters);
|
||||
return SA_AIS_ERR_NO_MEMORY;
|
||||
}
|
||||
|
||||
for (i = 0; i < filters->filtersNumber; i++) {
|
||||
for (i = 0; i < filters->filters_number; i++) {
|
||||
filters->filters[i].filter.pattern =
|
||||
malloc(filt[i].filter.patternSize);
|
||||
malloc(filt[i].filter.pattern_size);
|
||||
|
||||
if (!filters->filters[i].filter.pattern) {
|
||||
for (j = 0; j < i; j++) {
|
||||
@ -676,14 +746,14 @@ static SaAisErrorT evtfilt_to_aisfilt(struct req_evt_event_subscribe *req,
|
||||
free(filters);
|
||||
return SA_AIS_ERR_NO_MEMORY;
|
||||
}
|
||||
filters->filters[i].filter.patternSize =
|
||||
filt[i].filter.patternSize;
|
||||
filters->filters[i].filter.allocatedSize =
|
||||
filt[i].filter.patternSize;
|
||||
filters->filters[i].filter.pattern_size =
|
||||
filt[i].filter.pattern_size;
|
||||
filters->filters[i].filter.allocated_size =
|
||||
filt[i].filter.pattern_size;
|
||||
memcpy(filters->filters[i].filter.pattern,
|
||||
str, filters->filters[i].filter.patternSize);
|
||||
filters->filters[i].filterType = filt[i].filterType;
|
||||
str += filters->filters[i].filter.patternSize;
|
||||
str, filters->filters[i].filter.pattern_size);
|
||||
filters->filters[i].filter_type = filt[i].filter_type;
|
||||
str += filters->filters[i].filter.pattern_size;
|
||||
}
|
||||
|
||||
*evtfilters = filters;
|
||||
@ -694,11 +764,11 @@ static SaAisErrorT evtfilt_to_aisfilt(struct req_evt_event_subscribe *req,
|
||||
/*
|
||||
* Free up filter data
|
||||
*/
|
||||
static void free_filters(SaEvtEventFilterArrayT *fp)
|
||||
static void free_filters(mar_evt_event_filter_array_t *fp)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < fp->filtersNumber; i++) {
|
||||
for (i = 0; i < fp->filters_number; i++) {
|
||||
free(fp->filters[i].filter.pattern);
|
||||
}
|
||||
|
||||
@ -710,7 +780,7 @@ static void free_filters(SaEvtEventFilterArrayT *fp)
|
||||
* Look up a channel in the global channel list
|
||||
*/
|
||||
static struct event_svr_channel_instance *
|
||||
find_channel(SaNameT *chan_name, uint64_t unlink_id)
|
||||
find_channel(mar_name_t *chan_name, uint64_t unlink_id)
|
||||
{
|
||||
struct list_head *l, *head;
|
||||
struct event_svr_channel_instance *eci;
|
||||
@ -727,7 +797,7 @@ find_channel(SaNameT *chan_name, uint64_t unlink_id)
|
||||
for (l = head->next; l != head; l = l->next) {
|
||||
|
||||
eci = list_entry(l, struct event_svr_channel_instance, esc_entry);
|
||||
if (!name_match(chan_name, &eci->esc_channel_name)) {
|
||||
if (!mar_name_match(chan_name, &eci->esc_channel_name)) {
|
||||
continue;
|
||||
} else if (unlink_id != eci->esc_unlink_id) {
|
||||
continue;
|
||||
@ -741,7 +811,7 @@ find_channel(SaNameT *chan_name, uint64_t unlink_id)
|
||||
* Find the last unlinked version of a channel.
|
||||
*/
|
||||
static struct event_svr_channel_instance *
|
||||
find_last_unlinked_channel(SaNameT *chan_name)
|
||||
find_last_unlinked_channel(mar_name_t *chan_name)
|
||||
{
|
||||
struct list_head *l;
|
||||
struct event_svr_channel_instance *eci;
|
||||
@ -753,7 +823,7 @@ find_last_unlinked_channel(SaNameT *chan_name)
|
||||
for (l = esc_unlinked_head.next; l != &esc_unlinked_head; l = l->next) {
|
||||
|
||||
eci = list_entry(l, struct event_svr_channel_instance, esc_entry);
|
||||
if (!name_match(chan_name, &eci->esc_channel_name)) {
|
||||
if (!mar_name_match(chan_name, &eci->esc_channel_name)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -763,7 +833,7 @@ find_last_unlinked_channel(SaNameT *chan_name)
|
||||
/*
|
||||
* Create and initialize a channel instance structure
|
||||
*/
|
||||
static struct event_svr_channel_instance *create_channel(SaNameT *cn)
|
||||
static struct event_svr_channel_instance *create_channel(mar_name_t *cn)
|
||||
{
|
||||
struct event_svr_channel_instance *eci;
|
||||
eci = (struct event_svr_channel_instance *) malloc(sizeof(*eci));
|
||||
@ -819,7 +889,7 @@ static int check_open_size(struct event_svr_channel_instance *eci)
|
||||
*/
|
||||
static struct open_count* find_open_count(
|
||||
struct event_svr_channel_instance *eci,
|
||||
SaClmNodeIdT node_id)
|
||||
mar_uint32_t node_id)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -897,7 +967,7 @@ static void zero_chan_open_counts()
|
||||
* Replace the current open count for a node with the specified value.
|
||||
*/
|
||||
static int set_open_count(struct event_svr_channel_instance *eci,
|
||||
SaClmNodeIdT node_id, uint32_t open_count)
|
||||
mar_uint32_t node_id, uint32_t open_count)
|
||||
{
|
||||
struct open_count *oc;
|
||||
int i;
|
||||
@ -925,7 +995,7 @@ static int set_open_count(struct event_svr_channel_instance *eci,
|
||||
* Increment the open count for the specified node.
|
||||
*/
|
||||
static int inc_open_count(struct event_svr_channel_instance *eci,
|
||||
SaClmNodeIdT node_id)
|
||||
mar_uint32_t node_id)
|
||||
{
|
||||
|
||||
struct open_count *oc;
|
||||
@ -952,7 +1022,7 @@ static int inc_open_count(struct event_svr_channel_instance *eci,
|
||||
* specified channel.
|
||||
*/
|
||||
static int dec_open_count(struct event_svr_channel_instance *eci,
|
||||
SaClmNodeIdT node_id)
|
||||
mar_uint32_t node_id)
|
||||
{
|
||||
|
||||
struct open_count *oc;
|
||||
@ -1101,7 +1171,7 @@ static void unlink_channel(struct event_svr_channel_instance *eci,
|
||||
*/
|
||||
static int remove_open_count(
|
||||
struct event_svr_channel_instance *eci,
|
||||
SaClmNodeIdT node_id)
|
||||
mar_uint32_t node_id)
|
||||
{
|
||||
int i;
|
||||
int j;
|
||||
@ -1147,7 +1217,7 @@ static int remove_open_count(
|
||||
/*
|
||||
* Send a request to open a channel to the rest of the cluster.
|
||||
*/
|
||||
static SaAisErrorT evt_open_channel(SaNameT *cn, SaUint8T flgs)
|
||||
static SaAisErrorT evt_open_channel(mar_name_t *cn, SaUint8T flgs)
|
||||
{
|
||||
struct req_evt_chan_command cpkt;
|
||||
struct event_svr_channel_instance *eci;
|
||||
@ -1199,7 +1269,7 @@ chan_open_end:
|
||||
/*
|
||||
* Send a request to close a channel with the rest of the cluster.
|
||||
*/
|
||||
static SaAisErrorT evt_close_channel(SaNameT *cn, uint64_t unlink_id)
|
||||
static SaAisErrorT evt_close_channel(mar_name_t *cn, uint64_t unlink_id)
|
||||
{
|
||||
struct req_evt_chan_command cpkt;
|
||||
struct iovec chn_iovec;
|
||||
@ -1400,13 +1470,13 @@ static int check_last_event(
|
||||
* upper 32 bits of the event ID to make sure that we can generate a cluster
|
||||
* wide unique event ID for a given event.
|
||||
*/
|
||||
SaAisErrorT set_event_id(SaClmNodeIdT node_id)
|
||||
SaAisErrorT set_event_id(mar_uint32_t node_id)
|
||||
{
|
||||
SaAisErrorT err = SA_AIS_OK;
|
||||
if (base_id_top) {
|
||||
err = SA_AIS_ERR_EXIST;
|
||||
}
|
||||
base_id_top = (SaEvtEventIdT)node_id << 32;
|
||||
base_id_top = (mar_evteventid_t)node_id << 32;
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -1418,7 +1488,7 @@ static int id_in_use(uint64_t id, uint64_t base)
|
||||
{
|
||||
struct list_head *l;
|
||||
struct event_data *edp;
|
||||
SaEvtEventIdT evtid = (id << 32) | (base & BASE_ID_MASK);
|
||||
mar_evteventid_t evtid = (id << 32) | (base & BASE_ID_MASK);
|
||||
|
||||
for (l = retained_list.next; l != &retained_list; l = l->next) {
|
||||
edp = list_entry(l, struct event_data, ed_retained);
|
||||
@ -1484,7 +1554,7 @@ event_retention_timeout(void *data)
|
||||
*
|
||||
*/
|
||||
static SaAisErrorT
|
||||
clear_retention_time(SaEvtEventIdT event_id)
|
||||
clear_retention_time(mar_evteventid_t event_id)
|
||||
{
|
||||
struct event_data *edp;
|
||||
struct list_head *l, *nxt;
|
||||
@ -1604,38 +1674,38 @@ evt_already_delivered(struct event_data *evt,
|
||||
* return SA_AIS_OK if the pattern matches a filter
|
||||
*/
|
||||
static SaAisErrorT
|
||||
filter_match(SaEvtEventPatternT *ep, SaEvtEventFilterT *ef)
|
||||
filter_match(mar_evt_event_pattern_t *ep, mar_evt_event_filter_t *ef)
|
||||
{
|
||||
int ret;
|
||||
ret = SA_AIS_ERR_FAILED_OPERATION;
|
||||
|
||||
switch (ef->filterType) {
|
||||
switch (ef->filter_type) {
|
||||
case SA_EVT_PREFIX_FILTER:
|
||||
if (ef->filter.patternSize > ep->patternSize) {
|
||||
if (ef->filter.pattern_size > ep->pattern_size) {
|
||||
break;
|
||||
}
|
||||
if (strncmp((char *)ef->filter.pattern, (char *)ep->pattern,
|
||||
ef->filter.patternSize) == 0) {
|
||||
ef->filter.pattern_size) == 0) {
|
||||
ret = SA_AIS_OK;
|
||||
}
|
||||
break;
|
||||
case SA_EVT_SUFFIX_FILTER:
|
||||
if (ef->filter.patternSize > ep->patternSize) {
|
||||
if (ef->filter.pattern_size > ep->pattern_size) {
|
||||
break;
|
||||
}
|
||||
if (strncmp((char *)ef->filter.pattern,
|
||||
(char *)&ep->pattern[ep->patternSize - ef->filter.patternSize],
|
||||
ef->filter.patternSize) == 0) {
|
||||
(char *)&ep->pattern[ep->pattern_size - ef->filter.pattern_size],
|
||||
ef->filter.pattern_size) == 0) {
|
||||
ret = SA_AIS_OK;
|
||||
}
|
||||
|
||||
break;
|
||||
case SA_EVT_EXACT_FILTER:
|
||||
if (ef->filter.patternSize != ep->patternSize) {
|
||||
if (ef->filter.pattern_size != ep->pattern_size) {
|
||||
break;
|
||||
}
|
||||
if (strncmp((char *)ef->filter.pattern, (char *)ep->pattern,
|
||||
ef->filter.patternSize) == 0) {
|
||||
ef->filter.pattern_size) == 0) {
|
||||
ret = SA_AIS_OK;
|
||||
}
|
||||
break;
|
||||
@ -1656,15 +1726,15 @@ static SaAisErrorT
|
||||
event_match(struct event_data *evt,
|
||||
struct event_svr_channel_subscr *ecs)
|
||||
{
|
||||
SaEvtEventFilterT *ef;
|
||||
SaEvtEventPatternT *ep;
|
||||
mar_evt_event_filter_t *ef;
|
||||
mar_evt_event_pattern_t *ep;
|
||||
uint32_t filt_count;
|
||||
SaAisErrorT ret = SA_AIS_OK;
|
||||
int i;
|
||||
|
||||
ep = (SaEvtEventPatternT *)(&evt->ed_event.led_body[0]);
|
||||
ep = (mar_evt_event_pattern_t *)(&evt->ed_event.led_body[0]);
|
||||
ef = ecs->ecs_filters->filters;
|
||||
filt_count = min(ecs->ecs_filters->filtersNumber,
|
||||
filt_count = min(ecs->ecs_filters->filters_number,
|
||||
evt->ed_event.led_patterns_number);
|
||||
|
||||
for (i = 0; i < filt_count; i++) {
|
||||
@ -1931,7 +2001,7 @@ static void
|
||||
convert_event(void *msg)
|
||||
{
|
||||
struct lib_event_data *evt = (struct lib_event_data *)msg;
|
||||
SaEvtEventPatternT *eps;
|
||||
mar_evt_event_pattern_t *eps;
|
||||
int i;
|
||||
|
||||
/*
|
||||
@ -1963,10 +2033,10 @@ convert_event(void *msg)
|
||||
* We can't do anything about user data since it doesn't have a specified
|
||||
* format. The application is on its own here.
|
||||
*/
|
||||
eps = (SaEvtEventPatternT *)evt->led_body;
|
||||
eps = (mar_evt_event_pattern_t *)evt->led_body;
|
||||
for (i = 0; i < evt->led_patterns_number; i++) {
|
||||
eps->patternSize = swab32(eps->patternSize);
|
||||
eps->allocatedSize = swab32(eps->allocatedSize);
|
||||
eps->pattern_size = swab32(eps->pattern_size);
|
||||
eps->allocated_size = swab32(eps->allocated_size);
|
||||
eps++;
|
||||
}
|
||||
|
||||
@ -1982,7 +2052,7 @@ make_local_event(struct lib_event_data *p,
|
||||
struct event_svr_channel_instance *eci)
|
||||
{
|
||||
struct event_data *ed;
|
||||
SaEvtEventPatternT *eps;
|
||||
mar_evt_event_pattern_t *eps;
|
||||
SaUint8T *str;
|
||||
uint32_t ed_size;
|
||||
int i;
|
||||
@ -2005,12 +2075,12 @@ make_local_event(struct lib_event_data *p,
|
||||
memcpy(&ed->ed_event, p, sizeof(*p) +
|
||||
p->led_user_data_offset + p->led_user_data_size);
|
||||
|
||||
eps = (SaEvtEventPatternT *)ed->ed_event.led_body;
|
||||
eps = (mar_evt_event_pattern_t *)ed->ed_event.led_body;
|
||||
str = ed->ed_event.led_body +
|
||||
(ed->ed_event.led_patterns_number * sizeof(SaEvtEventPatternT));
|
||||
(ed->ed_event.led_patterns_number * sizeof(mar_evt_event_pattern_t));
|
||||
for (i = 0; i < ed->ed_event.led_patterns_number; i++) {
|
||||
eps->pattern = str;
|
||||
str += eps->patternSize;
|
||||
str += eps->pattern_size;
|
||||
eps++;
|
||||
}
|
||||
|
||||
@ -2448,7 +2518,7 @@ static void lib_evt_event_subscribe(void *conn, void *message)
|
||||
{
|
||||
struct req_evt_event_subscribe *req;
|
||||
struct res_evt_event_subscribe res;
|
||||
SaEvtEventFilterArrayT *filters;
|
||||
mar_evt_event_filter_array_t *filters;
|
||||
SaAisErrorT error;
|
||||
struct event_svr_channel_open *eco;
|
||||
struct event_svr_channel_instance *eci;
|
||||
@ -2495,13 +2565,13 @@ static void lib_evt_event_subscribe(void *conn, void *message)
|
||||
|
||||
if (error == SA_AIS_OK) {
|
||||
log_printf(LOG_LEVEL_DEBUG, "Subscribe filters count %d\n",
|
||||
filters->filtersNumber);
|
||||
for (i = 0; i < filters->filtersNumber; i++) {
|
||||
filters->filters_number);
|
||||
for (i = 0; i < filters->filters_number; i++) {
|
||||
log_printf(LOG_LEVEL_DEBUG, "type %s(%d) sz %d, <%s>\n",
|
||||
filter_types[filters->filters[i].filterType],
|
||||
filters->filters[i].filterType,
|
||||
filters->filters[i].filter.patternSize,
|
||||
(filters->filters[i].filter.patternSize)
|
||||
filter_types[filters->filters[i].filter_type],
|
||||
filters->filters[i].filter_type,
|
||||
filters->filters[i].filter.pattern_size,
|
||||
(filters->filters[i].filter.pattern_size)
|
||||
? (char *)filters->filters[i].filter.pattern
|
||||
: "");
|
||||
}
|
||||
@ -2613,7 +2683,7 @@ static void lib_evt_event_unsubscribe(void *conn, void *message)
|
||||
"unsubscribe from channel %s subscription ID 0x%x "
|
||||
"with %d filters\n",
|
||||
eci->esc_channel_name.value,
|
||||
ecs->ecs_sub_id, ecs->ecs_filters->filtersNumber);
|
||||
ecs->ecs_sub_id, ecs->ecs_filters->filters_number);
|
||||
|
||||
free_filters(ecs->ecs_filters);
|
||||
free(ecs);
|
||||
@ -2636,7 +2706,7 @@ static void lib_evt_event_publish(void *conn, void *message)
|
||||
struct res_evt_event_publish res;
|
||||
struct event_svr_channel_open *eco;
|
||||
struct event_svr_channel_instance *eci;
|
||||
SaEvtEventIdT event_id = 0;
|
||||
mar_evteventid_t event_id = 0;
|
||||
uint64_t msg_id = 0;
|
||||
SaAisErrorT error = SA_AIS_OK;
|
||||
struct iovec pub_iovec;
|
||||
@ -2824,7 +2894,7 @@ data_get_done:
|
||||
/*
|
||||
* Scan the list of channels and remove the specified node.
|
||||
*/
|
||||
static void remove_chan_open_info(SaClmNodeIdT node_id)
|
||||
static void remove_chan_open_info(mar_uint32_t node_id)
|
||||
{
|
||||
struct list_head *l, *nxt;
|
||||
struct event_svr_channel_instance *eci;
|
||||
@ -3228,8 +3298,8 @@ static void evt_remote_evt(void *msg, unsigned int nodeid)
|
||||
/*
|
||||
* Calculate the remaining retention time of a received event during recovery
|
||||
*/
|
||||
inline SaTimeT calc_retention_time(SaTimeT retention,
|
||||
SaTimeT received, SaTimeT now)
|
||||
inline mar_time_t calc_retention_time(mar_time_t retention,
|
||||
mar_time_t received, mar_time_t now)
|
||||
{
|
||||
if ((received < now) && ((now - received) < retention)) {
|
||||
return retention - (now - received);
|
||||
@ -3255,7 +3325,7 @@ static void evt_remote_recovery_evt(void *msg, unsigned int nodeid)
|
||||
struct event_data *evt;
|
||||
struct member_node_data *md;
|
||||
int num_delivered;
|
||||
SaTimeT now;
|
||||
mar_time_t now;
|
||||
|
||||
now = clust_time_now();
|
||||
|
||||
@ -3379,7 +3449,7 @@ static void evt_chan_open_finish(struct open_chan_pending *ocp,
|
||||
esip = (struct libevt_pd *)openais_conn_private_data_get(ocp->ocp_conn);
|
||||
|
||||
log_printf(CHAN_OPEN_DEBUG, "Open channel finish %s\n",
|
||||
getSaNameT(&ocp->ocp_chan_name));
|
||||
get_mar_name_t(&ocp->ocp_chan_name));
|
||||
if (ocp->ocp_timer_handle) {
|
||||
openais_timer_delete (ocp->ocp_timer_handle);
|
||||
}
|
||||
@ -3390,12 +3460,12 @@ static void evt_chan_open_finish(struct open_chan_pending *ocp,
|
||||
*/
|
||||
if (ocp->ocp_invocation == OPEN_TIMED_OUT) {
|
||||
log_printf(CHAN_OPEN_DEBUG, "Closing timed out open of %s\n",
|
||||
getSaNameT(&ocp->ocp_chan_name));
|
||||
get_mar_name_t(&ocp->ocp_chan_name));
|
||||
error = evt_close_channel(&ocp->ocp_chan_name, EVT_CHAN_ACTIVE);
|
||||
if (error != SA_AIS_OK) {
|
||||
log_printf(CHAN_OPEN_DEBUG,
|
||||
"Close of timed out open failed for %s\n",
|
||||
getSaNameT(&ocp->ocp_chan_name));
|
||||
get_mar_name_t(&ocp->ocp_chan_name));
|
||||
}
|
||||
list_del(&ocp->ocp_entry);
|
||||
free(ocp);
|
||||
@ -3438,7 +3508,7 @@ static void evt_chan_open_finish(struct open_chan_pending *ocp,
|
||||
|
||||
open_return:
|
||||
log_printf(CHAN_OPEN_DEBUG, "Open channel finish %s send response %d\n",
|
||||
getSaNameT(&ocp->ocp_chan_name),
|
||||
get_mar_name_t(&ocp->ocp_chan_name),
|
||||
error);
|
||||
if (ocp->ocp_async) {
|
||||
struct res_evt_open_chan_async resa;
|
||||
@ -3631,7 +3701,7 @@ static void evt_remote_chan_op(void *msg, unsigned int nodeid)
|
||||
}
|
||||
if (!eci) {
|
||||
log_printf(LOG_LEVEL_WARNING, "Could not create channel %s\n",
|
||||
getSaNameT(&cpkt->u.chc_chan.ocr_name));
|
||||
get_mar_name_t(&cpkt->u.chc_chan.ocr_name));
|
||||
break;
|
||||
}
|
||||
|
||||
@ -3656,7 +3726,7 @@ static void evt_remote_chan_op(void *msg, unsigned int nodeid)
|
||||
}
|
||||
log_printf(CHAN_OPEN_DEBUG,
|
||||
"Open channel %s t %d, l %d, r %d\n",
|
||||
getSaNameT(&eci->esc_channel_name),
|
||||
get_mar_name_t(&eci->esc_channel_name),
|
||||
eci->esc_total_opens, eci->esc_local_opens,
|
||||
eci->esc_retained_count);
|
||||
break;
|
||||
@ -3839,11 +3909,11 @@ static void evt_remote_chan_op(void *msg, unsigned int nodeid)
|
||||
}
|
||||
if (!eci) {
|
||||
log_printf(LOG_LEVEL_WARNING, "Could not create channel %s\n",
|
||||
getSaNameT(&cpkt->u.chc_set_opens.chc_chan_name));
|
||||
get_mar_name_t(&cpkt->u.chc_set_opens.chc_chan_name));
|
||||
break;
|
||||
}
|
||||
if (set_open_count(eci, mn->mn_node_info.nodeId,
|
||||
cpkt->u.chc_set_opens.chc_open_count)) {
|
||||
cpkt->u.chc_set_opens.chc_open_count)) {
|
||||
log_printf(LOG_LEVEL_ERROR,
|
||||
"Error setting Open channel count %s for node %s\n",
|
||||
cpkt->u.chc_set_opens.chc_chan_name.value,
|
||||
|
@ -39,6 +39,7 @@
|
||||
#include "saEvt.h"
|
||||
#include "saClm.h"
|
||||
#include "ipc_gen.h"
|
||||
#include "mar_evt.h"
|
||||
|
||||
enum req_evt_types {
|
||||
MESSAGE_REQ_EVT_OPEN_CHANNEL = 0,
|
||||
@ -69,22 +70,21 @@ enum res_evt_types {
|
||||
* MESSAGE_REQ_EVT_OPEN_CHANNEL
|
||||
* MESSAGE_REQ_EVT_OPEN_CHANNEL_ASYNC
|
||||
*
|
||||
* ico_head Request head
|
||||
* ico_open_flag: Channel open flags
|
||||
* ico_head Request head
|
||||
* ico_open_flag: Channel open flags
|
||||
* ico_channel_name: Name of channel to open
|
||||
* ico_c_handle: Local lib channel handle (used in returned event data)
|
||||
* ico_timeout: Used only by open
|
||||
* ico_invocation: Used only by async open
|
||||
* ico_c_handle: Local lib channel handle (used in returned event data)
|
||||
* ico_timeout: Used only by open
|
||||
* ico_invocation: Used only by async open
|
||||
*
|
||||
*/
|
||||
struct req_evt_channel_open {
|
||||
|
||||
mar_req_header_t ico_head;
|
||||
SaUint8T ico_open_flag;
|
||||
SaNameT ico_channel_name;
|
||||
SaEvtChannelHandleT ico_c_handle;
|
||||
SaTimeT ico_timeout;
|
||||
SaInvocationT ico_invocation;
|
||||
mar_req_header_t ico_head __attribute__((aligned(8)));
|
||||
mar_uint8_t ico_open_flag __attribute__((aligned(8)));
|
||||
mar_name_t ico_channel_name __attribute__((aligned(8)));
|
||||
mar_evtchannelhandle_t ico_c_handle __attribute__((aligned(8)));
|
||||
mar_time_t ico_timeout __attribute__((aligned(8)));
|
||||
mar_invocation_t ico_invocation __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
/*
|
||||
@ -98,13 +98,13 @@ struct req_evt_channel_open {
|
||||
*
|
||||
* ico_head: Results head
|
||||
* ico_error: Request results
|
||||
* ico_channel_handle: Server side channel handle (used in channel ops)
|
||||
* ico_channel_handle: Server side channel handle (used in channel ops)
|
||||
*
|
||||
*/
|
||||
struct res_evt_channel_open {
|
||||
|
||||
mar_res_header_t ico_head;
|
||||
uint32_t ico_channel_handle;/* svr chan handle */
|
||||
mar_res_header_t ico_head __attribute__((aligned(8)));
|
||||
mar_uint32_t ico_channel_handle __attribute__((aligned(8)));/* svr chan handle */
|
||||
|
||||
};
|
||||
|
||||
@ -120,10 +120,10 @@ struct res_evt_channel_open {
|
||||
* to the particular open.
|
||||
*/
|
||||
struct res_evt_open_chan_async {
|
||||
mar_res_header_t ica_head;
|
||||
SaEvtChannelHandleT ica_c_handle;
|
||||
uint32_t ica_channel_handle;
|
||||
SaInvocationT ica_invocation;
|
||||
mar_res_header_t ica_head __attribute__((aligned(8)));
|
||||
mar_evtchannelhandle_t ica_c_handle __attribute__((aligned(8)));
|
||||
mar_uint32_t ica_channel_handle __attribute__((aligned(8)));
|
||||
mar_invocation_t ica_invocation __attribute__((aligned(8)));
|
||||
|
||||
};
|
||||
|
||||
@ -132,13 +132,12 @@ struct res_evt_open_chan_async {
|
||||
* MESSAGE_REQ_EVT_CLOSE_CHANNEL
|
||||
*
|
||||
* icc_head: Request head
|
||||
* icc_channel_handle: Server handle of channel to close
|
||||
* icc_channel_handle: Server handle of channel to close
|
||||
*
|
||||
*/
|
||||
struct req_evt_channel_close {
|
||||
|
||||
mar_req_header_t icc_head;
|
||||
uint32_t icc_channel_handle;
|
||||
mar_req_header_t icc_head __attribute__((aligned(8)));
|
||||
mar_uint32_t icc_channel_handle __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
/*
|
||||
@ -148,7 +147,7 @@ struct req_evt_channel_close {
|
||||
*
|
||||
*/
|
||||
struct res_evt_channel_close {
|
||||
mar_res_header_t icc_head;
|
||||
mar_res_header_t icc_head __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
/*
|
||||
@ -159,9 +158,8 @@ struct res_evt_channel_close {
|
||||
*
|
||||
*/
|
||||
struct req_evt_channel_unlink {
|
||||
|
||||
mar_req_header_t iuc_head;
|
||||
SaNameT iuc_channel_name;
|
||||
mar_req_header_t iuc_head __attribute__((aligned(8)));
|
||||
mar_name_t iuc_channel_name __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
/*
|
||||
@ -171,28 +169,27 @@ struct req_evt_channel_unlink {
|
||||
*
|
||||
*/
|
||||
struct res_evt_channel_unlink {
|
||||
mar_res_header_t iuc_head;
|
||||
mar_res_header_t iuc_head __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
/*
|
||||
* MESSAGE_REQ_EVT_SUBSCRIBE
|
||||
*
|
||||
* ics_head: Request head
|
||||
* ics_channel_handle: Server handle of channel
|
||||
* ics_channel_handle: Server handle of channel
|
||||
* ics_sub_id: Subscription ID
|
||||
* ics_filter_size: Size of supplied filter data
|
||||
* ics_filter_count: Number of filters supplied
|
||||
* ics_filter_count: Number of filters supplied
|
||||
* ics_filter_data: Filter data
|
||||
*
|
||||
*/
|
||||
struct req_evt_event_subscribe {
|
||||
|
||||
mar_req_header_t ics_head;
|
||||
uint32_t ics_channel_handle;
|
||||
SaEvtSubscriptionIdT ics_sub_id;
|
||||
uint32_t ics_filter_size;
|
||||
uint32_t ics_filter_count;
|
||||
uint8_t ics_filter_data[0];
|
||||
mar_req_header_t ics_head __attribute__((aligned(8)));
|
||||
mar_uint32_t ics_channel_handle __attribute__((aligned(8)));
|
||||
mar_evtsubscriptionid_t ics_sub_id __attribute__((aligned(8)));
|
||||
mar_uint32_t ics_filter_size __attribute__((aligned(8)));
|
||||
mar_uint32_t ics_filter_count __attribute__((aligned(8)));
|
||||
mar_uint8_t ics_filter_data[0] __attribute__((aligned(8)));
|
||||
|
||||
};
|
||||
|
||||
@ -204,7 +201,7 @@ struct req_evt_event_subscribe {
|
||||
*
|
||||
*/
|
||||
struct res_evt_event_subscribe {
|
||||
mar_res_header_t ics_head;
|
||||
mar_res_header_t ics_head __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
/*
|
||||
@ -216,10 +213,9 @@ struct res_evt_event_subscribe {
|
||||
*
|
||||
*/
|
||||
struct req_evt_event_unsubscribe {
|
||||
|
||||
mar_req_header_t icu_head;
|
||||
uint32_t icu_channel_handle;
|
||||
SaEvtSubscriptionIdT icu_sub_id;
|
||||
mar_req_header_t icu_head __attribute__((aligned(8)));
|
||||
mar_uint32_t icu_channel_handle __attribute__((aligned(8)));
|
||||
mar_evtsubscriptionid_t icu_sub_id __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
|
||||
@ -231,7 +227,7 @@ struct req_evt_event_unsubscribe {
|
||||
*
|
||||
*/
|
||||
struct res_evt_event_unsubscribe {
|
||||
mar_res_header_t icu_head;
|
||||
mar_res_header_t icu_head __attribute__((aligned(8)));
|
||||
|
||||
};
|
||||
|
||||
@ -242,55 +238,55 @@ struct res_evt_event_unsubscribe {
|
||||
* evd_head: Request Head
|
||||
*/
|
||||
struct res_evt_event_data {
|
||||
mar_res_header_t evd_head;
|
||||
mar_res_header_t evd_head __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
/*
|
||||
* MESSAGE_REQ_EVT_PUBLISH (1)
|
||||
* MESSAGE_RES_EVT_EVENT_DATA (2)
|
||||
* MESSAGE_REQ_EXEC_EVT_EVENTDATA (3)
|
||||
* MESSAGE_RES_EVT_EVENT_DATA (2)
|
||||
* MESSAGE_REQ_EXEC_EVT_EVENTDATA (3)
|
||||
* MESSAGE_REQ_EXEC_EVT_RECOVERY_EVENTDATA (4)
|
||||
*
|
||||
* led_head: Request/Results head
|
||||
* led_addr: address of node (4 only)
|
||||
* led_head: Request/Results head
|
||||
* led_addr: address of node (4 only)
|
||||
* led_receive_time: Time that the message was received (4 only)
|
||||
* led_svr_channel_handle: Server channel handle (1 only)
|
||||
* led_lib_channel_handle: Lib channel handle (2 only)
|
||||
* led_chan_name: Channel name (3 and 4 only)
|
||||
* led_chan_name: Channel name (3 and 4 only)
|
||||
* led_chan_unlink_id: directs delivery to unlinked channels.
|
||||
* led_event_id: Event ID (2, 3 and 4 only)
|
||||
* led_msg_id: message ID (2, 3 and 4 only)
|
||||
* led_sub_id: Subscription ID (2 only)
|
||||
* led_event_id: Event ID (2, 3 and 4 only)
|
||||
* led_msg_id: message ID (2, 3 and 4 only)
|
||||
* led_sub_id: Subscription ID (2 only)
|
||||
* led_publisher_node_id: Node ID of event publisher
|
||||
* led_publisher_name: Node name of event publisher
|
||||
* led_retention_time: Event retention time
|
||||
* led_publish_time: Publication time of the event
|
||||
* led_priority: Event priority
|
||||
* led_priority: Event priority
|
||||
* led_user_data_offset: Offset to user data
|
||||
* led_user_data_size: Size of user data
|
||||
* led_patterns_number: Number of patterns in the event
|
||||
* led_body: Pattern and user data
|
||||
* led_body: Pattern and user data
|
||||
*/
|
||||
struct lib_event_data {
|
||||
mar_res_header_t led_head;
|
||||
unsigned int led_nodeid;
|
||||
SaTimeT led_receive_time;
|
||||
uint32_t led_svr_channel_handle;
|
||||
SaEvtChannelHandleT led_lib_channel_handle;
|
||||
SaNameT led_chan_name;
|
||||
uint64_t led_chan_unlink_id;
|
||||
SaEvtEventIdT led_event_id;
|
||||
uint64_t led_msg_id;
|
||||
SaEvtSubscriptionIdT led_sub_id;
|
||||
SaClmNodeIdT led_publisher_node_id;
|
||||
SaNameT led_publisher_name;
|
||||
SaTimeT led_retention_time;
|
||||
SaTimeT led_publish_time;
|
||||
SaEvtEventPriorityT led_priority;
|
||||
uint32_t led_user_data_offset;
|
||||
uint32_t led_user_data_size;
|
||||
uint32_t led_patterns_number;
|
||||
uint8_t led_body[0];
|
||||
mar_res_header_t led_head __attribute__((aligned(8)));
|
||||
mar_uint32_t led_nodeid __attribute__((aligned(8)));
|
||||
mar_time_t led_receive_time __attribute__((aligned(8)));
|
||||
mar_uint32_t led_svr_channel_handle __attribute__((aligned(8)));
|
||||
mar_evtchannelhandle_t led_lib_channel_handle __attribute__((aligned(8)));
|
||||
mar_name_t led_chan_name __attribute__((aligned(8)));
|
||||
mar_uint64_t led_chan_unlink_id __attribute__((aligned(8)));
|
||||
mar_evteventid_t led_event_id __attribute__((aligned(8)));
|
||||
mar_uint64_t led_msg_id __attribute__((aligned(8)));
|
||||
mar_evtsubscriptionid_t led_sub_id __attribute__((aligned(8)));
|
||||
mar_uint32_t led_publisher_node_id __attribute__((aligned(8)));
|
||||
mar_name_t led_publisher_name __attribute__((aligned(8)));
|
||||
mar_time_t led_retention_time __attribute__((aligned(8)));
|
||||
mar_time_t led_publish_time __attribute__((aligned(8)));
|
||||
mar_evteventpriority_t led_priority __attribute__((aligned(8)));
|
||||
mar_uint32_t led_user_data_offset __attribute__((aligned(8)));
|
||||
mar_uint32_t led_user_data_size __attribute__((aligned(8)));
|
||||
mar_uint32_t led_patterns_number __attribute__((aligned(8)));
|
||||
mar_uint8_t led_body[0] __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
/*
|
||||
@ -302,9 +298,8 @@ struct lib_event_data {
|
||||
*
|
||||
*/
|
||||
struct res_evt_event_publish {
|
||||
|
||||
mar_res_header_t iep_head;
|
||||
SaEvtEventIdT iep_event_id;
|
||||
mar_res_header_t iep_head __attribute__((aligned(8)));
|
||||
mar_evteventid_t iep_event_id __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
/*
|
||||
@ -319,9 +314,9 @@ struct res_evt_event_publish {
|
||||
*/
|
||||
struct req_evt_event_clear_retentiontime {
|
||||
|
||||
mar_req_header_t iec_head;
|
||||
SaEvtEventIdT iec_event_id;
|
||||
uint32_t iec_channel_handle;
|
||||
mar_req_header_t iec_head __attribute__((aligned(8)));
|
||||
mar_evteventid_t iec_event_id __attribute__((aligned(8)));
|
||||
mar_uint32_t iec_channel_handle __attribute__((aligned(8)));
|
||||
|
||||
};
|
||||
|
||||
@ -333,81 +328,7 @@ struct req_evt_event_clear_retentiontime {
|
||||
*
|
||||
*/
|
||||
struct res_evt_event_clear_retentiontime {
|
||||
mar_res_header_t iec_head;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* MESSAGE_REQ_EXEC_EVT_CHANCMD
|
||||
*
|
||||
* Used for various event related operations.
|
||||
*
|
||||
*/
|
||||
enum evt_chan_ops {
|
||||
EVT_OPEN_CHAN_OP, /* chc_chan */
|
||||
EVT_CLOSE_CHAN_OP, /* chc_close_unlink_chan */
|
||||
EVT_UNLINK_CHAN_OP, /* chc_close_unlink_chan */
|
||||
EVT_CLEAR_RET_OP, /* chc_event_id */
|
||||
EVT_SET_ID_OP, /* chc_set_id */
|
||||
EVT_CONF_DONE, /* no data used */
|
||||
EVT_OPEN_COUNT, /* chc_set_opens */
|
||||
EVT_OPEN_COUNT_DONE /* no data used */
|
||||
};
|
||||
|
||||
/*
|
||||
* Used during recovery to set the next issued event ID
|
||||
* based on the highest ID seen by any of the members
|
||||
*/
|
||||
struct evt_set_id {
|
||||
unsigned int chc_nodeid;
|
||||
uint64_t chc_last_id;
|
||||
};
|
||||
|
||||
/*
|
||||
* For set open count used during recovery to syncronize all nodes
|
||||
*
|
||||
* chc_chan_name: Channel name.
|
||||
* chc_open_count: number of local opens of this channel.
|
||||
*/
|
||||
struct evt_set_opens {
|
||||
SaNameT chc_chan_name;
|
||||
uint32_t chc_open_count;
|
||||
};
|
||||
|
||||
/*
|
||||
* Used to communicate channel to close or unlink.
|
||||
*/
|
||||
#define EVT_CHAN_ACTIVE 0
|
||||
struct evt_close_unlink_chan {
|
||||
SaNameT chcu_name;
|
||||
uint64_t chcu_unlink_id;
|
||||
};
|
||||
|
||||
struct open_chan_req {
|
||||
SaNameT ocr_name;
|
||||
uint64_t ocr_serial_no;
|
||||
};
|
||||
|
||||
/*
|
||||
* Sent via MESSAGE_REQ_EXEC_EVT_CHANCMD
|
||||
*
|
||||
* chc_head: Request head
|
||||
* chc_op: Channel operation (open, close, clear retentiontime)
|
||||
* u: union of operation options.
|
||||
*/
|
||||
struct req_evt_chan_command {
|
||||
mar_req_header_t chc_head;
|
||||
int chc_op;
|
||||
union {
|
||||
struct open_chan_req chc_chan;
|
||||
SaEvtEventIdT chc_event_id;
|
||||
struct evt_set_id chc_set_id;
|
||||
struct evt_set_opens chc_set_opens;
|
||||
struct evt_close_unlink_chan chcu;
|
||||
} u;
|
||||
mar_res_header_t iec_head __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
#endif /* AIS_EVT_H_DEFINED */
|
||||
/*
|
||||
* vi: set autoindent tabstop=4 shiftwidth=4 :
|
||||
*/
|
||||
|
78
include/mar_evt.h
Normal file
78
include/mar_evt.h
Normal file
@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2005 Mark Haverkamp
|
||||
* Copyright (c) 2004-2005 Open Source Development Lab
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software licensed under BSD license, the text of which follows:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither the name of the Open Source Developement Lab nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef MAR_EVT_H_DEFINED
|
||||
#define MAR_EVT_H_DEFINED
|
||||
|
||||
#include "mar_gen.h"
|
||||
|
||||
typedef mar_uint64_t mar_evtchannelhandle_t;
|
||||
|
||||
typedef mar_uint64_t mar_evtsubscriptionid_t;
|
||||
|
||||
typedef mar_uint8_t mar_evteventpriority_t;
|
||||
|
||||
typedef mar_uint64_t mar_evteventid_t;
|
||||
|
||||
typedef mar_uint8_t mar_evtchannelopenflags_t;
|
||||
|
||||
typedef struct {
|
||||
mar_size_t allocated_size __attribute__((aligned(8)));
|
||||
mar_size_t pattern_size __attribute__((aligned(8)));
|
||||
mar_uint8_t *pattern __attribute__((aligned(8)));
|
||||
} mar_evt_event_pattern_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
mar_size_t allocated_number __attribute__((aligned(8)));
|
||||
mar_size_t patterns_number __attribute__((aligned(8)));
|
||||
mar_evt_event_pattern_t *patterns __attribute__((aligned(8)));
|
||||
} mar_evt_event_pattern_array_t;
|
||||
|
||||
typedef enum {
|
||||
MAR_EVT_PREFIX_FILTER = 1,
|
||||
MAR_EVT_SUFFIX_FILTER = 2,
|
||||
MAR_EVT_EXACT_FILTER = 3,
|
||||
MAR_EVT_PASS_ALL_FILTER = 4
|
||||
} mar_evt_event_filter_type_t;
|
||||
|
||||
typedef struct {
|
||||
mar_evt_event_filter_type_t filter_type __attribute__((aligned(8)));
|
||||
mar_evt_event_pattern_t filter __attribute__((aligned(8)));
|
||||
} mar_evt_event_filter_t;
|
||||
|
||||
typedef struct {
|
||||
mar_size_t filters_number __attribute__((aligned(8)));
|
||||
mar_evt_event_filter_t *filters __attribute__((aligned(8)));
|
||||
} mar_evt_event_filter_array_t;
|
||||
|
||||
#endif /* MAR_EVT_H_DEFINED */
|
@ -57,8 +57,8 @@ typedef void
|
||||
);
|
||||
|
||||
typedef struct{
|
||||
SaEvtChannelOpenCallbackT saEvtChannelOpenCallback;
|
||||
SaEvtEventDeliverCallbackT saEvtEventDeliverCallback;
|
||||
SaEvtChannelOpenCallbackT saEvtChannelOpenCallback;
|
||||
SaEvtEventDeliverCallbackT saEvtEventDeliverCallback;
|
||||
} SaEvtCallbacksT;
|
||||
|
||||
#define SA_EVT_CHANNEL_PUBLISHER 0X1
|
||||
@ -68,8 +68,8 @@ typedef SaUint8T SaEvtChannelOpenFlagsT;
|
||||
|
||||
typedef struct {
|
||||
SaSizeT allocatedSize;
|
||||
SaSizeT patternSize;
|
||||
SaUint8T *pattern;
|
||||
SaSizeT patternSize;
|
||||
SaUint8T *pattern;
|
||||
} SaEvtEventPatternT;
|
||||
|
||||
|
||||
@ -103,28 +103,28 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
SaSizeT allocatedNumber;
|
||||
SaSizeT patternsNumber;
|
||||
SaEvtEventPatternT *patterns;
|
||||
SaSizeT patternsNumber;
|
||||
SaEvtEventPatternT *patterns;
|
||||
} SaEvtEventPatternArrayT;
|
||||
|
||||
typedef SaUint8T SaEvtEventPriorityT;
|
||||
typedef SaUint64T SaEvtEventIdT;
|
||||
|
||||
typedef enum {
|
||||
SA_EVT_PREFIX_FILTER = 1,
|
||||
SA_EVT_SUFFIX_FILTER = 2,
|
||||
SA_EVT_EXACT_FILTER = 3,
|
||||
SA_EVT_PASS_ALL_FILTER = 4
|
||||
SA_EVT_PREFIX_FILTER = 1,
|
||||
SA_EVT_SUFFIX_FILTER = 2,
|
||||
SA_EVT_EXACT_FILTER = 3,
|
||||
SA_EVT_PASS_ALL_FILTER = 4
|
||||
} SaEvtEventFilterTypeT;
|
||||
|
||||
typedef struct {
|
||||
SaEvtEventFilterTypeT filterType;
|
||||
SaEvtEventPatternT filter;
|
||||
SaEvtEventFilterTypeT filterType;
|
||||
SaEvtEventPatternT filter;
|
||||
} SaEvtEventFilterT;
|
||||
|
||||
typedef struct {
|
||||
SaSizeT filtersNumber;
|
||||
SaEvtEventFilterT *filters;
|
||||
SaSizeT filtersNumber;
|
||||
SaEvtEventFilterT *filters;
|
||||
} SaEvtEventFilterArrayT;
|
||||
|
||||
|
||||
@ -236,6 +236,3 @@ saEvtEventRetentionTimeClear(
|
||||
}
|
||||
#endif
|
||||
#endif /* AIS_EVT_H_DEFINED */
|
||||
/*
|
||||
* vi: set autoindent tabstop=4 shiftwidth=4 :
|
||||
*/
|
||||
|
69
lib/evt.c
69
lib/evt.c
@ -457,7 +457,7 @@ static SaAisErrorT make_event(SaEvtEventHandleT *event_handle,
|
||||
{
|
||||
struct event_data_instance *edi;
|
||||
struct event_channel_instance *eci;
|
||||
SaEvtEventPatternT *pat;
|
||||
mar_evt_event_pattern_t *pat;
|
||||
SaUint8T *str;
|
||||
SaAisErrorT error;
|
||||
struct handle_list *hl;
|
||||
@ -497,7 +497,8 @@ static SaAisErrorT make_event(SaEvtEventHandleT *event_handle,
|
||||
edi->edi_pub_time = evt->led_publish_time;
|
||||
edi->edi_event_data_size = evt->led_user_data_size;
|
||||
edi->edi_event_id = evt->led_event_id;
|
||||
edi->edi_pub_name = evt->led_publisher_name;
|
||||
marshall_from_mar_name_t (&edi->edi_pub_name, &evt->led_publisher_name);
|
||||
|
||||
if (edi->edi_event_data_size) {
|
||||
edi->edi_event_data = malloc(edi->edi_event_data_size);
|
||||
if (!edi->edi_event_data) {
|
||||
@ -537,23 +538,24 @@ static SaAisErrorT make_event(SaEvtEventHandleT *event_handle,
|
||||
}
|
||||
memset(edi->edi_patterns.patterns, 0, sizeof(SaEvtEventPatternT) *
|
||||
edi->edi_patterns.patternsNumber);
|
||||
pat = (SaEvtEventPatternT *)evt->led_body;
|
||||
str = evt->led_body + sizeof(SaEvtEventPatternT) *
|
||||
pat = (mar_evt_event_pattern_t *)evt->led_body;
|
||||
str = evt->led_body + sizeof(mar_evt_event_pattern_t) *
|
||||
edi->edi_patterns.patternsNumber;
|
||||
for (i = 0; i < evt->led_patterns_number; i++) {
|
||||
edi->edi_patterns.patterns[i].patternSize = pat->patternSize;
|
||||
edi->edi_patterns.patterns[i].allocatedSize = pat->patternSize;
|
||||
edi->edi_patterns.patterns[i].pattern = malloc(pat->patternSize);
|
||||
edi->edi_patterns.patterns[i].patternSize = pat->pattern_size;
|
||||
edi->edi_patterns.patterns[i].allocatedSize = pat->pattern_size;
|
||||
edi->edi_patterns.patterns[i].pattern = malloc(pat->pattern_size);
|
||||
if (!edi->edi_patterns.patterns[i].pattern) {
|
||||
DPRINT (("make_event: couldn't alloc %llu bytes\n",
|
||||
(unsigned long long)pat->patternSize));
|
||||
(unsigned long long)pat->pattern_size));
|
||||
saHandleDestroy(&event_handle_db, *event_handle);
|
||||
error = SA_AIS_ERR_LIBRARY;
|
||||
goto make_evt_done_put2;
|
||||
}
|
||||
// TODO marshall pattern
|
||||
memcpy(edi->edi_patterns.patterns[i].pattern,
|
||||
str, pat->patternSize);
|
||||
str += pat->patternSize;
|
||||
str, pat->pattern_size);
|
||||
str += pat->pattern_size;
|
||||
pat++;
|
||||
}
|
||||
|
||||
@ -984,8 +986,7 @@ saEvtChannelOpen(
|
||||
req.ico_c_handle = *channelHandle;
|
||||
req.ico_timeout = timeout;
|
||||
req.ico_open_flag = channelOpenFlags;
|
||||
req.ico_channel_name = *channelName;
|
||||
|
||||
marshall_to_mar_name_t (&req.ico_channel_name, (SaNameT *)channelName);
|
||||
|
||||
iov.iov_base = &req;
|
||||
iov.iov_len = sizeof(req);
|
||||
@ -1211,7 +1212,7 @@ saEvtChannelOpenAsync(SaEvtHandleT evtHandle,
|
||||
req.ico_timeout = 0;
|
||||
req.ico_invocation = invocation;
|
||||
req.ico_open_flag = channelOpenFlags;
|
||||
req.ico_channel_name = *channelName;
|
||||
marshall_to_mar_name_t (&req.ico_channel_name, (SaNameT *)channelName);
|
||||
iov.iov_base = &req;
|
||||
iov.iov_len = sizeof(req);
|
||||
|
||||
@ -1312,7 +1313,7 @@ saEvtChannelUnlink(
|
||||
*/
|
||||
req.iuc_head.size = sizeof(req);
|
||||
req.iuc_head.id = MESSAGE_REQ_EVT_UNLINK_CHANNEL;
|
||||
req.iuc_channel_name = *channelName;
|
||||
marshall_to_mar_name_t (&req.iuc_channel_name, (SaNameT *)channelName);
|
||||
iov.iov_base = &req;
|
||||
iov.iov_len = sizeof(req);
|
||||
|
||||
@ -1785,9 +1786,9 @@ data_get_done:
|
||||
static size_t patt_size(const SaEvtEventPatternArrayT *patterns)
|
||||
{
|
||||
int i;
|
||||
size_t size = sizeof(SaEvtEventPatternArrayT);
|
||||
size_t size = sizeof(mar_evt_event_pattern_array_t);
|
||||
for (i = 0; i < patterns->patternsNumber; i++) {
|
||||
size += sizeof(SaEvtEventPatternT);
|
||||
size += sizeof(mar_evt_event_pattern_t);
|
||||
size += patterns->patterns[i].patternSize;
|
||||
}
|
||||
return size;
|
||||
@ -1796,11 +1797,12 @@ static size_t patt_size(const SaEvtEventPatternArrayT *patterns)
|
||||
/*
|
||||
* copy patterns to a form for sending to the server
|
||||
*/
|
||||
static uint32_t aispatt_to_evt_patt(const SaEvtEventPatternArrayT *patterns,
|
||||
static uint32_t aispatt_to_evt_patt(
|
||||
const SaEvtEventPatternArrayT *patterns,
|
||||
void *data)
|
||||
{
|
||||
int i;
|
||||
SaEvtEventPatternT *pats = data;
|
||||
mar_evt_event_pattern_t *pats = data;
|
||||
SaUint8T *str = (SaUint8T *)pats +
|
||||
(patterns->patternsNumber * sizeof(*pats));
|
||||
|
||||
@ -1809,9 +1811,10 @@ static uint32_t aispatt_to_evt_patt(const SaEvtEventPatternArrayT *patterns,
|
||||
* will be later converted back into pointers when received as events.
|
||||
*/
|
||||
for (i = 0; i < patterns->patternsNumber; i++) {
|
||||
// TODO marshall?
|
||||
memcpy(str, patterns->patterns[i].pattern,
|
||||
patterns->patterns[i].patternSize);
|
||||
pats->patternSize = patterns->patterns[i].patternSize;
|
||||
pats->pattern_size = patterns->patterns[i].patternSize;
|
||||
pats->pattern = (SaUint8T *)((void *)str - data);
|
||||
str += patterns->patterns[i].patternSize;
|
||||
pats++;
|
||||
@ -1825,10 +1828,10 @@ static uint32_t aispatt_to_evt_patt(const SaEvtEventPatternArrayT *patterns,
|
||||
static size_t filt_size(const SaEvtEventFilterArrayT *filters)
|
||||
{
|
||||
int i;
|
||||
size_t size = sizeof(SaEvtEventFilterArrayT);
|
||||
size_t size = sizeof(mar_evt_event_filter_array_t);
|
||||
|
||||
for (i = 0; i < filters->filtersNumber; i++) {
|
||||
size += sizeof(SaEvtEventFilterT);
|
||||
size += sizeof(mar_evt_event_filter_t);
|
||||
size += filters->filters[i].filter.patternSize;
|
||||
}
|
||||
return size;
|
||||
@ -1839,12 +1842,13 @@ static size_t filt_size(const SaEvtEventFilterArrayT *filters)
|
||||
* i.e. replace pointers with offsets. The pointers will be reconstituted
|
||||
* by the receiver.
|
||||
*/
|
||||
static uint32_t aisfilt_to_evt_filt(const SaEvtEventFilterArrayT *filters,
|
||||
void *data)
|
||||
static uint32_t aisfilt_to_evt_filt(
|
||||
const SaEvtEventFilterArrayT *filters,
|
||||
void *data)
|
||||
{
|
||||
int i;
|
||||
SaEvtEventFilterArrayT *filta = data;
|
||||
SaEvtEventFilterT *filts = data + sizeof(SaEvtEventFilterArrayT);
|
||||
mar_evt_event_filter_array_t *filtd = data;
|
||||
mar_evt_event_filter_t *filts = data + sizeof(mar_evt_event_filter_array_t);
|
||||
SaUint8T *str = (SaUint8T *)filts +
|
||||
(filters->filtersNumber * sizeof(*filts));
|
||||
|
||||
@ -1852,13 +1856,14 @@ static uint32_t aisfilt_to_evt_filt(const SaEvtEventFilterArrayT *filters,
|
||||
* Pointers are replaced with offsets into the data array. These
|
||||
* will be later converted back into pointers by the evt server.
|
||||
*/
|
||||
filta->filters = (SaEvtEventFilterT *)((void *)filts - data);
|
||||
filta->filtersNumber = filters->filtersNumber;
|
||||
filtd->filters = (mar_evt_event_filter_t *)((void *)filts - data);
|
||||
filtd->filters_number = filters->filtersNumber;
|
||||
|
||||
for (i = 0; i < filters->filtersNumber; i++) {
|
||||
filts->filterType = filters->filters[i].filterType;
|
||||
filts->filter.patternSize =
|
||||
filts->filter_type = filters->filters[i].filterType;
|
||||
filts->filter.pattern_size =
|
||||
filters->filters[i].filter.patternSize;
|
||||
// TODO marshall pattern
|
||||
memcpy(str,
|
||||
filters->filters[i].filter.pattern,
|
||||
filters->filters[i].filter.patternSize);
|
||||
@ -1985,7 +1990,7 @@ saEvtEventPublish(
|
||||
req->led_retention_time = edi->edi_retention_time;
|
||||
req->led_publish_time = clustTimeNow();
|
||||
req->led_priority = edi->edi_priority;
|
||||
req->led_publisher_name = edi->edi_pub_name;
|
||||
marshall_to_mar_name_t (&req->led_publisher_name, &edi->edi_pub_name);
|
||||
|
||||
iov.iov_base = req;
|
||||
iov.iov_len = req->led_head.size;
|
||||
@ -2068,7 +2073,7 @@ saEvtEventSubscribe(
|
||||
|
||||
/*
|
||||
* Make sure that a deliver callback has been
|
||||
* registered before allowing the subscribe to continue.
|
||||
* registered before allowing the subscribe to continue.
|
||||
*/
|
||||
if (!evti->ei_callback.saEvtEventDeliverCallback) {
|
||||
error = SA_AIS_ERR_INIT;
|
||||
@ -2099,7 +2104,7 @@ saEvtEventSubscribe(
|
||||
* Copy the supplied filters to the request
|
||||
*/
|
||||
req->ics_filter_count = aisfilt_to_evt_filt(filters,
|
||||
req->ics_filter_data);
|
||||
req->ics_filter_data);
|
||||
req->ics_head.id = MESSAGE_REQ_EVT_SUBSCRIBE;
|
||||
req->ics_head.size = sizeof(*req) + sz;
|
||||
req->ics_channel_handle = eci->eci_svr_channel_handle;
|
||||
|
Loading…
Reference in New Issue
Block a user