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

嵌入式Linux

开发平台:

C/C++

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