thread.h
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:4k
源码类别:

网络

开发平台:

Unix_Linux

  1. /* Thread management routine header.
  2.  * Copyright (C) 1998 Kunihiro Ishiguro
  3.  *
  4.  * This file is part of GNU Zebra.
  5.  *
  6.  * GNU Zebra is free software; you can redistribute it and/or modify it
  7.  * under the terms of the GNU General Public License as published by the
  8.  * Free Software Foundation; either version 2, or (at your option) any
  9.  * later version.
  10.  *
  11.  * GNU Zebra is distributed in the hope that it will be useful, but
  12.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
  18.  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  19.  * 02111-1307, USA.  
  20.  */
  21. #ifndef _ZEBRA_THREAD_H
  22. #define _ZEBRA_THREAD_H
  23. #ifdef HAVE_RUSAGE
  24. #define RUSAGE_T        struct rusage
  25. #define GETRUSAGE(X)    getrusage (RUSAGE_SELF, X);
  26. #else
  27. #define RUSAGE_T        struct timeval
  28. #define GETRUSAGE(X)    gettimeofday (X, NULL);
  29. #endif /* HAVE_RUSAGE */
  30. /* Linked list of thread. */
  31. struct thread_list
  32. {
  33.   struct thread *head;
  34.   struct thread *tail;
  35.   int count;
  36. };
  37. /* Master of the theads. */
  38. struct thread_master
  39. {
  40.   struct thread_list read;
  41.   struct thread_list write;
  42.   struct thread_list timer;
  43.   struct thread_list event;
  44.   struct thread_list ready;
  45.   struct thread_list unuse;
  46.   fd_set readfd;
  47.   fd_set writefd;
  48.   fd_set exceptfd;
  49.   unsigned long alloc;
  50. };
  51. /* Thread itself. */
  52. struct thread
  53. {
  54.   unsigned char type; /* thread type */
  55.   struct thread *next; /* next pointer of the thread */
  56.   struct thread *prev; /* previous pointer of the thread */
  57.   struct thread_master *master; /* pointer to the struct thread_master. */
  58.   int (*func) (struct thread *); /* event function */
  59.   void *arg; /* event argument */
  60.   union {
  61.     int val; /* second argument of the event. */
  62.     int fd; /* file descriptor in case of read/write. */
  63.     struct timeval sands; /* rest of time sands value. */
  64.   } u;
  65.   RUSAGE_T ru; /* Indepth usage info.  */
  66. };
  67. /* Thread types. */
  68. #define THREAD_READ           0
  69. #define THREAD_WRITE          1
  70. #define THREAD_TIMER          2
  71. #define THREAD_EVENT          3
  72. #define THREAD_READY          4
  73. #define THREAD_UNUSED         5
  74. /* Thread yield time.  */
  75. #define THREAD_YIELD_TIME_SLOT     100 * 1000L /* 100ms */
  76. /* Macros. */
  77. #define THREAD_ARG(X) ((X)->arg)
  78. #define THREAD_FD(X)  ((X)->u.fd)
  79. #define THREAD_VAL(X) ((X)->u.val)
  80. #define THREAD_READ_ON(master,thread,func,arg,sock) 
  81.   do { 
  82.     if (! thread) 
  83.       thread = thread_add_read (master, func, arg, sock); 
  84.   } while (0)
  85. #define THREAD_WRITE_ON(master,thread,func,arg,sock) 
  86.   do { 
  87.     if (! thread) 
  88.       thread = thread_add_write (master, func, arg, sock); 
  89.   } while (0)
  90. #define THREAD_TIMER_ON(master,thread,func,arg,time) 
  91.   do { 
  92.     if (! thread) 
  93.       thread = thread_add_timer (master, func, arg, time); 
  94.   } while (0)
  95. #define THREAD_OFF(thread) 
  96.   do { 
  97.     if (thread) 
  98.       { 
  99.         thread_cancel (thread); 
  100.         thread = NULL; 
  101.       } 
  102.   } while (0)
  103. #define THREAD_READ_OFF(thread)  THREAD_OFF(thread)
  104. #define THREAD_WRITE_OFF(thread)  THREAD_OFF(thread)
  105. #define THREAD_TIMER_OFF(thread)  THREAD_OFF(thread)
  106. /* Prototypes. */
  107. struct thread_master *thread_master_create ();
  108. struct thread *thread_add_read (struct thread_master *, 
  109. int (*)(struct thread *), void *, int);
  110. struct thread *thread_add_write (struct thread_master *,
  111.  int (*)(struct thread *), void *, int);
  112. struct thread *thread_add_timer (struct thread_master *,
  113.  int (*)(struct thread *), void *, long);
  114. struct thread *thread_add_event (struct thread_master *,
  115.  int (*)(struct thread *), void *, int );
  116. void thread_cancel (struct thread *);
  117. void thread_cancel_event (struct thread_master *, void *);
  118. struct thread *thread_fetch (struct thread_master *, struct thread *);
  119. struct thread *thread_execute (struct thread_master *,
  120.        int (*)(struct thread *), void *, int);
  121. void thread_call (struct thread *);
  122. char *thread_timer_remain_second (struct thread *);
  123. #endif /* _ZEBRA_THREAD_H */