mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-27 18:03:04 +01:00
190 lines
5.6 KiB
C
190 lines
5.6 KiB
C
/*
|
|
* PROGRAM: JRD Access Method
|
|
* MODULE: event.h
|
|
* DESCRIPTION: Event manager definitions
|
|
*
|
|
* The contents of this file are subject to the Interbase Public
|
|
* License Version 1.0 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy
|
|
* of the License at http://www.Inprise.com/IPL.html
|
|
*
|
|
* Software distributed under the License is distributed on an
|
|
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
|
|
* or implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code was created by Inprise Corporation
|
|
* and its predecessors. Portions created by Inprise Corporation are
|
|
* Copyright (C) Inprise Corporation.
|
|
*
|
|
* All Rights Reserved.
|
|
* Contributor(s): ______________________________________.
|
|
*
|
|
* 23-Feb-2002 Dmitry Yemanov - Events wildcarding
|
|
*
|
|
*
|
|
* 2002-02-23 Sean Leyne - Code Cleanup, removed old Win3.1 port (Windows_Only)
|
|
*
|
|
*/
|
|
|
|
#ifndef _JRD_EVENT_H_
|
|
#define _JRD_EVENT_H_
|
|
|
|
#include "../jrd/isc.h"
|
|
#include "../jrd/file_params.h"
|
|
|
|
#define PTR SLONG
|
|
#define BASE ((UCHAR *) EVENT_header)
|
|
#define REL_PTR(item) ((UCHAR *) item - BASE)
|
|
#define ABS_PTR(item) (BASE + item)
|
|
#define ACQUIRE acquire()
|
|
#define RELEASE release()
|
|
|
|
#define QUE_INIT(que) {que.srq_forward = que.srq_backward = REL_PTR (&que);}
|
|
#define QUE_EMPTY(que) (que.srq_forward == REL_PTR (&que))
|
|
#define QUE_NEXT(que) ABS_PTR (que.srq_forward)
|
|
#define QUE_PREV(que) ABS_PTR (que.srq_backward)
|
|
|
|
#define QUE_LOOP(header,que) for (que = (SRQ*) QUE_NEXT (header);\
|
|
que != &header; que = (SRQ*) QUE_NEXT ((*que)))
|
|
|
|
|
|
#define SIZE_SHIFT 2
|
|
#define FAST_ALLOC 16
|
|
|
|
/* Self-relative que block. Offsets are from the block itself. */
|
|
|
|
typedef struct srq {
|
|
PTR srq_forward; /* Forward offset */
|
|
PTR srq_backward; /* Backward offset */
|
|
} SRQ;
|
|
|
|
/* Global section header */
|
|
|
|
#define EVH_HASH_SIZE 7
|
|
|
|
typedef struct evh {
|
|
SLONG evh_length; /* Current length of global section */
|
|
UCHAR evh_version; /* Version number of global section */
|
|
SRQ evh_events; /* Known processes */
|
|
SRQ evh_processes; /* Known processes */
|
|
PTR evh_free; /* Free blocks */
|
|
PTR evh_current_process; /* Current process, if any */
|
|
MTX_T evh_mutex[1]; /* Mutex controlling access */
|
|
SLONG evh_request_id; /* Next request id */
|
|
PTR evh_hash_table[EVH_HASH_SIZE];
|
|
} *EVH;
|
|
|
|
/* Common block header */
|
|
|
|
#define type_hdr 1 /* Event header */
|
|
#define type_frb 2 /* Free block */
|
|
#define type_prb 3 /* Process block */
|
|
#define type_rint 4 /* Request interest block */
|
|
#define type_req 5 /* Request block */
|
|
#define type_evnt 6 /* Event */
|
|
#define type_ses 7 /* Session */
|
|
#define type_ape 8 /* Actually posted event block */
|
|
#define type_max 9
|
|
|
|
typedef struct hdr
|
|
{
|
|
SLONG hdr_length; /* Length of block */
|
|
UCHAR hdr_type; /* Type of block */
|
|
} HDR;
|
|
|
|
/* Free blocks */
|
|
|
|
typedef struct frb
|
|
{
|
|
HDR frb_header;
|
|
SLONG frb_next; /* Next block */
|
|
} *FRB;
|
|
|
|
/* Process blocks */
|
|
|
|
typedef struct prb
|
|
{
|
|
HDR prb_header;
|
|
SRQ prb_processes; /* Process que owned by header */
|
|
SRQ prb_sessions; /* Sessions within process */
|
|
SLONG prb_process_id; /* Process id */
|
|
SLONG prb_process_uid[2]; /* Process UID (apollo) */
|
|
EVENT_T prb_event[1]; /* Event on which to wait */
|
|
USHORT prb_flags;
|
|
} *PRB;
|
|
|
|
#define PRB_wakeup 1 /* Schedule a wakeup for process */
|
|
#define PRB_pending 2 /* Wakeup has been requested, and is dangling */
|
|
#define PRB_remap 4 /* need to remap shared memory */
|
|
#define PRB_remap_over 8 /* remap is over */
|
|
#define PRB_exiting 16 /* Process is exiting */
|
|
|
|
/* Session block */
|
|
|
|
typedef struct ses {
|
|
HDR ses_header;
|
|
SRQ ses_sessions; /* Sessions within process */
|
|
SRQ ses_requests; /* Outstanding requests */
|
|
PTR ses_interests; /* Historical interests */
|
|
PTR ses_process; /* Parent process */
|
|
#ifdef MULTI_THREAD
|
|
USHORT ses_flags;
|
|
#endif
|
|
} *SES;
|
|
|
|
#define SES_delivering 1 /* Watcher thread is delivering an event */
|
|
|
|
/* Event block */
|
|
|
|
typedef struct evnt {
|
|
HDR evnt_header;
|
|
SRQ evnt_events; /* System event que (owned by header) */
|
|
SRQ evnt_interests; /* Que of request interests in event */
|
|
PTR evnt_hash_collision; /* Hash table collision pointer */
|
|
PTR evnt_parent; /* Major event name */
|
|
SLONG evnt_count; /* Current event count */
|
|
USHORT evnt_length; /* Length of event name */
|
|
TEXT evnt_name[1]; /* Event name */
|
|
} *EVNT;
|
|
|
|
/* Request block */
|
|
|
|
typedef struct jrd_req {
|
|
HDR req_header;
|
|
SRQ req_requests; /* Request que owned by session block */
|
|
PTR req_process; /* Parent process block */
|
|
PTR req_session; /* Parent session block */
|
|
PTR req_interests; /* First interest in request */
|
|
void (*req_ast) (); /* Asynchronous routine */
|
|
void *req_ast_arg; /* Argument for ast */
|
|
SLONG req_request_id; /* Request id, dummy */
|
|
} *JRD_REQ;
|
|
|
|
/* Request interest block */
|
|
|
|
typedef struct rint {
|
|
HDR rint_header;
|
|
SRQ rint_interests; /* Que owned by event */
|
|
PTR rint_event; /* Event of interest */
|
|
PTR rint_request; /* Request of interest */
|
|
PTR rint_next; /* Next interest of request */
|
|
SLONG rint_count; /* Threshhold count */
|
|
#ifdef EVENTS_WILDCARDING
|
|
PTR rint_apes; /* List of actually posted events */
|
|
#endif /* EVENTS_WILDCARDING */
|
|
} *RINT;
|
|
|
|
/* Actually posted event block */
|
|
|
|
#ifdef EVENTS_WILDCARDING
|
|
typedef struct ape {
|
|
PTR ape_next; /* Next actually posted event block */
|
|
USHORT ape_count; /* Current actually posted event count */
|
|
USHORT ape_length; /* Length of actually posted event name */
|
|
TEXT ape_name[1]; /* Actually posted event name */
|
|
} *APE;
|
|
#endif /* EVENTS_WILDCARDING */
|
|
|
|
#endif /* _JRD_EVENT_H_ */
|