engine-r2000-ultrix-4.2.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* ==== machdep.c ============================================================
  2.  * Copyright (c) 1993 Chris Provenzano, proven@athena.mit.edu
  3.  *
  4.  * Description : Machine dependent functions for decstation with r2000/r3000
  5.  *
  6.  *  1.00 93/07/21 proven
  7.  *      -Started coding this file.
  8.  */
  9. #ifndef lint
  10. static const char rcsid[] = "$Id$";
  11. #endif
  12. #include <pthread.h>
  13. #include <stdlib.h>
  14. #include <errno.h>
  15. /*
  16.  * The r2000/r3000 processors do not have a test and set instruction, so 
  17.  * the semaphore TEST_AND_SET macro is linked very closely to the interrupt
  18.  * handelling of the pthreads package.
  19.  */
  20. /* ==========================================================================
  21.  * semaphore_test_and_set()
  22.  *
  23.  * SEMAPHORE_TEST_AND_SET prevents interrupts, tests the lock and then
  24.  * turns interrupts back on, checking to see if any interrupts have occured
  25.  * between the prevent and resume.
  26.  */
  27. int semaphore_test_and_set(semaphore *lock)
  28. {
  29. int rval;
  30. /* None of this should be necessary
  31. sig_prevent();
  32. if (!(rval = (*lock))) {
  33. *lock = SEMAPHORE_SET;
  34. }
  35. sig_check_and_resume();
  36. return(rval);
  37. */
  38. }
  39. /* ==========================================================================
  40.  * machdep_save_state()
  41.  */
  42. int machdep_save_state(void)
  43. {
  44. return(setjmp(pthread_run->machdep_data.machdep_state));
  45. }
  46. /* ==========================================================================
  47.  * machdep_save_float_state()
  48.  */
  49. void machdep_save_float_state(struct pthread * pthread)
  50. {
  51. return;
  52. }
  53. /* ==========================================================================
  54.  * fake_longjmp()
  55.  */
  56. void fake_longjmp(jmp_buf env)
  57. {
  58. asm("li $5,1; sw $5, 20($4); li $2,103; syscall"); 
  59. }
  60. /* ==========================================================================
  61.  * machdep_restore_state()
  62.  *
  63.  * When I redo machdep_save_state, I'll put the asm in machdep_save_state()
  64.  * and machdep_restore_state() and I won't have to do an additional function
  65.  * call.
  66.  */
  67. void machdep_restore_state(void)
  68. {
  69. fake_longjmp(pthread_run->machdep_data.machdep_state);
  70. /* longjmp(pthread_run->machdep_data.machdep_state, 1); */
  71. }
  72. /* ==========================================================================
  73.  * machdep_restore_float_state()
  74.  */
  75. void machdep_restore_float_state(void)
  76. {
  77. return;
  78. }
  79. /* ==========================================================================
  80.  * machdep_set_thread_timer()
  81.  */
  82. void machdep_set_thread_timer(struct machdep_pthread *machdep_pthread)
  83. {
  84. if (setitimer(ITIMER_VIRTUAL, &(machdep_pthread->machdep_timer), NULL)) {
  85. PANIC();
  86. }
  87. }
  88. /* ==========================================================================
  89.  * machdep_unset_thread_timer()
  90.  */
  91. void machdep_unset_thread_timer(struct machdep_pthread *machdep_pthread)
  92. {
  93. struct itimerval zeroval = { { 0, 0 }, { 0, 0} };
  94. if (setitimer(ITIMER_VIRTUAL, &zeroval, NULL)) {
  95. PANIC();
  96. }
  97. }
  98. /* ==========================================================================
  99.  * machdep_pthread_cleanup()
  100.  */
  101. void *machdep_pthread_cleanup(struct machdep_pthread *machdep_pthread)
  102. {
  103. return(machdep_pthread->machdep_stack);
  104. }
  105. /* ==========================================================================
  106.  * machdep_pthread_start()
  107.  */
  108. void machdep_pthread_start(void)
  109. {
  110. context_switch_done();
  111. pthread_sched_resume();
  112. /* Run current threads start routine with argument */
  113. pthread_exit(pthread_run->machdep_data.start_routine
  114.       (pthread_run->machdep_data.start_argument));
  115. /* should never reach here */
  116. PANIC();
  117. }
  118. /* ==========================================================================
  119.  * __machdep_stack_free()
  120.  */
  121. void __machdep_stack_free(void * stack)
  122. {
  123. free(stack);
  124. }
  125. /* ==========================================================================
  126.  * __machdep_stack_alloc()
  127.  */
  128. void * __machdep_stack_alloc(size_t size)
  129. {
  130. void * stack;
  131. return(malloc(size));
  132. }
  133. /* ==========================================================================
  134.  * __machdep_pthread_create()
  135.  */
  136. void __machdep_pthread_create(struct machdep_pthread *machdep_pthread,
  137.   void *(* start_routine)(), void *start_argument, 
  138.   long stack_size, long nsec, long flags)
  139. {
  140. machdep_pthread->start_routine = start_routine;
  141. machdep_pthread->start_argument = start_argument;
  142. machdep_pthread->machdep_timer.it_value.tv_sec = 0;
  143. machdep_pthread->machdep_timer.it_interval.tv_sec = 0;
  144. machdep_pthread->machdep_timer.it_interval.tv_usec = 0;
  145. machdep_pthread->machdep_timer.it_value.tv_usec = nsec / 1000;
  146. setjmp(machdep_pthread->machdep_state);
  147. /*
  148.  * Set up new stact frame so that it looks like it
  149.  * returned from a longjmp() to the beginning of
  150.  * machdep_pthread_start().
  151.  */
  152. machdep_pthread->machdep_state[JB_RA] = (int)machdep_pthread_start;
  153. machdep_pthread->machdep_state[JB_PC] = (int)machdep_pthread_start;
  154. /* Stack starts high and builds down. */
  155. machdep_pthread->machdep_state[JB_SP] =
  156.   (int)machdep_pthread->machdep_stack + stack_size;
  157. /* This is the real global pointer */
  158. /* machdep_pthread->machdep_state[JB_GP] = 0; */
  159. }
  160. /* ==========================================================================
  161.  * machdep_sys_sigprocmask()
  162.  * This isn't a real implementation; we can make the assumption that the
  163.  * pthreads library is not using oset, and that it is always blocking or
  164.  * unblocking all signals at once.
  165.  */
  166. int machdep_sys_sigprocmask(int how, const sigset_t *set, sigset_t *oset)
  167. {
  168.     switch(how) {
  169.       case SIG_BLOCK:
  170. sigblock(*set);
  171. break;
  172.       case SIG_UNBLOCK:
  173. sigsetmask(~*set);
  174. break;
  175.       case SIG_SETMASK:
  176. sigsetmask(*set);
  177. break;
  178.       default:
  179. return -EINVAL;
  180.     }
  181.     return(OK);
  182. }