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

MySQL数据库

开发平台:

Visual C++

  1. /* ==== machdep.c ============================================================
  2.  * Copyright (c) 1993, 1994 Chris Provenzano, proven@athena.mit.edu
  3.  *
  4.  * Description : Machine dependent functions for Linux-1.0 on i386
  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. #include <pthread.h>
  13. #include <errno.h>
  14. #include <stdlib.h>
  15. #include <sys/uio.h>
  16. #include <sys/types.h>
  17. #include <sys/param.h> /* for OPEN_MAX */
  18. #include <sys/socket.h>
  19. #include <sys/socketcall.h>
  20. /* ==========================================================================
  21.  * machdep_save_state()
  22.  */
  23. int machdep_save_state(void)
  24. {
  25.     return(_setjmp(pthread_run->machdep_data.machdep_state));
  26. }
  27. /* ==========================================================================
  28.  * machdep_restore_state()
  29.  */
  30. void machdep_restore_state(void)
  31. {
  32.     longjmp(pthread_run->machdep_data.machdep_state, 1);
  33. }
  34. /* ==========================================================================
  35.  * machdep_save_float_state()
  36.  */
  37. int machdep_save_float_state(struct pthread * pthread)
  38. {
  39. char * fdata = (char *)pthread->machdep_data.machdep_float_state;
  40. __asm__ ("fsave %0"::"m" (*fdata));
  41. }
  42. /* ==========================================================================
  43.  * machdep_restore_float_state()
  44.  */
  45. int machdep_restore_float_state(void)
  46. {
  47. char * fdata = (char *)pthread_run->machdep_data.machdep_float_state;
  48. __asm__ ("frstor %0"::"m" (*fdata));
  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.  * __machdep_stack_alloc()
  98.  */
  99. void * __machdep_stack_alloc(size_t size)
  100. {
  101.     void * stack;
  102.     return(malloc(size));
  103. }
  104. /* ==========================================================================
  105.  * __machdep_pthread_create()
  106.  */
  107. void __machdep_pthread_create(struct machdep_pthread *machdep_pthread,
  108.   void *(* start_routine)(), void *start_argument, 
  109.   long stack_size, long nsec, long flag)
  110. {
  111.     machdep_pthread->start_routine = start_routine;
  112.     machdep_pthread->start_argument = start_argument;
  113.     machdep_pthread->machdep_timer.it_value.tv_sec = 0;
  114.     machdep_pthread->machdep_timer.it_interval.tv_sec = 0;
  115.     machdep_pthread->machdep_timer.it_interval.tv_usec = 0;
  116.     machdep_pthread->machdep_timer.it_value.tv_usec = nsec / 1000;
  117.     setjmp(machdep_pthread->machdep_state);
  118.     /*
  119.      * Set up new stact frame so that it looks like it
  120.      * returned from a longjmp() to the beginning of
  121.      * machdep_pthread_start().
  122.      */
  123.     machdep_pthread->machdep_state->__pc = (char *)machdep_pthread_start;
  124.     machdep_pthread->machdep_state->__bp = (char *)0;/* So the backtrace
  125.                                                       * is sensible (mevans) *
  126.     /* Stack starts high and builds down. */
  127.     machdep_pthread->machdep_state->__sp =
  128.       (char *)machdep_pthread->machdep_stack + stack_size;
  129. }
  130. /* ==========================================================================
  131.  * Linux Socket calls are a bit different
  132.  * ==========================================================================
  133.  * machdep_sys_socket()
  134.  */
  135. int machdep_sys_socket(int a, int b, int c)
  136. {
  137. int array[3];
  138. array[0] = (int)a;
  139. array[1] = (int)b;
  140. array[2] = (int)c;
  141. return(machdep_sys_socketcall(SYS_SOCKET, array));
  142. }
  143. /* ==========================================================================
  144.  * machdep_sys_accept()
  145.  */
  146. int machdep_sys_accept(int a, struct sockaddr * b, int * c)
  147. {
  148. int array[3];
  149. array[0] = (int)a;
  150. array[1] = (int)b;
  151. array[2] = (int)c;
  152. return(machdep_sys_socketcall(SYS_ACCEPT, array));
  153. }
  154. /* ==========================================================================
  155.  * machdep_sys_bind()
  156.  */
  157. int machdep_sys_bind(int a, const struct sockaddr * b, int c)
  158. {
  159. int array[3];
  160. array[0] = (int)a;
  161. array[1] = (int)b;
  162. array[2] = (int)c;
  163. return(machdep_sys_socketcall(SYS_BIND, array));
  164. }
  165. /* ==========================================================================
  166.  * machdep_sys_connect()
  167.  */
  168. int machdep_sys_connect(int a, const struct sockaddr * b, int c)
  169. {
  170. int array[3];
  171. array[0] = (int)a;
  172. array[1] = (int)b;
  173. array[2] = (int)c;
  174. return(machdep_sys_socketcall(SYS_CONNECT, array));
  175. }
  176. /* ==========================================================================
  177.  * machdep_sys_listen()
  178.  */
  179. int machdep_sys_listen(int a, const struct sockaddr * b, int c)
  180. {
  181. int array[3];
  182. array[0] = (int)a;
  183. array[1] = (int)b;
  184. array[2] = (int)c;
  185. return(machdep_sys_socketcall(SYS_LISTEN, array));
  186. }
  187. /* ==========================================================================
  188.  * machdep_sys_shutdown()
  189.  */
  190. int machdep_sys_shutdown(int a, int b)
  191. {
  192.     int array[2];
  193.     array[0] = (int)a;
  194.     array[1] = (int)b;
  195.     return(machdep_sys_socketcall(SYS_SHUTDOWN, array));
  196. }
  197. /* ==========================================================================
  198.  * machdep_sys_getsockopt()
  199.  */
  200. int machdep_sys_getsockopt(int a, int b, int c, char *d, int *e)
  201. {
  202. int array[5];
  203. array[0] = (int)a;
  204. array[1] = (int)b;
  205. array[2] = (int)c;
  206. array[3] = (int)d;
  207. array[4] = (int)e;
  208. return(machdep_sys_socketcall(SYS_GETSOCKOPT, array));
  209. }
  210. /* ==========================================================================
  211.  * machdep_sys_setsockopt()
  212.  */
  213. int machdep_sys_setsockopt(int a, int b, int c, char *d, int e)
  214. {
  215. int array[5];
  216. array[0] = (int)a;
  217. array[1] = (int)b;
  218. array[2] = (int)c;
  219. array[3] = (int)d;
  220. array[4] = (int)e;
  221. return(machdep_sys_socketcall(SYS_SETSOCKOPT, array));
  222. }
  223. /* ==========================================================================
  224.  * machdep_sys_getpeername()
  225.  */
  226. int machdep_sys_getpeername(int a, struct sockaddr *b, int *c)
  227. {
  228. int array[3];
  229. array[0] = (int)a;
  230. array[1] = (int)b;
  231. array[2] = (int)c;
  232. return(machdep_sys_socketcall(SYS_GETPEERNAME, array));
  233. }
  234. /* ==========================================================================
  235.  * machdep_sys_send()
  236.  */
  237. int machdep_sys_send(int a, char *b, int c, int d)
  238. {
  239. int array[4];
  240. array[0] = (int)a;
  241. array[1] = (int)b;
  242. array[2] = (int)c;
  243. array[3] = (int)d;
  244. return(machdep_sys_socketcall(SYS_SEND, array));
  245. }
  246. /* ==========================================================================
  247.  * machdep_sys_sendto()
  248.  */
  249. int machdep_sys_sendto(int a, char *b, int c, int d,
  250.   struct sockaddr *e, int f)
  251. {
  252. int array[6];
  253. array[0] = (int)a;
  254. array[1] = (int)b;
  255. array[2] = (int)c;
  256. array[3] = (int)d;
  257. array[4] = (int)e;
  258. array[5] = (int)f;
  259. return(machdep_sys_socketcall(SYS_SENDTO, array));
  260. }
  261. /* ==========================================================================
  262.  * machdep_sys_recv()
  263.  */
  264. int machdep_sys_recv(int a, char *b, int c, int d)
  265. {
  266. int array[4];
  267. array[0] = (int)a;
  268. array[1] = (int)b;
  269. array[2] = (int)c;
  270. array[3] = (int)d;
  271. return(machdep_sys_socketcall(SYS_RECV, array));
  272. }
  273. /* ==========================================================================
  274.  * machdep_sys_recvfrom()
  275.  */
  276. int machdep_sys_recvfrom(int a, char *b, int c, int d,
  277.   struct sockaddr *e, int *f)
  278. {
  279. int array[6];
  280. array[0] = (int)a;
  281. array[1] = (int)b;
  282. array[2] = (int)c;
  283. array[3] = (int)d;
  284. array[4] = (int)e;
  285. array[5] = (int)f;
  286. return(machdep_sys_socketcall(SYS_RECVFROM, array));
  287. }
  288. /* ==========================================================================
  289.  * machdep_sys_socketpair()
  290.  */
  291. int machdep_sys_socketpair(int a, int b, int c, int d[2])
  292. {
  293.     int array[4];
  294.     array[0] = (int)a;
  295.     array[1] = (int)b;
  296.     array[2] = (int)c;
  297.     array[3] = (int)d;
  298.     return(machdep_sys_socketcall(SYS_SOCKETPAIR, array));
  299. }
  300. /* ==========================================================================
  301.  * machdep_sys_getsockname()
  302.  */
  303. int machdep_sys_getsockname(int a, char * b, int * c)
  304. {
  305.     int array[3];
  306.     array[0] = (int)a;
  307.     array[1] = (int)b;
  308.     array[2] = (int)c;
  309.     return(machdep_sys_socketcall(SYS_GETSOCKNAME, array));
  310. }
  311. /* ==========================================================================
  312.  * machdep_sys_sendmsg()
  313.  */
  314. int machdep_sys_sendmsg(int a, char * b, int c)
  315. {
  316. #ifdef SYS_SENDMSG
  317.        int array[3];
  318.        array[0] = (int)a;
  319.        array[1] = (int)b;
  320.        array[2] = (int)c;
  321.        return(machdep_sys_socketcall(SYS_SENDMSG, array));
  322. #else
  323.         return(-ENOSYS);
  324. #endif
  325. }
  326. /* ==========================================================================
  327.  * machdep_sys_recvmsg()
  328.  */
  329. int machdep_sys_recvmsg(int a, char * b, int c)
  330. {
  331. #ifdef SYS_RECVMSG
  332.        int array[3];
  333.        array[0] = (int)a;
  334.        array[1] = (int)b;
  335.        array[2] = (int)c;
  336.        return(machdep_sys_socketcall(SYS_RECVMSG, array));
  337. #else
  338.        return(-ENOSYS);
  339. #endif
  340. }
  341. /* ==========================================================================
  342.  * machdep_sys_getdirentries()
  343.  */
  344. int machdep_sys_getdirentries(int fd, char * buf, int len, int * seek)
  345. {
  346. int ret;
  347. if ((ret = machdep_sys_readdir(fd, buf, 1)) > 0) {
  348. return(1);
  349. }
  350. return(ret);
  351. }
  352. /* ==========================================================================
  353.  * machdep_sys_wait3()
  354.  */
  355. machdep_sys_wait3(int * b, int c, int * d)
  356. {
  357.         return(machdep_sys_wait4(0, b, c, d));
  358. }
  359.  
  360. /* ==========================================================================
  361.  * machdep_sys_waitpid()
  362.  */
  363. machdep_sys_waitpid(int a, int * b, int c)
  364. {
  365.         return(machdep_sys_wait4(a, b, c, NULL));
  366. }  
  367. /* getdtablesize */
  368. machdep_sys_getdtablesize ()
  369. {
  370. return OPEN_MAX;
  371. }
  372. struct stat;
  373. /* ==========================================================================
  374.  * _fxstat()
  375.  */
  376. int _fxstat(int __ver, int fd, struct stat *buf)
  377. {
  378. int ret;
  379. if ((ret = fd_lock(fd, FD_READ, NULL)) == OK) {
  380. ret = machdep_sys_fstat(fd_table[fd]->fd.i, buf);
  381.         fd_unlock(fd, FD_READ);
  382.     }
  383.     return(ret);
  384. }
  385. /* ==========================================================================
  386.  * _lxstat()
  387.  */
  388. int _lxstat(int __ver, const char * path, struct stat * buf)
  389. {
  390. int ret;
  391. if ((ret = machdep_sys_lstat(path, buf)) < OK) {
  392. SET_ERRNO(-ret);
  393. }
  394. return(ret);
  395. }
  396. /* ==========================================================================
  397.  * _xstat()
  398.  */
  399. int _xstat(int __ver, const char * path, struct stat * buf)
  400. {
  401. int ret;
  402. if ((ret = machdep_sys_stat(path, buf)) < OK) {
  403. SET_ERRNO(-ret);
  404. }
  405. return(ret);
  406. }
  407. /* ==========================================================================
  408.  * strtol()
  409.  */
  410. __strtol_internal(char * a, char ** b, int c)
  411. {
  412. return(strtol(a, b, c));
  413. }