00001 /* 00002 * eventq.h - event queue manager interfaces 00003 * 00004 * This file is a part of the SimpleScalar tool suite written by 00005 * Todd M. Austin as a part of the Multiscalar Research Project. 00006 * 00007 * The tool suite is currently maintained by Doug Burger and Todd M. Austin. 00008 * 00009 * Copyright (C) 1994, 1995, 1996, 1997, 1998 by Todd M. Austin 00010 * 00011 * This source file is distributed "as is" in the hope that it will be 00012 * useful. The tool set comes with no warranty, and no author or 00013 * distributor accepts any responsibility for the consequences of its 00014 * use. 00015 * 00016 * Everyone is granted permission to copy, modify and redistribute 00017 * this tool set under the following conditions: 00018 * 00019 * This source code is distributed for non-commercial use only. 00020 * Please contact the maintainer for restrictions applying to 00021 * commercial use. 00022 * 00023 * Permission is granted to anyone to make or distribute copies 00024 * of this source code, either as received or modified, in any 00025 * medium, provided that all copyright notices, permission and 00026 * nonwarranty notices are preserved, and that the distributor 00027 * grants the recipient permission for further redistribution as 00028 * permitted by this document. 00029 * 00030 * Permission is granted to distribute this file in compiled 00031 * or executable form under the same conditions that apply for 00032 * source code, provided that either: 00033 * 00034 * A. it is accompanied by the corresponding machine-readable 00035 * source code, 00036 * B. it is accompanied by a written offer, with no time limit, 00037 * to give anyone a machine-readable copy of the corresponding 00038 * source code in return for reimbursement of the cost of 00039 * distribution. This written offer must permit verbatim 00040 * duplication by anyone, or 00041 * C. it is distributed by someone who received only the 00042 * executable form, and is accompanied by a copy of the 00043 * written offer of source code that they received concurrently. 00044 * 00045 * In other words, you are welcome to use, share and improve this 00046 * source file. You are forbidden to forbid anyone else to use, share 00047 * and improve what you give them. 00048 * 00049 * INTERNET: dburger@cs.wisc.edu 00050 * US Mail: 1210 W. Dayton Street, Madison, WI 53706 00051 * 00052 * $Id: eventq.h,v 1.1.1.1 2003/09/18 00:57:54 panalyzer Exp $ 00053 * 00054 * $Log: eventq.h,v $ 00055 * Revision 1.1.1.1 2003/09/18 00:57:54 panalyzer 00056 * 00057 * 00058 * Revision 1.1.1.1 2003/09/18 00:18:43 panalyzer 00059 * 00060 * 00061 * Revision 1.1.1.1 2003/09/16 18:48:14 gdm 00062 * 00063 * 00064 * Revision 1.1.1.1 2000/11/29 14:53:54 cu-cs 00065 * Grand unification of arm sources. 00066 * 00067 * 00068 * Revision 1.1.1.1 2000/05/26 15:18:57 taustin 00069 * SimpleScalar Tool Set 00070 * 00071 * 00072 * Revision 1.4 1998/08/27 08:28:14 taustin 00073 * implemented host interface description in host.h 00074 * added target interface support 00075 * 00076 * Revision 1.3 1997/03/11 01:12:30 taustin 00077 * updated copyright 00078 * long/int tweaks made for ALPHA target support 00079 * 00080 * Revision 1.1 1996/12/05 18:50:23 taustin 00081 * Initial revision 00082 * 00083 * 00084 */ 00085 00086 #ifndef EVENTQ_H 00087 #define EVENTQ_H 00088 00089 #include <stdio.h> 00090 00091 #include "host.h" 00092 #include "misc.h" 00093 #include "bitmap.h" 00094 00095 /* This module implements a time ordered event queue. Users insert 00096 * 00097 */ 00098 00099 /* event actions */ 00100 enum eventq_action { 00101 EventSetBit, /* set a bit: int *, bit # */ 00102 EventClearBit, /* clear a bit: int *, bit # */ 00103 EventSetFlag, /* set a flag: int *, value */ 00104 EventAddOp, /* add a value to a summand */ 00105 EventCallback, /* call event handler: fn * */ 00106 }; 00107 00108 /* ID zero (0) is unused */ 00109 typedef unsigned int EVENTQ_ID_TYPE; 00110 00111 /* event descriptor */ 00112 struct eventq_desc { 00113 struct eventq_desc *next; /* next event in the sorted list */ 00114 SS_TIME_TYPE when; /* time to schedule write back event */ 00115 EVENTQ_ID_TYPE id; /* unique event ID */ 00116 enum eventq_action action; /* action on event occurrance */ 00117 union eventq_data { 00118 struct { 00119 BITMAP_ENT_TYPE *bmap; /* bitmap to access */ 00120 int sz; /* bitmap size */ 00121 int bitnum; /* bit to set */ 00122 } bit; 00123 struct { 00124 int *pflag; /* flag to set */ 00125 int value; 00126 } flag; 00127 struct { 00128 int *summand; /* value to add to */ 00129 int addend; /* amount to add */ 00130 } addop; 00131 struct { 00132 void (*fn)(SS_TIME_TYPE time, int arg); /* function to call */ 00133 int arg; /* argument to pass */ 00134 } callback; 00135 } data; 00136 }; 00137 00138 /* initialize the event queue module, MAX_EVENT is the most events allowed 00139 pending, pass a zero if there is no limit */ 00140 void eventq_init(int max_events); 00141 00142 /* schedule an action that occurs at WHEN, action is visible at WHEN, 00143 and invisible before WHEN */ 00144 EVENTQ_ID_TYPE eventq_queue_setbit(SS_TIME_TYPE when, 00145 BITMAP_ENT_TYPE *bmap, int sz, int bitnum); 00146 EVENTQ_ID_TYPE eventq_queue_clearbit(SS_TIME_TYPE when, BITMAP_ENT_TYPE *bmap, 00147 int sz, int bitnum); 00148 EVENTQ_ID_TYPE eventq_queue_setflag(SS_TIME_TYPE when, 00149 int *pflag, int value); 00150 EVENTQ_ID_TYPE eventq_queue_addop(SS_TIME_TYPE when, 00151 int *summand, int addend); 00152 EVENTQ_ID_TYPE eventq_queue_callback(SS_TIME_TYPE when, 00153 void (*fn)(SS_TIME_TYPE time, int arg), 00154 int arg); 00155 00156 /* execute an event immediately, returns non-zero if the event was 00157 located an deleted */ 00158 int eventq_execute(EVENTQ_ID_TYPE id); 00159 00160 /* remove an event from the eventq, action is never performed, returns 00161 non-zero if the event was located an deleted */ 00162 int eventq_remove(EVENTQ_ID_TYPE id); 00163 00164 /* service all events in order of occurrance until and at NOW */ 00165 void eventq_service_events(SS_TIME_TYPE now); 00166 00167 void eventq_dump(FILE *stream); 00168 00169 #endif /* EVENT_H */