jit.c
上传用户:wudi5211
上传日期:2010-01-21
资源大小:607k
文件大小:8k
源码类别:

嵌入式Linux

开发平台:

C/C++

  1. /*
  2.  * jit.c -- the just-in-time module
  3.  *
  4.  * $Id: jit.c,v 1.9 2001/03/16 21:04:49 rubini Exp $
  5.  *
  6.  */
  7. /* BUGS: this module is not reentrant: only one file can be read at a time
  8.  *       the module usage count is not used: you could remove the module
  9.  *           while reading it, thus asking for troubles
  10.  */
  11.  
  12. #ifndef __KERNEL__
  13. #  define __KERNEL__
  14. #endif
  15. #ifndef MODULE
  16. #  define MODULE
  17. #endif
  18. #include <linux/config.h>
  19. #include <linux/module.h>
  20. #include <linux/sched.h>
  21. #include <linux/kernel.h> /* printk() */
  22. #include <linux/fs.h>     /* everything... */
  23. #include <linux/proc_fs.h>
  24. #include <linux/errno.h>  /* error codes */
  25. #include <linux/types.h>  /* size_t */
  26. #include "sysdep.h"
  27. /*
  28.  * This module is a silly one: it only embeds short code fragments
  29.  * that show how time delays can be handled in the kernel.
  30.  */
  31. int jit_delay = 1; /* the default delay in read() */
  32. char *jit_spoke = "This is a meaningless string, fiftysix characters long.n";
  33. MODULE_PARM(jit_delay, "i");
  34. MODULE_PARM(jit_spoke, "s");
  35. MODULE_AUTHOR("Alessandro Rubini");
  36. #define LIMIT (PAGE_SIZE-128) /* don't print any more after this size */
  37. static int jit_print(char *buf)
  38. {
  39.     int len = 0;
  40.     while(len < LIMIT)
  41.         len += sprintf(buf+len,"%s",jit_spoke);
  42.     return len;
  43. }
  44. int jit_read_busy(char *buf, char **start, off_t offset,
  45.                    int len, int *eof, void *data)
  46. {
  47.     /* delay one second (or the chosen value), before printing */
  48.     unsigned long j = jiffies + jit_delay * HZ;
  49.     while (jiffies < j)
  50.         /* nothing */;
  51.     *eof = 1;
  52.     return jit_print(buf);
  53. }
  54. int jit_read_sched(char *buf, char **start, off_t offset,
  55.                    int len, int *eof, void *data)
  56. {
  57.     /* delay one second (or the chosen value), before printing */
  58.     unsigned long j = jiffies + jit_delay * HZ;
  59.     while (jiffies < j)
  60.         schedule();
  61.     *eof = 1;
  62.     return jit_print(buf);
  63. }
  64. int jit_read_queue(char *buf, char **start, off_t offset,
  65.                    int len, int *eof, void *data)
  66. {
  67.     /* delay one second (or the chosen value), before printing */
  68. /*    unsigned long j = jiffies + jit_delay * HZ; */
  69.     
  70.     wait_queue_head_t wait;
  71.     init_waitqueue_head (&wait);
  72.     interruptible_sleep_on_timeout(&wait, jit_delay*HZ);
  73.     *eof = 1;
  74.     return jit_print(buf);
  75. }
  76. int jit_read_self(char *buf, char **start, off_t offset,
  77.                    int len, int *eof, void *data)
  78. {
  79.     /* delay one second (or the chosen value), before printing */
  80.     set_current_state(TASK_INTERRUPTIBLE);
  81.     schedule_timeout (jit_delay*HZ);
  82.     *eof = 1;
  83.     return jit_print(buf);
  84. }
  85. #ifdef USE_PROC_REGISTER
  86. static int jit_old_read_busy(char *buf, char **start, off_t offset,
  87.                 int len, int unused)
  88. {
  89.     int eof;
  90.     return jit_read_busy(buf, start, offset, len, &eof, NULL);
  91. }
  92. struct proc_dir_entry jit_proc_busy = {
  93.         0,                 /* low_ino: the inode -- dynamic */
  94.         7, "jitbusy",      /* len of name and name */
  95.         S_IFREG | S_IRUGO, /* mode */
  96.         1, 0, 0,           /* nlinks, owner, group */
  97.         0, NULL,           /* size - unused; operations -- use default */
  98.         &jit_old_read_busy,    /* function used to read data */
  99.         /* nothing more */
  100.     };
  101. static int jit_old_read_sched(char *buf, char **start, off_t offset,
  102.                 int len, int unused)
  103. {
  104.     int eof;
  105.     return jit_read_sched(buf, start, offset, len, &eof, NULL);
  106. }
  107. struct proc_dir_entry jit_proc_sched = {
  108.         0,                 /* low_ino: the inode -- dynamic */
  109.         8, "jitsched",     /* len of name and name */
  110.         S_IFREG | S_IRUGO, /* mode */
  111.         1, 0, 0,           /* nlinks, owner, group */
  112.         0, NULL,           /* size - unused; operations -- use default */
  113.         &jit_old_read_sched,   /* function used to read data */
  114.         /* nothing more */
  115.     };
  116. static int jit_old_read_queue(char *buf, char **start, off_t offset,
  117.                 int len, int unused)
  118. {
  119.     int eof;
  120.     return jit_read_queue(buf, start, offset, len, &eof, NULL);
  121. }
  122. struct proc_dir_entry jit_proc_queue = {
  123.         0,                 /* low_ino: the inode -- dynamic */
  124.         8, "jitqueue",     /* len of name and name */
  125.         S_IFREG | S_IRUGO, /* mode */
  126.         1, 0, 0,           /* nlinks, owner, group */
  127.         0, NULL,           /* size - unused; operations -- use default */
  128.         &jit_old_read_queue,    /* function used to read data */
  129.         /* nothing more */
  130.     };
  131. static int jit_old_read_self(char *buf, char **start, off_t offset,
  132.                 int len, int unused)
  133. {
  134.     int eof;
  135.     return jit_read_self (buf, start, offset, len, &eof, NULL);
  136. }
  137. struct proc_dir_entry jit_proc_self = {
  138.         0,                 /* low_ino: the inode -- dynamic */
  139.         7, "jitself",      /* len of name and name */
  140.         S_IFREG | S_IRUGO, /* mode */
  141.         1, 0, 0,           /* nlinks, owner, group */
  142.         0, NULL,           /* size - unused; operations -- use default */
  143.         &jit_old_read_self,    /* function used to read data */
  144.         /* nothing more */
  145.     };
  146. #endif /* USE_PROC_REGISTER */
  147. /*
  148.  * There is also a silly file returning the current time.
  149.  */
  150. int jit_read_current(char *buf, char **start, off_t offset,
  151.                    int len, int *eof, void *data)
  152. {
  153.     struct timeval tv1, tv2;
  154.     unsigned long flags;
  155.     do_gettimeofday(&tv1);
  156.     save_flags(flags);
  157.     cli();
  158.     tv2 = xtime;
  159.     restore_flags(flags);
  160.     len=0;
  161.     len += sprintf(buf,"gettime: %9i.%06inxtime:   %9i.%06injiffies: %lin",
  162.                    (int) tv1.tv_sec, (int) tv1.tv_usec,
  163.                    (int) tv2.tv_sec, (int) tv2.tv_usec, jiffies);
  164.     *eof = 1;
  165.     return len;
  166. }
  167. #ifdef USE_PROC_REGISTER
  168. static int jit_old_read_current(char *buf, char **start, off_t offset,
  169.                 int len, int unused)
  170. {
  171.     int eof;
  172.     return jit_read_current (buf, start, offset, len, &eof, NULL);
  173. }
  174.                 
  175. struct proc_dir_entry jit_proc_current = {
  176.         0,                 /* low_ino: the inode -- dynamic */
  177.         10, "currentime",  /* len of name and name */
  178.         S_IFREG | S_IRUGO, /* mode */
  179.         1, 0, 0,           /* nlinks, owner, group */
  180.         0, NULL,           /* size - unused; operations -- use default */
  181.         &jit_old_read_current, /* function used to read data */
  182.         /* nothing more */
  183.     };
  184. #endif
  185. int jit_init(void)
  186. {
  187. #ifdef USE_PROC_REGISTER
  188.     proc_register_dynamic(&proc_root, &jit_proc_busy);
  189.     proc_register_dynamic(&proc_root, &jit_proc_sched);
  190.     proc_register_dynamic(&proc_root, &jit_proc_queue);
  191.     proc_register_dynamic(&proc_root, &jit_proc_self);
  192.     proc_register_dynamic(&proc_root, &jit_proc_current);
  193. #else
  194.     create_proc_read_entry("currentime", 0, NULL, jit_read_current, NULL);
  195.     create_proc_read_entry("jitbusy", 0, NULL, jit_read_busy, NULL);
  196.     create_proc_read_entry("jitsched", 0, NULL, jit_read_sched, NULL);
  197.     create_proc_read_entry("jitqueue", 0, NULL, jit_read_queue, NULL);
  198.     create_proc_read_entry("jitself", 0, NULL, jit_read_self, NULL);
  199. #endif
  200. #ifndef JIT_DEBUG
  201.     EXPORT_NO_SYMBOLS;
  202. #endif
  203.     return 0; /* succeed */
  204. }
  205. void jit_cleanup(void)
  206. {
  207. #ifdef USE_PROC_REGISTER
  208.     proc_unregister(&proc_root, jit_proc_busy.low_ino);
  209.     proc_unregister(&proc_root, jit_proc_sched.low_ino);
  210.     proc_unregister(&proc_root, jit_proc_queue.low_ino);
  211.     proc_unregister(&proc_root, jit_proc_self.low_ino);
  212.     proc_unregister(&proc_root, jit_proc_current.low_ino);
  213. #else
  214.     remove_proc_entry ("currentime", 0);
  215.     remove_proc_entry ("jitbusy", 0);
  216.     remove_proc_entry ("jitsched", 0);
  217.     remove_proc_entry ("jitqueue", 0);
  218.     remove_proc_entry ("jitself", 0);
  219. #endif
  220. }
  221. module_init(jit_init);
  222. module_exit(jit_cleanup);