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