
#ifndef RTEVENT_H
#define RTEVENT_H

/******************************************************************************/
/******************************************************************************/
/*****************     Copyright 2004, 2005 Chronolytics Inc.   ***************/
/*****************     All Rights Reserved                      ***************/
/******************************************************************************/
/******************************************************************************/

#include <RTMagic.h>
#include <RTClock.h>
#include <RTCommon.h>
#include <RTRefCnt_Object.h>
#include <pthread.h>

static volatile const char __attribute__ ((unused)) rcsid_RTEVENT_H[] = "$Id: RTEvent.h,v 1.14 2005/07/13 11:13:08 dave Exp $";

typedef void * RTEvent;  /* opaque external */
typedef void * RTEventQueue;  /* opaque external */
typedef void (*RTEvent_fp)(void *this, void *argp);

#define RTEventQueue_MAGIC    MAGIC("RTEQ")
#define RTEvent_MAGIC         MAGIC("Evnt")


  /* called if validate fails (uncommon case) */
int RTEventQueue_Validate_Fails(RTEventQueue evq);
int RTEvent_Validate_Fails(RTEvent *evp);

/*
** See RTMagic.h for voodoo
*/
INLINE_VALIDATE(RTEvent, RTEvent_Validate_Fails);
INLINE_VALIDATE(RTEventQueue, RTEventQueue_Validate_Fails);

RTEventQueue RTEvent_EventQueue_Constructor(); /* opaque contructor */
void RTEventQueue_Destroy(RTEventQueue evq);  /* opaque destructor */

RTEvent *RTEvent_Wait_For_Event(RTEventQueue evq);

void RTEventQueue_Close(RTEventQueue evq);

unsigned long RTEventQueue_EventCount(RTEventQueue evq);

void RTEvent_Enqueue_Stamped(RTEventQueue evq, RTEvent *evp, RTClockCount timestamp);

void RTEvent_Enqueue_RTEvent(RTEventQueue evq, RTEvent *evp);

RTEvent *RTEvent_Constructor(const char *name, RTEvent_fp fp, void *this, void *arg);
RTEvent *RTEvent_Clone(RTEvent *evp); 
void RTEvent_Free(RTEvent *evp); 

char *RTEvent_Name_Acquire(RTEvent *evp);  /* acquire RefCnt reference */
void RTEvent_Name_Release(char *event_name);  /* release RefCnt reference */

const char *RTEventQueue_CurrentEventName(RTEventQueue evq);  /* get last event pulled from event queue */

void RTEvent_Set_Arg(RTEvent *evp, void *argp);  /* allow callers to change arg content */

void RTEvent_Consume(RTEvent *evp);  /* invoke and destroy */

RTClockCount RTEvent_Enqueued(RTEvent *evp); /* when were you activated */
RTClockCount RTEvent_Stamped(RTEvent *evp); /* when were you time stamped */

#endif /*  RTEVENT_H */

