enum { MUTEX_UNLOCKED, MUTEX_LOCKED };
struct Mutex {
- int state;
- struct Kernel_Thread* owner;
- struct Thread_Queue waitQueue;
+ int state;
+ struct Kernel_Thread* owner;
+ struct Thread_Queue waitQueue;
};
#define MUTEX_INITIALIZER { MUTEX_UNLOCKED, 0, THREAD_QUEUE_INITIALIZER }
void Mutex_Init(struct Mutex* mutex);
void Mutex_Lock(struct Mutex* mutex);
void Mutex_Unlock(struct Mutex* mutex);
+void Mutex_Destroy(struct Mutex *mutex); //added by Lei, do some cleaning work?
void Cond_Init(struct Condition* cond);
void Cond_Wait(struct Condition* cond, struct Mutex* mutex);
+ int Cond_Wait_Timeout(struct Condition * cond, struct Mutex * mutex, uint_t ms);
void Cond_Signal(struct Condition* cond);
void Cond_Broadcast(struct Condition* cond);
+void Cond_Destroy(struct Condition *cond); //added by Lei
#define IS_HELD(mutex) \
((mutex)->state == MUTEX_LOCKED && (mutex)->owner == g_currentThread)
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);
int Get_Remaining_Timer_Ticks(int id);
int Cancel_Timer(int id);
-
void Micro_Delay(int us);
#endif /* GEEKOS_TIMER_H */
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++;
Spin(numSpins);
}
+
+
+