solaris.txt
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #ifdef OS_solaris
  2.  * This is all for Solaris 2.6.
  3.  *
  4.  * Sun defined a new API in Solaris2.6 to be used when manipulating large
  5.  * (>2Gbyte) files.  This API isn't present in 2.5.x, so we can't simply
  6.  * call it -- that would mean two binaries, one for 2.5.x and the other for
  7.  * 2.6. Not pretty.  So, what we do here is determine the OS on which we're
  8.  * running at runtime, and adjust the underlying Berkeley DB calls to use
  9.  * the new API if it's there.
  10.  */
  11. /* This must match the definition of stat64 in Solaris2.6 */
  12. struct our_stat64 {
  13.         dev_t   st_dev;
  14.         long    st_pad1[3];     /* reserve for dev expansion */
  15.         u_longlong_t st_ino;
  16.         mode_t  st_mode;
  17.         nlink_t st_nlink;
  18.         uid_t   st_uid;
  19.         gid_t   st_gid;
  20.         dev_t   st_rdev;
  21.         long    st_pad2[2];
  22.         longlong_t st_size;
  23.         timestruc_t mst_atime;
  24.         timestruc_t mst_mtime;
  25.         timestruc_t mst_ctime;
  26.         long    st_blksize;
  27.         longlong_t st_blocks;   /* large file support */
  28.         char    st_fstype[_ST_FSTYPSZ];
  29.         long    st_pad4[8];     /* expansion area */
  30. };
  31. #define MEGABYTE (1024 * 1024)
  32. typedef int (*open_fn)(const char *path, int flags, ...);
  33. typedef longlong_t (*lseek64_fn)(int fildes, longlong_t offset, int whence);
  34. typedef longlong_t (*fstat64_fn)(int fildes, struct our_stat64 *s);
  35. typedef void* (*mmap64_fn)(void* addr, size_t len, int prot, int flags,
  36. int filedes, longlong_t off);
  37. static fstat64_fn os_fstat64_fn = NULL;
  38. static lseek64_fn os_lseek64_fn = NULL;
  39. static mmap64_fn os_mmap64_fn = NULL;
  40. static open_fn os_open64_fn = NULL;
  41. static int dblayer_load_largefile_fns()
  42. {
  43. void *lib_handle = NULL;
  44. void *function_found = NULL;
  45. int ret = 0;
  46. lib_handle = dlopen(NULL, RTLD_NOW);
  47. if (NULL == lib_handle)
  48. return (-1);
  49. function_found = dlsym(lib_handle,"open64");
  50. if (NULL == function_found)
  51. return (-1);
  52. os_open64_fn = (open_fn)function_found;
  53. function_found = dlsym(lib_handle,"lseek64");
  54. if (NULL == function_found)
  55. return (-1);
  56. os_lseek64_fn = (lseek64_fn)function_found;
  57. function_found = dlsym(lib_handle,"fstat64");
  58. if (NULL == function_found)
  59. return (-1);
  60. os_fstat64_fn = (fstat64_fn)function_found;
  61. function_found = dlsym(lib_handle,"mmap64");
  62. if (NULL == function_found)
  63. return (-1);
  64. os_mmap64_fn = (mmap64_fn)function_found;
  65. return 0;
  66. }
  67. /* Helper function for large seeks */
  68. static int dblayer_seek_fn_solaris(int fd,
  69.     size_t pgsize, db_pgno_t pageno, u_long relative, int whence)
  70. {
  71. longlong_t offset = 0;
  72. longlong_t ret = 0;
  73. if (NULL == os_lseek64_fn) {
  74. return -1;
  75. }
  76. offset = (longlong_t)pgsize * pageno + relative;
  77. ret = (*os_lseek64_fn)(fd,offset,whence);
  78. return (ret == -1) ? errno : 0;
  79. }
  80. /* Helper function for large file mmap */
  81. static int dblayer_map_solaris(fd, len, is_private, is_rdonly, addr)
  82. int fd, is_private, is_rdonly;
  83. size_t len;
  84. void **addr;
  85. {
  86. void *p;
  87. int flags, prot;
  88. flags = is_private ? MAP_PRIVATE : MAP_SHARED;
  89. prot = PROT_READ | (is_rdonly ? 0 : PROT_WRITE);
  90. if ((p = (*os_mmap64_fn)(NULL,
  91.     len, prot, flags, fd, (longlong_t)0)) == (void *)MAP_FAILED)
  92. return (errno);
  93. *addr = p;
  94. return (0);
  95. }
  96. /* Helper function for large fstat */
  97. static int dblayer_ioinfo_solaris(const char *path,
  98.     int fd, u_int32_t *mbytesp, u_int32_t *bytesp, u_int32_t *iosizep)
  99. {
  100. struct our_stat64 sb;
  101. if (NULL == os_fstat64_fn) {
  102. return -1;
  103. }
  104. if ((*os_fstat64_fn)(fd, &sb) == -1)
  105. return (errno);
  106. /* Return the size of the file. */
  107. if (mbytesp != NULL)
  108. *mbytesp = (u_int32_t) (sb.st_size / (longlong_t)MEGABYTE);
  109. if (bytesp != NULL)
  110. *bytesp = (u_int32_t) (sb.st_size % (longlong_t)MEGABYTE);
  111. /*
  112.  * Return the underlying filesystem blocksize, if available.  Default
  113.  * to 8K on the grounds that most OS's use less than 8K as their VM
  114.  * page size.
  115.  */
  116. if (iosizep != NULL)
  117. *iosizep = sb.st_blksize;
  118. return (0);
  119. }
  120. #endif
  121. #ifdef irix
  122.  * A similar mess to Solaris: a new API added in IRIX6.2 to support large
  123.  * files. We always build on 6.2 or later, so no need to do the same song
  124.  * and dance as on Solaris -- we always have the header files for the
  125.  * 64-bit API.
  126.  */
  127. /* Helper function for large seeks */
  128. static int dblayer_seek_fn_irix(int fd,
  129.     size_t pgsize, db_pgno_t pageno, u_long relative, int whence)
  130. {
  131. off64_t offset = 0;
  132. off64_t ret = 0;
  133. offset = (off64_t)pgsize * pageno + relative;
  134. ret = lseek64(fd,offset,whence);
  135. return (ret == -1) ? errno : 0;
  136. }
  137. /* Helper function for large fstat */
  138. static int dblayer_ioinfo_irix(const char *path,
  139.     int fd, u_int32_t *mbytesp, u_int32_t *bytesp, u_int32_t *iosizep)
  140. {
  141. struct stat64 sb;
  142. if (fstat64(fd, &sb) == -1) {
  143. return (errno);
  144. }
  145. /* Return the size of the file. */
  146. if (mbytesp != NULL)
  147. *mbytesp = (u_int32_t) (sb.st_size / (off64_t)MEGABYTE);
  148. if (bytesp != NULL)
  149. *bytesp = (u_int32_t) (sb.st_size % (off64_t)MEGABYTE);
  150. if (iosizep != NULL)
  151. *iosizep = sb.st_blksize;
  152. return (0);
  153. }
  154. #endif /* irix */
  155. static int dblayer_override_libdb_functions(dblayer_private *priv)
  156. {
  157. #if defined(OS_solaris)
  158. int ret = 0;
  159. ret = dblayer_load_largefile_fns();
  160. if (0 != ret) {
  161. Debug("Not Solaris2.6: no large file support enabledn");
  162. } else {
  163. /* Means we did get the XXX64 functions, so let's use them */
  164. db_jump_set((void*)os_open64_fn, DB_FUNC_OPEN);
  165. db_jump_set((void*)dblayer_seek_fn_solaris, DB_FUNC_SEEK);
  166. db_jump_set((void*)dblayer_ioinfo_solaris, DB_FUNC_IOINFO);
  167. db_jump_set((void*)dblayer_map_solaris, DB_FUNC_MAP);
  168. Debug("Solaris2.6: selected 64-bit file handling.n");
  169.  }
  170. #else
  171. #if defined (irix)
  172. db_jump_set((void*)dblayer_seek_fn_irix, DB_FUNC_SEEK);
  173. db_jump_set((void*)dblayer_ioinfo_irix, DB_FUNC_IOINFO);
  174. #endif /* irix */
  175. #endif /* OS_solaris */
  176. return 0;
  177. }