Guest User

Untitled

a guest
Apr 4th, 2015
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.84 KB | None | 0 0
  1. #include <dos.h>
  2. #include <stdlib.h>
  3. #include <fstream.h>
  4. #include <stdio.h>
  5. #include <mem.h>
  6. #include <conio.h>
  7.  
  8. #define PHIL_COUNT 6
  9. #define ITERATION_NUMBER 10
  10.  
  11. #define TRUE 1
  12. #define FALSE 0
  13.  
  14. #define TIMER_INTR 0x1C
  15. #define TIMER_HANDLER_ON setvect(TIMER_INTR, timerHandler)
  16. #define TIMER_HANDLER_OFF setvect(TIMER_INTR, oldTimerHandler)
  17.  
  18. #define TIME 100
  19.  
  20. #define THINK 0
  21. #define WAIT  1
  22. #define EAT   2
  23.  
  24. #define FORK_FREE -1
  25.  
  26. #define FORKS_FREE(x) (*(forksState[x].left_fork) == FORK_FREE) && (*(forksState[x].right_fork) == FORK_FREE)
  27. #define TAKE_FORKS(x) *(forksState[x].left_fork) = x; *(forksState[x].right_fork) = x
  28. #define PUT_FORKS(x) *(forksState[x].left_fork) = FORK_FREE; *(forksState[x].right_fork) = FORK_FREE
  29.  
  30. #define LOGD(x, y) printf("%d %d\n", x, y); log << x << " " << y << endl
  31.  
  32. int currentProcess = 0;
  33.  
  34. int iterationCount = 0;
  35.  
  36. int forks[PHIL_COUNT];
  37. int philosophers[PHIL_COUNT];
  38.  
  39. ofstream log("log.txt");
  40.  
  41. struct Context
  42. {
  43.     unsigned int rax, rbx, rcx, rdx; // 0  2  4  6
  44.     unsigned int rsi, rdi, rbp, rsp; // 8 10 12 14
  45.     unsigned int rcs, rds, res, rss; //16 18 20 22
  46.     unsigned int rip, rflags, a, b;  //24 26 28 30
  47. } processContextArray[PHIL_COUNT];
  48.  
  49. unsigned int processContextArrayOffset;
  50.  
  51. struct ForksState
  52. {
  53.    int* left_fork;
  54.    int* right_fork;
  55. } forksState[PHIL_COUNT];
  56.  
  57. void interrupt (far* oldTimerHandler) (...);
  58.  
  59. void printState() {
  60.     log << "Philosophers : ";
  61.     for (int i = 0; i < PHIL_COUNT; i++)
  62.     {
  63.         switch(philosophers[i])
  64.         {
  65.             case THINK: log << "THINKS ";
  66.                 break;
  67.             case WAIT: log << "WAITS ";
  68.                 break;
  69.             case EAT: log << "EATS ";
  70.                 break;
  71.         }
  72.     }
  73.  
  74.     log << endl << "Forks state  : ";
  75.     for (int j = 0; j < PHIL_COUNT; j++)
  76.     {
  77.         char fork_state;
  78.         if (forks[j] == FORK_FREE) log << "FREE ";
  79.         else log << "BUSY ";
  80.     }
  81.     log << endl << "-----------------" << endl;
  82. }
  83.  
  84. void interrupt timerHandler(...)
  85. {
  86.     printState();
  87.     asm {
  88.         mov  si, [currentProcess];
  89.         mov  cl, 5
  90.         shl  si, cl
  91.         mov  ax, [processContextArrayOffset]
  92.         add  si, ax
  93.         pop  ax    
  94.         mov  [si+12], ax
  95.         pop  ax
  96.         mov  [si+10], ax
  97.         pop  ax
  98.         mov  [si+ 8], ax
  99.         pop  ax
  100.         mov  [si+18], ax
  101.         pop  ax
  102.         mov  [si+20], ax
  103.         pop  ax
  104.         mov  [si+ 6], ax
  105.         pop  ax
  106.         mov  [si+ 4], ax
  107.         pop  ax
  108.         mov  [si+ 2], ax
  109.         pop  ax
  110.         mov  [si+ 0], ax
  111.         pop  ax
  112.         mov  [si+24], ax
  113.         pop  ax
  114.         mov  [si+16], ax
  115.         pop  ax
  116.         mov  [si+26], ax
  117.         mov  ax, sp
  118.         mov  [si+14], ax
  119.         mov  ax, ss
  120.         mov  [si+22], ax
  121.     }
  122.    
  123.     currentProcess++;
  124.     if(currentProcess >= PHIL_COUNT) currentProcess = 0;
  125.    
  126.     asm {
  127.         mov  [currentProcess], ax
  128.         mov  si, ax
  129.         mov  cl, 5
  130.         shl  si, cl
  131.         mov  ax, [processContextArrayOffset]
  132.         add  si, ax      
  133.         mov  ax, [si+22]
  134.         mov  ss, ax
  135.         mov  ax, [si+14]
  136.         mov  sp, ax
  137.         mov  ax, [si+26]
  138.         push ax
  139.         mov  ax, [si+16]
  140.         push ax
  141.         mov  ax, [si+24]
  142.         push ax
  143.         mov  ax, [si+ 0]
  144.         push ax
  145.         mov  ax, [si+ 2]
  146.         push ax
  147.         mov  ax, [si+ 4]
  148.         push ax
  149.         mov  ax, [si+ 6]
  150.         push ax
  151.         mov  ax, [si+20]
  152.         push ax
  153.         mov  ax, [si+18]
  154.         push ax
  155.         mov  ax, [si+ 8]
  156.         push ax
  157.         mov  ax, [si+10]
  158.         push ax
  159.         mov  ax, [si+12]
  160.         push ax
  161.     }
  162.     oldTimerHandler();
  163. }
  164.  
  165. void simulatePhilosopher()
  166. {
  167.     while (iterationCount < ITERATION_NUMBER) {
  168.         delay(random(TIME));
  169.         philosophers[currentProcess] = WAIT;
  170.  
  171.         int forksTaken = FALSE;
  172.         while(forksTaken == FALSE)
  173.         {
  174.             delay(random(TIME));
  175.            
  176.             TIMER_HANDLER_OFF;
  177.            
  178.             if (FORKS_FREE(currentProcess))
  179.             {
  180.                 TAKE_FORKS(currentProcess);
  181.                
  182.                 philosophers[currentProcess] = EAT;
  183.                 forksTaken = TRUE;
  184.             }
  185.             TIMER_HANDLER_ON;
  186.         }      
  187.         delay(random(TIME));
  188.        
  189.         TIMER_HANDLER_OFF;
  190.         {
  191.             PUT_FORKS(currentProcess);
  192.             philosophers[currentProcess] = THINK;
  193.             iterationCount++;
  194.         }
  195.         TIMER_HANDLER_ON;
  196.     }
  197. }
  198.  
  199. int main()
  200. {
  201.     randomize();
  202.     unsigned int rd, rc, re, rs, ri, f;
  203.     asm {
  204.         mov  ax, cs
  205.         mov  [rc], ax
  206.         mov  ax, ds
  207.         mov  [rd], ax
  208.         mov  ax, es
  209.         mov  [re], ax
  210.         mov  ax, ss
  211.         mov  [rs], ax
  212.         mov  [ri], offset simulatePhilosopher
  213.         pushf
  214.         pop  ax
  215.         mov  [f], ax
  216.     }
  217.    
  218.     for (int i = 0; i < PHIL_COUNT; i++)
  219.     {
  220.         forks[i] = FORK_FREE;
  221.         philosophers[i] = THINK;
  222.  
  223.         forksState[i].left_fork = &(forks[i]);
  224.         if (i < PHIL_COUNT - 1) forksState[i].right_fork = &(forks[i+1]);
  225.         else forksState[i].right_fork = &(forks[0]);
  226.        
  227.         memset(&processContextArray[i],0,sizeof(Context));
  228.         processContextArray[i].rcs = rc;
  229.         processContextArray[i].rds = rd;
  230.         processContextArray[i].res = re;
  231.         processContextArray[i].rss = rs;
  232.         processContextArray[i].rflags = f;
  233.         processContextArray[i].rip = ri;
  234.     }
  235.    
  236.     processContextArrayOffset = (unsigned)&processContextArray;
  237.    
  238.     oldTimerHandler = getvect(TIMER_INTR);
  239.     TIMER_HANDLER_ON;
  240.    
  241.     simulatePhilosopher();
  242.  
  243.     TIMER_HANDLER_OFF;
  244.     log.close();
  245.     return 0;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment