Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <linux/kernel.h>
- #include <linux/syscalls.h>
- #define MY_SYSLOG 351
- #define MY_QUEUEEMPTY 352
- #define MY_ENQUEUE 353
- #define MY_DEQUEUE 354
- #define MY_MONITOR 355
- #define MONITOR_DOWN 0
- #define MONITOR_UP 1
- #define MONITOR_ENTER 2
- #define MONITOR_LEAVE 3
- #define MONITOR_WAIT 4
- #define MONITOR_NOTIFY 5
- #define MONITOR_NOTIFY_ALL 6
- #define MONITOR_INIT 7
- #define QUEUE_SIZE 16
- static int read,write;
- static char buf[QUEUE_SIZE];
- DEFINE_SEMAPHORE(lock_sema)
- struct semaphore wait_sema = __SEMAPHORE_INITIALIZER(wait_sema, 0);
- asmlinkage long sys_my_syslog(const char *test){
- printk(KERN_ALERT "Called with string: %s\n",test);
- return 0;
- }
- asmlinkage long sys_my_queueempty(){
- return(read==write);
- }
- asmlinkage long sys_my_queuefull(){
- return ((write+1)%QUEUE_SIZE==read);
- }
- asmlinkage long sys_my_enqueue(char ch){
- if(sys_my_queuefull()){
- return -1;
- }else{
- write++;
- buf[write%QUEUE_SIZE]=ch;
- return 0;
- }
- }
- asmlinkage long sys_my_dequeue(){
- char ch;
- if(sys_my_queueempty())
- return -1;
- ch=buf[read%QUEUE_SIZE];
- read++;
- return (long)ch;
- }
- /*semaphore lock_sema;
- semaphore wait_sema;*/
- int wait_count=0;
- asmlinkage long sys_my_monitor(unsigned long op)
- {
- int result ;
- printk( KERN_DEBUG "my_monitor: entered") ;
- switch(op){
- case MONITOR_DOWN:
- printk( KERN_DEBUG "my_monitor: MONITOR_DOWN") ;
- result = down_interruptible(&lock_sema) ;
- break ;
- case MONITOR_UP:
- printk( KERN_DEBUG "my_monitor: MONITOR_UP") ;
- up(&lock_sema) ;
- break ;
- case MONITOR_INIT:
- lock_sema unlocked (1);
- wait_sema locked (0);
- wait_count =0;
- break;
- case MONITOR_ENTER:
- down_interruptible(&lock_sema);
- break;
- case MONOTOR_LEAVE:
- up(&lock_sema) ;
- break;
- case MONITOR_WAIT:
- wait_count++;
- up(&lock_sema);
- down_interruptible(&wait_sema);
- down_interruptible(&lock_sema);
- break;
- case MONITOR_NOTIFY:
- if(wait_count>0){
- wait_count--;
- up(&wait_sema);
- }
- break;
- case MONITOR_NOTIFY_ALL:
- while(wait_count>0){
- wait_count--;
- up(&wait_sema);
- }
- break;
- default:
- printk( KERN_DEBUG "my_monitor: operation action") ;
- }
- return 0 ;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement