engine-sparc-sunos-5.3.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* ==== machdep.c ============================================================
  2.  * Copyright (c) 1993, 1994 Chris Provenzano, proven@athena.mit.edu
  3.  *
  4.  * Description : Machine dependent functions for SunOS-4.1.3 on sparc
  5.  *
  6.  * 1.00 93/08/04 proven
  7.  *      -Started coding this file.
  8.  */
  9. #ifndef lint
  10. static const char rcsid[] = "$Id$";
  11. #endif
  12.  
  13. #include <pthread.h>
  14. #include <errno.h>
  15. #include <fcntl.h>
  16. #include <stdlib.h>
  17. #include <unistd.h>
  18. #include <sys/socket.h>
  19. #include <sys/procset.h>
  20. #include <sys/systeminfo.h>
  21. #include <poll.h>
  22. /* ==========================================================================
  23.  * machdep_save_state()
  24.  */
  25. int machdep_save_state(void)
  26. {
  27. /* Save register windows onto stackframe */
  28. __asm__ ("ta 3");
  29.     return(setjmp(pthread_run->machdep_data.machdep_state));
  30. }
  31. /* ==========================================================================
  32.  * machdep_restore_state()
  33.  */
  34. void machdep_restore_state(void)
  35. {
  36.     longjmp(pthread_run->machdep_data.machdep_state, 1);
  37. }
  38. /* ==========================================================================
  39.  * machdep_set_thread_timer()
  40.  */
  41. void machdep_set_thread_timer(struct machdep_pthread *machdep_pthread)
  42. {
  43.     if (setitimer(ITIMER_VIRTUAL, &(machdep_pthread->machdep_timer), NULL)) {
  44.         PANIC();
  45.     }
  46. }
  47. /* ==========================================================================
  48.  * machdep_unset_thread_timer()
  49.  */
  50. void machdep_unset_thread_timer(struct machdep_pthread *machdep_pthread)
  51. {
  52.     struct itimerval zeroval = { { 0, 0 }, { 0, 0} };
  53.     if (setitimer(ITIMER_VIRTUAL, &zeroval, NULL)) {
  54.         PANIC();
  55.     }
  56. }
  57. /* ==========================================================================
  58.  * machdep_pthread_cleanup()
  59.  */
  60. void *machdep_pthread_cleanup(struct machdep_pthread *machdep_pthread)
  61. {
  62.     return(machdep_pthread->machdep_stack);
  63. }
  64. /* ==========================================================================
  65.  * machdep_pthread_start()
  66.  */
  67. void machdep_pthread_start(void)
  68. {
  69. context_switch_done();
  70. pthread_sched_resume();
  71.     /* Run current threads start routine with argument */
  72.     pthread_exit(pthread_run->machdep_data.start_routine
  73.       (pthread_run->machdep_data.start_argument));
  74.     /* should never reach here */
  75.     PANIC();
  76. }
  77. /* ==========================================================================
  78.  * __machdep_stack_free()
  79.  */
  80. void __machdep_stack_free(void * stack)
  81. {
  82.     free(stack);
  83. }
  84. /* ==========================================================================
  85.  * __machdep_stack_alloc()
  86.  */
  87. void * __machdep_stack_alloc(size_t size)
  88. {
  89.     void * stack;
  90.    
  91.     return(malloc(size));
  92. }  
  93. /* ==========================================================================
  94.  * machdep_pthread_create()
  95.  */
  96. void __machdep_pthread_create(struct machdep_pthread *machdep_pthread,
  97.   void *(* start_routine)(), void *start_argument, 
  98.   long stack_size, long nsec, long flags)
  99. {
  100.     machdep_pthread->start_routine = start_routine;
  101.     machdep_pthread->start_argument = start_argument;
  102.     machdep_pthread->machdep_timer.it_value.tv_sec = 0;
  103.     machdep_pthread->machdep_timer.it_interval.tv_sec = 0;
  104.     machdep_pthread->machdep_timer.it_interval.tv_usec = 0;
  105.     machdep_pthread->machdep_timer.it_value.tv_usec = nsec / 1000;
  106. /* Save register windows onto stackframe */
  107. __asm__ ("ta 3");
  108. if (setjmp(machdep_pthread->machdep_state)) {
  109. machdep_pthread_start();
  110. }
  111.     /*
  112.      * Set up new stact frame so that it looks like it
  113.      * returned from a longjmp() to the beginning of
  114.      * machdep_pthread_start().
  115.      */
  116.     /* Sparc stack starts high and builds down. */
  117.     machdep_pthread->machdep_state[1] =
  118.   (int)machdep_pthread->machdep_stack + stack_size - 1024; 
  119. machdep_pthread->machdep_state[1] &= ~7;
  120. }
  121. /* ==========================================================================
  122.  * machdep_sys_getdirentries()
  123.  */
  124. int machdep_sys_getdirentries(int fd, char * buf, int len, int * seek)
  125. {
  126. return(machdep_sys_getdents(fd, buf, len));
  127. }
  128. /* ==========================================================================
  129.  * machdep_sys_wait3()
  130.  */
  131. machdep_sys_wait3(int * b, int c, int * d)
  132. {
  133. return(-ENOSYS);
  134.     /*    return(machdep_sys_wait4(0, b, c, d)); */
  135. }
  136. /* ==========================================================================
  137.  * machdep_sys_waitpid()
  138.  */
  139. machdep_sys_waitpid(int a, int * b, int c)
  140. {
  141. idtype_t id;
  142. switch (a) {
  143. case -1:
  144. id = P_ALL;
  145. break;
  146. case 0:
  147. a = machdep_sys_pgrpsys(0);
  148. id = P_PGID;
  149. break;
  150. default:
  151. if (a < 0) {
  152. id = P_PGID;
  153. a = -a;
  154. } else {
  155. id = P_PID;
  156. }
  157. break;
  158. }
  159. return(machdep_sys_waitsys(id, a, b, c));
  160. }
  161. /* ==========================================================================
  162.  * machdep_sys_dup2()
  163.  */
  164. machdep_sys_dup2(int a, int b)
  165. {
  166. machdep_sys_close(b);
  167. machdep_sys_fcntl(a, F_DUPFD, b);
  168. }
  169. /* ==========================================================================
  170.  * machdep_sys_ftruncate()
  171.  */
  172. machdep_sys_ftruncate(int a, off_t b)
  173. {
  174. flock_t c;
  175. c.l_len = 0;
  176. c.l_start = b;
  177. c.l_whence = 0;
  178. return(machdep_sys_fcntl(a, F_FREESP, c));
  179. }
  180.   
  181. /* ==========================================================================
  182.  * machdep_sys_select()
  183.  * Recoded to be quicker by Monty
  184.  */
  185. static fd_set bogus_fds; /* Always zero, never changed */
  186. machdep_sys_select(int nfds, fd_set *readfds, fd_set *writefds, 
  187.    fd_set *exceptfds, struct timeval *timeout)
  188. {
  189.   struct pollfd fds[64],*ptr;
  190.   int i, fds_count, time_out, found;
  191.   /* Make sure each arg has a valid pointer */
  192.   if ((readfds == NULL) || (writefds == NULL) || (exceptfds == NULL)) {
  193.     if (exceptfds == NULL) {
  194.       exceptfds = &bogus_fds;
  195.     }
  196.     if (writefds == NULL) {
  197.       writefds = &bogus_fds;
  198.     }
  199.     if (readfds == NULL) {
  200.       readfds = &bogus_fds;
  201.     }
  202.   }
  203.   ptr=fds;
  204.   for (i = 0 ; i < nfds; i++)
  205.   {
  206.     if (FD_ISSET(i, readfds))
  207.     {
  208.       if (FD_ISSET(i, writefds))
  209. ptr->events= POLLIN | POLLOUT;
  210.       else
  211. ptr->events= POLLIN;
  212.       (ptr++)->fd=i;
  213.     }
  214.     else if (FD_ISSET(i, writefds))
  215.     {
  216.       ptr->events=POLLOUT;
  217.       (ptr++)->fd=i;
  218.     }
  219.   }
  220.   FD_ZERO(readfds);
  221.   FD_ZERO(writefds);
  222.   FD_ZERO(exceptfds);
  223.   time_out = timeout->tv_usec / 1000 + timeout->tv_sec * 1000;
  224.   fds_count=(int) (ptr-fds);
  225.   while ((found = machdep_sys_poll(fds, fds_count, time_out)) <= 0)
  226.   {
  227.     if (found != -ERESTART) /* Try again if restartable */
  228.       return(found); /* Usually 0 ; Cant read or write */
  229.   }
  230.   while (ptr-- != fds)
  231.   {
  232.     if (ptr->revents & POLLIN)
  233.       FD_SET(ptr->fd, readfds);
  234.     if (ptr->revents & POLLOUT)
  235.       FD_SET(ptr->fd,writefds);
  236.   }
  237.   return(found);
  238. }
  239. /* ==========================================================================
  240.  * machdep_sys_getdtablesize()
  241.  */
  242. machdep_sys_getdtablesize()
  243. {
  244. return(sysconf(_SC_OPEN_MAX));
  245. }
  246. /* ==========================================================================
  247.  * getpagesize()
  248.  */
  249. getpagesize()
  250. {
  251. return(sysconf(_SC_PAGESIZE));
  252. }
  253. /* ==========================================================================
  254.  * gethostname()
  255.  */
  256. int gethostname(char * name, int namelen)
  257. {
  258. if (sysinfo(SI_HOSTNAME, name, namelen) == NOTOK) {
  259. return(NOTOK);
  260. } else {
  261. return(OK);
  262. }
  263. }
  264. /* ==========================================================================
  265.  * machdep_sys_sigaction()
  266.  *
  267.  * This is VERY temporary.
  268.  */
  269. int machdep_sys_sigaction(int a, void * b, void * c)
  270. {
  271. return(sigaction(a, b, c));
  272. }