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

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.  * 98/10/22 bad
  10.  * -update for fat sigset_t in NetBSD 1.3H
  11.  */
  12. #ifndef lint
  13. static const char rcsid[] = "$Id$";
  14. #endif
  15.  
  16. #include "config.h"
  17. #include <pthread.h>
  18. #include <stdlib.h>
  19. #include <errno.h>
  20. /* ==========================================================================
  21.  * machdep_save_state()
  22.  */
  23. int machdep_save_state(void)
  24. {
  25. /* Save register windows onto stackframe */
  26. __asm__ ("ta 3");
  27.     return(setjmp(pthread_run->machdep_data.machdep_state));
  28. }
  29. /* ==========================================================================
  30.  * machdep_restore_state()
  31.  */
  32. void machdep_restore_state(void)
  33. {
  34.     longjmp(pthread_run->machdep_data.machdep_state, 1);
  35. }
  36. /* ==========================================================================
  37.  * machdep_save_float_state()
  38.  */
  39. void machdep_save_float_state(struct pthread * pthread)
  40. {
  41. return;
  42. }
  43. /* ==========================================================================
  44.  * machdep_restore_float_state()
  45.  */
  46. void machdep_restore_float_state(void)
  47. {
  48. return;
  49. }
  50. /* ==========================================================================
  51.  * machdep_set_thread_timer()
  52.  */
  53. void machdep_set_thread_timer(struct machdep_pthread *machdep_pthread)
  54. {
  55.     if (setitimer(ITIMER_VIRTUAL, &(machdep_pthread->machdep_timer), NULL)) {
  56.         PANIC();
  57.     }
  58. }
  59. /* ==========================================================================
  60.  * machdep_unset_thread_timer()
  61.  */
  62. void machdep_unset_thread_timer(struct machdep_pthread *machdep_pthread)
  63. {
  64.     struct itimerval zeroval = { { 0, 0 }, { 0, 0} };
  65.     if (setitimer(ITIMER_VIRTUAL, &zeroval, NULL)) {
  66.         PANIC();
  67.     }
  68. }
  69. /* ==========================================================================
  70.  * machdep_pthread_cleanup()
  71.  */
  72. void *machdep_pthread_cleanup(struct machdep_pthread *machdep_pthread)
  73. {
  74.     return(machdep_pthread->machdep_stack);
  75. }
  76. /* ==========================================================================
  77.  * machdep_pthread_start()
  78.  */
  79. void machdep_pthread_start(void)
  80. {
  81. context_switch_done();
  82. pthread_sched_resume ();
  83.     /* Run current threads start routine with argument */
  84.     pthread_exit(pthread_run->machdep_data.start_routine
  85.       (pthread_run->machdep_data.start_argument));
  86.     /* should never reach here */
  87.     PANIC();
  88. }
  89. /* ==========================================================================
  90.  * __machdep_stack_free()
  91.  */
  92. void __machdep_stack_free(void * stack)
  93. {       
  94.     free(stack);
  95. }
  96.  
  97. /* ==========================================================================
  98.  * __machdep_stack_alloc()
  99.  */ 
  100. void * __machdep_stack_alloc(size_t size)
  101. {   
  102.     void * stack;
  103.     
  104.     return(malloc(size));
  105. }     
  106.     
  107. /* ==========================================================================
  108.  * __machdep_pthread_create()
  109.  */
  110. void __machdep_pthread_create(struct machdep_pthread *machdep_pthread,
  111.   void *(* start_routine)(), void *start_argument, 
  112.   long stack_size, long nsec, long flags)
  113. {
  114.     machdep_pthread->start_routine = start_routine;
  115.     machdep_pthread->start_argument = start_argument;
  116.     machdep_pthread->machdep_timer.it_value.tv_sec = 0;
  117.     machdep_pthread->machdep_timer.it_interval.tv_sec = 0;
  118.     machdep_pthread->machdep_timer.it_interval.tv_usec = 0;
  119.     machdep_pthread->machdep_timer.it_value.tv_usec = nsec / 1000;
  120. /* Save register windows onto stackframe */
  121. __asm__ ("ta 3");
  122. setjmp(machdep_pthread->machdep_state);
  123.     /*
  124.      * Set up new stact frame so that it looks like it
  125.      * returned from a longjmp() to the beginning of
  126.      * machdep_pthread_start().
  127.      */
  128.     machdep_pthread->machdep_state[3] = (int)machdep_pthread_start;
  129.     machdep_pthread->machdep_state[4] = (int)machdep_pthread_start;
  130.     /* Sparc stack starts high and builds down. */
  131.     machdep_pthread->machdep_state[2] =
  132.   (int)machdep_pthread->machdep_stack + stack_size - 1024; 
  133. machdep_pthread->machdep_state[2] &= ~7;
  134. }
  135. #if defined(HAVE_SYSCALL_GETDENTS)
  136. /* ==========================================================================
  137.  * machdep_sys_getdirentries()
  138.  *
  139.  * Always use getdents in place of getdirentries if possible --proven
  140.  */
  141. int machdep_sys_getdirentries(int fd, char * buf, int len, int * seek)
  142. {
  143. return(machdep_sys_getdents(fd, buf, len));
  144. }
  145. #endif
  146. /* ==========================================================================
  147.  * machdep_sys_wait3()
  148.  */
  149. machdep_sys_wait3(int * b, int c, int * d)
  150. {
  151.         return(machdep_sys_wait4(0, b, c, d));
  152. }
  153. /* ==========================================================================
  154.  * machdep_sys_waitpid()
  155.  */
  156. machdep_sys_waitpid(int pid, int * statusp, int options)
  157. {
  158. if (pid == -1)
  159. pid = 0;
  160. else if (pid == 0)
  161. pid = - getpgrp ();
  162. return machdep_sys_wait4 (pid, statusp, options, NULL);
  163. }
  164. #if !defined(HAVE_SYSCALL_SIGPROCMASK) 
  165. #if 0
  166. /* ==========================================================================
  167.  * machdep_sys_sigprocmask()
  168.  * This isn't a real implementation; we can make the assumption that the
  169.  * pthreads library is not using oset, and that it is always blocking or
  170.  * unblocking all signals at once.
  171.  */
  172. int machdep_sys_sigprocmask(int how, const sigset_t *set, sigset_t *oset)
  173. {
  174.     switch(how) {
  175.       case SIG_BLOCK:
  176. sigblock(*set);
  177. break;
  178.       case SIG_UNBLOCK:
  179. sigsetmask(~*set);
  180. break;
  181.       case SIG_SETMASK:
  182. sigsetmask(*set);
  183. break;
  184.       default:
  185. return -EINVAL;
  186.     }
  187.     return(OK);
  188. }
  189. /* ==========================================================================
  190.  * sigaction()
  191.  *
  192.  * Temporary until I do machdep_sys_sigaction()
  193.  */
  194. int sigaction(int sig, const struct sigaction *act, struct sigaction *oldact)
  195. {
  196. return(sigvec(sig, (struct sigvec *)act, (struct sigvec *)oldact));
  197. }
  198. #endif
  199. #endif
  200. #if !defined(HAVE_SYSCALL_GETDTABLESIZE) 
  201. /* ==========================================================================
  202.  * machdep_sys_getdtablesize()
  203.  */
  204. machdep_sys_getdtablesize()
  205. {
  206.         return(sysconf(_SC_OPEN_MAX));
  207. #endif