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

MySQL数据库

开发平台:

Visual C++

  1. /* ==== machdep.c ============================================================
  2.  * Copyright (c) 1993, 1994 Chris Provenzano, proven@athena.mit.edu
  3.  *
  4.  * Copyright (c) 1993 by Chris Provenzano, proven@mit.edu
  5.  * All rights reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 2. Redistributions in binary form must reproduce the above copyright
  13.  *    notice, this list of conditions and the following disclaimer in the
  14.  *    documentation and/or other materials provided with the distribution.
  15.  * 3. All advertising materials mentioning features or use of this software
  16.  *    must display the following acknowledgement:
  17.  *  This product includes software developed by Chris Provenzano.
  18.  * 4. The name of Chris Provenzano may not be used to endorse or promote
  19.  *      products derived from this software without specific prior written
  20.  *      permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY CHRIS PROVENZANO ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL CHRIS PROVENZANO BE LIABLE FOR ANY
  26.  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  27.  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  28.  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  29.  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  * Description : Machine dependent functions for NetBSD on i386
  35.  *
  36.  * 1.00 93/08/04 proven
  37.  *      -Started coding this file.
  38.  */
  39. #ifndef lint
  40. static const char rcsid[] = "$Id$";
  41. #endif
  42. #include <pthread.h>
  43. #include <sys/types.h>
  44. #include <sys/socket.h>
  45. #include <stdio.h>
  46. /* ==========================================================================
  47.  * machdep_save_state()
  48.  */
  49. int machdep_save_state(void)
  50. {
  51.     return(_setjmp(pthread_run->machdep_data.machdep_state));
  52. }
  53. /* ==========================================================================
  54.  * machdep_restore_state()
  55.  */
  56. void machdep_restore_state(void)
  57. {
  58.     _longjmp(pthread_run->machdep_data.machdep_state, 1);
  59. }
  60. /* ==========================================================================
  61.  * machdep_set_thread_timer()
  62.  */
  63. void machdep_set_thread_timer(struct machdep_pthread *machdep_pthread)
  64. {
  65.     if (setitimer(ITIMER_VIRTUAL, &(machdep_pthread->machdep_timer), NULL)) {
  66.         PANIC();
  67.     }
  68. }
  69. /* ==========================================================================
  70.  * machdep_unset_thread_timer()
  71.  */
  72. void machdep_unset_thread_timer(struct machdep_pthread *machdep_pthread)
  73. {
  74.     struct itimerval zeroval = { { 0, 0 }, { 0, 0} };
  75.     if (setitimer(ITIMER_VIRTUAL, &zeroval, NULL)) {
  76.         PANIC();
  77.     }
  78. }
  79. /* ==========================================================================
  80.  * machdep_pthread_cleanup()
  81.  */
  82. void *machdep_pthread_cleanup(struct machdep_pthread *machdep_pthread)
  83. {
  84.     return(machdep_pthread->machdep_stack);
  85. }
  86. /* ==========================================================================
  87.  * machdep_pthread_start()
  88.  */
  89. void machdep_pthread_start(void)
  90. {
  91. context_switch_done();
  92. sig_check_and_resume();
  93.     /* Run current threads start routine with argument */
  94.     pthread_exit(pthread_run->machdep_data.start_routine
  95.       (pthread_run->machdep_data.start_argument));
  96.     /* should never reach here */
  97.     PANIC();
  98. }
  99. /* ==========================================================================
  100.  * machdep_pthread_create()
  101.  */
  102. void machdep_pthread_create(struct machdep_pthread *machdep_pthread,
  103.   void *(* start_routine)(), void *start_argument, long stack_size,
  104.   void *stack_start, long nsec)
  105. {
  106.     machdep_pthread->machdep_stack = stack_start;
  107.     machdep_pthread->start_routine = start_routine;
  108.     machdep_pthread->start_argument = start_argument;
  109.     machdep_pthread->machdep_timer.it_value.tv_sec = 0;
  110.     machdep_pthread->machdep_timer.it_interval.tv_sec = 0;
  111.     machdep_pthread->machdep_timer.it_interval.tv_usec = 0;
  112.     machdep_pthread->machdep_timer.it_value.tv_usec = nsec / 1000;
  113.     _setjmp(machdep_pthread->machdep_state);
  114.     /*
  115.      * Set up new stact frame so that it looks like it
  116.      * returned from a longjmp() to the beginning of
  117.      * machdep_pthread_start().
  118.      */
  119.     machdep_pthread->machdep_state[0] = (int)machdep_pthread_start;
  120.     /* Stack starts high and builds down. */
  121.     machdep_pthread->machdep_state[2] =
  122.       (int)machdep_pthread->machdep_stack + stack_size;
  123. }
  124. /* ==========================================================================
  125.  * machdep_sys_send()
  126.  */
  127. machdep_sys_send(int s, const void *buf, int len, int flags)
  128. {
  129. return(machdep_sys_sendto(s, buf, len, flags, (struct sockaddr*)NULL, 0));
  130. }
  131. /* ==========================================================================
  132.  * machdep_sys_recv()
  133.  */
  134. machdep_sys_recv(int s, void *buf, int len, int flags)
  135. {
  136. return(machdep_sys_recvfrom(s, buf, len, flags, (struct sockaddr*)NULL, 0));
  137. }