Advertisement
Guest User

semaaa

a guest
Nov 23rd, 2014
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.73 KB | None | 0 0
  1. #include <linux/kernel.h>
  2. #include <linux/syscalls.h>
  3.  
  4. #define MY_SYSLOG 351
  5. #define MY_QUEUEEMPTY 352
  6. #define MY_ENQUEUE 353
  7. #define MY_DEQUEUE 354
  8. #define MY_MONITOR 355
  9.  
  10.  
  11. #define MONITOR_DOWN 0
  12. #define MONITOR_UP 1
  13. #define MONITOR_ENTER 2
  14. #define MONITOR_LEAVE 3
  15. #define MONITOR_WAIT 4
  16. #define MONITOR_NOTIFY 5
  17. #define MONITOR_NOTIFY_ALL 6
  18. #define MONITOR_INIT 7
  19. #define QUEUE_SIZE 16
  20. static int read,write;
  21. static char buf[QUEUE_SIZE];
  22. static DEFINE_SEMAPHORE(lock_sema)
  23. struct semaphore wait_sema = __SEMAPHORE_INITIALIZER(wait_sema, 0);
  24. asmlinkage long sys_my_syslog(const char *test){
  25.  
  26. printk(KERN_ALERT "Called with string: %s\n",test);
  27.  
  28. return 0;
  29. }
  30.  
  31.  
  32.  
  33. asmlinkage long sys_my_queueempty(){
  34. return(read==write);
  35. }
  36.  
  37.  
  38. asmlinkage long sys_my_queuefull(){
  39. return ((write+1)%QUEUE_SIZE==read);
  40. }
  41.  
  42.  
  43. asmlinkage long sys_my_enqueue(char ch){
  44. if(sys_my_queuefull()){
  45. return -1;
  46. }else{
  47. write++;
  48. buf[write%QUEUE_SIZE]=ch;
  49. return 0;
  50. }
  51. }
  52.  
  53. asmlinkage long sys_my_dequeue(){
  54. char ch;
  55.  
  56. if(sys_my_queueempty())
  57. return -1;
  58.  
  59.  
  60. ch=buf[read%QUEUE_SIZE];
  61. read++;
  62. return (long)ch;
  63. }
  64.  
  65.  
  66.  
  67. /*semaphore lock_sema;
  68. semaphore wait_sema;*/
  69. int wait_count=0;
  70. asmlinkage long sys_my_monitor(unsigned long op)
  71. {
  72. int result ;
  73. printk( KERN_DEBUG "my_monitor: entered") ;
  74. switch(op){
  75. case MONITOR_DOWN:
  76. printk( KERN_DEBUG "my_monitor: MONITOR_DOWN") ;
  77. result = down_interruptible(&lock_sema) ;
  78. break ;
  79. case MONITOR_UP:
  80. printk( KERN_DEBUG "my_monitor: MONITOR_UP") ;
  81. up(&lock_sema) ;
  82. break ;
  83. case MONITOR_INIT:
  84. lock_sema unlocked (1);
  85. wait_sema locked (0);
  86. wait_count =0;
  87. break;
  88. case MONITOR_ENTER:
  89. result= down_interruptible(&lock_sema);
  90. break;
  91. case MONOTOR_LEAVE:
  92. up(&lock_sema) ;
  93. break;
  94. case MONITOR_WAIT:
  95. wait_count++;
  96. up(&lock_sema);
  97. result=down_interruptible(&wait_sema);
  98. result=down_interruptible(&lock_sema);
  99. break;
  100. case MONITOR_NOTIFY:
  101. if(wait_count>0){
  102. wait_count--;
  103. up(&wait_sema);
  104. }
  105. break;
  106. case MONITOR_NOTIFY_ALL:
  107. while(wait_count>0){
  108. wait_count--;
  109. up(&wait_sema);
  110. }
  111. break;
  112. default:
  113. printk( KERN_DEBUG "my_monitor: operation action") ;
  114. }
  115. return 0 ;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement