⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modularize.c

📁 一个用在mips体系结构中的操作系统
💻 C
字号:
/* * Copyright (C) 1996-1998 by the Board of Trustees *    of Leland Stanford Junior University. *  * This file is part of the SimOS distribution.  * See LICENSE file for terms of the license.  * *//*  *  modularize.c * *  This file is supposed to include all the typedefs, macros *  and function headers that allows diskdevice.c to compile *  independently of proteus. * * $Id: modularize.c,v 1.11 1998/02/10 00:36:45 bosch Exp $ */#include "modularize.h"#include "heap.h"#include "diskevent.h"#include "simtypes.h"#include "hd.h"/* =======================The Timing Stuff ================================ *//* keep the time struct within this file, i.e. modularize.c */static struct timestruct system_timer;/* returns the current time */TICS GetTime(void){  return (system_timer.currenttime);}/* returns the greater of timea and timeb;   if (timea == timeb) return timeb */TICS max(TICS timea, TICS timeb){  return ((timea > timeb) ? timea : timeb);}/* returns the lesser of timea and timeb;   if (timea == timeb) return timeb */TICS min(TICS timea, TICS timeb){  return ((timea < timeb) ? timea : timeb);}/* wait till system time is TICS, process the   events if they happen before TICS */void WaitTime(TICS donetime){  extern Heap heap;  HeapKey Hpkey;  HeapData Hpdat;  FuncPtr handler;    while (TopHeap(heap, &Hpdat, &Hpkey) != FALSE && (Hpkey < donetime))    {      INVARIANT2((RemHeap(heap, &Hpdat, &Hpkey)),"WaitTime: heap empty!\n");      system_timer.currenttime = Hpkey;      handler = DDhandlers[Hpdat->req_code].handler;            if (Hpdat->req_code != NOP)	(*handler) (Hpdat->disk, Hpkey);      free(Hpdat);		/* free up space allocated during AddHeap() */    }  system_timer.currenttime = donetime;}void WaitDuration(TICS duration){  WaitTime(system_timer.currenttime + duration);}TICS InitTime(void){  system_timer.currenttime = 0;  DDEventInit();		/* initialize the event heap */  return(system_timer.currenttime);}/* void thread_sleep(int tid) */void thread_suspend(int tid){  extern int wakeup;	        /* declared in modularize.h */  extern Heap heap;  HeapKey Hpkey;  HeapData Hpdat;  FuncPtr handler;  wakeup = -1;  do    {      INVARIANT2((RemHeap(heap, &Hpdat, &Hpkey) != FALSE), 		 "thread_suspend: can't remove from empty heap\n");      system_timer.currenttime = Hpkey;      handler = DDhandlers[Hpdat->req_code].handler;      if (Hpdat->req_code != NOP)	(*handler) (Hpdat->disk, Hpkey);      else	{DEBUG0 printf("thread_suspend: removing NOP\n");}      free(Hpdat);		/* free up space allocated during AddHeap() */    }  while (wakeup != tid);}#ifndef SOLO#define TEMP_MAX_DISKS 16static struct {    int tid;    void (*routine)(void *);    void *arg;} waitingThread[SIM_MAX_DISKS]; void thread_suspend_continue(int tid, void (*routine)(void *), void *arg){#ifdef SOLO   int disk = (int) arg;#else   int disk = PTR_TO_UINT64(arg);#endif    waitingThread[disk].tid = tid;    waitingThread[disk].routine = routine;    waitingThread[disk].arg = arg;}void thread_wakeup(int disk,int tid){    if (tid == waitingThread[disk].tid) {	waitingThread[disk].routine(waitingThread[disk].arg);    }    waitingThread[disk].tid = -1;         }    #endif /* void thread_wakeup(int tid) void DDEventWakeup(int stid, TICS when){  extern int wakeup;	        declared in modularize.h   wakeup = stid;}*//* ======================================================================== *//*  time_print * *  Function to return the system time in a string. */char* time_print(TICS t) {  /* List of static buffers */  static char buffers[100][21]; /* 20 digits holds a 64-bit number */  static int next_buffer = 0;  char* buffer;    buffer = buffers[next_buffer];  next_buffer = (next_buffer + 1) % 100;  #ifdef LONG_LONG_TIME  /* Print out seven digits at a time */  {    unsigned long part1, part2, part3;            part3 = (unsigned long) (t % 10000000);    t = t / 10000000;        part2 = (unsigned long) (t % 10000000);    t = t / 10000000;        part1 = (unsigned long) t;        if (part1 > 0) {      sprintf(buffer, "%lu%07lu%07lu", part1, part2, part3);    }    else if (part2 > 0) {      sprintf(buffer, "%lu%07lu", part2, part3);    }    else {      sprintf(buffer, "%lu", part3);    }  }#else  sprintf(buffer, "%lu", t);#endif    return buffer;}/* timep_print(Time *t) *    gdb can't pass uint64s correctly, but it can pass  * *pointers* correctly.  So this is a front end to time_print() * for debugging. */char *timep_print(TICS *t) {  return(time_print(*t)); }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -