extern volatile ulong_t g_numTicks;
-typedef void (*timerCallback)(int);
+typedef void (*timerCallback)(int, void*);
void Init_Timer(void);
typedef struct {
- int ticks; /* timer code decrements this */
- int id; /* unqiue id for this timer even */
- timerCallback callBack; /* Queue to wakeup on timer expire */
- int origTicks;
+ int ticks; /* timer code decrements this */
+ int id; /* unqiue id for this timer even */
+ timerCallback callBack; /* Queue to wakeup on timer expire */
+ void * cb_arg; /* Argument to add to callback */
+ int origTicks;
+
} timerEvent;
-int Start_Timer_Secs(int seconds, timerCallback cb);
-int Start_Timer_MSecs(int msecs, timerCallback cb);
-int Start_Timer(int ticks, timerCallback);
+int Start_Timer_Secs(int seconds, timerCallback cb, void * arg);
+int Start_Timer_MSecs(int msecs, timerCallback cb, void * arg);
+int Start_Timer(int ticks, timerCallback, void * arg);
double Get_Remaining_Timer_Secs(int id);
int Get_Remaining_Timer_MSecs(int id);
static int Packet_Received(struct NE2K_Packet_Info* info, uchar_t *pkt);
-static void periodic_caller(int timer_id);
+static void periodic_caller(int timer_id, void * arg);
void init_socket_layer() {
int i = 0;
Init_Ne2k(&Packet_Received);
iflag = Begin_Int_Atomic();
- Start_Timer(2, periodic_caller);
+ Start_Timer(2, periodic_caller, NULL);
End_Int_Atomic(iflag);
}
-static void periodic_caller(int timer_id) {
+static void periodic_caller(int timer_id, void * arg) {
int i;
//handle the periodic calls of uIP
if (pendingTimerEvents[i].ticks == 0) {
if (timerDebug) Print("timer: event %d expired (%d ticks)\n",
pendingTimerEvents[i].id, pendingTimerEvents[i].origTicks);
- (pendingTimerEvents[i].callBack)(pendingTimerEvents[i].id);
+ (pendingTimerEvents[i].callBack)(pendingTimerEvents[i].id, pendingTimerEvents[i].cb_arg);
pendingTimerEvents[i].ticks = pendingTimerEvents[i].origTicks;
} else {
pendingTimerEvents[i].ticks--;
}
-int Start_Timer_Secs(int seconds, timerCallback cb) {
- return Start_Timer(seconds * HZ, cb);
+int Start_Timer_Secs(int seconds, timerCallback cb, void * arg) {
+ return Start_Timer(seconds * HZ, cb, arg);
}
-int Start_Timer_MSecs(int msecs, timerCallback cb) {
+int Start_Timer_MSecs(int msecs, timerCallback cb, void * arg) {
msecs += 10 - (msecs % 10);
- return Start_Timer(msecs * (HZ / 1000), cb);
+ return Start_Timer(msecs * (HZ / 1000), cb, arg);
}
-int Start_Timer(int ticks, timerCallback cb)
+int Start_Timer(int ticks, timerCallback cb, void * arg)
{
int ret;
ret = nextEventID++;
pendingTimerEvents[timeEventCount].id = ret;
pendingTimerEvents[timeEventCount].callBack = cb;
+ pendingTimerEvents[timeEventCount].cb_arg = arg;
pendingTimerEvents[timeEventCount].ticks = ticks;
pendingTimerEvents[timeEventCount].origTicks = ticks;
timeEventCount++;