AsyncFile.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef AsyncFile_H
  14. #define AsyncFile_H
  15. //===========================================================================
  16. //
  17. // .DESCRIPTION
  18. //    Asynchronous file, All actions are executed concurrently with other 
  19. //    activity of the process. 
  20. //    Because all action are performed in a seperated thread the result of 
  21. //    of a action is send back tru a memory channel. 
  22. //    For the asyncronise notivication of a finished request all the calls
  23. //    have a request as paramater, the user can use the userData pointer
  24. //    to add information it needs when the request is send back.
  25. //      
  26. //
  27. // .TYPICAL USE:
  28. //      Writing or reading data to/from disk concurrently to other activities.
  29. //
  30. //===========================================================================
  31. //=============================================================================
  32. //
  33. // .PUBLIC
  34. //
  35. //=============================================================================
  36. ///////////////////////////////////////////////////////////////////////////////
  37. //
  38. // AsyncFile( );
  39. // Description:
  40. //   Initialisation of the class. 
  41. // Parameters:
  42. //      -
  43. ///////////////////////////////////////////////////////////////////////////////
  44. //
  45. // ~AsyncFile( );
  46. // Description:
  47. //   Tell the thread to stop and wait for it to return
  48. // Parameters:
  49. //      -
  50. ///////////////////////////////////////////////////////////////////////////////
  51. // 
  52. // doStart( );
  53. // Description: 
  54. //   Spawns the new  thread.
  55. // Parameters:
  56. //  Base path of filesystem
  57. //
  58. ///////////////////////////////////////////////////////////////////////////////
  59. //
  60. // void execute(Request *request);
  61. // Description:
  62. //   performens the requered action.
  63. // Parameters:
  64. //    request: request to be called when open is finished.
  65. //       action= open|close|read|write|sync
  66. //          if action is open then:
  67. //             par.open.flags= UNIX open flags, see man open
  68. //             par.open.name= name of the file to open
  69. //          if action is read or write then:
  70. //             par.readWrite.buf= user provided buffer to read/write 
  71. //             the data from/to
  72. //             par.readWrite.size= how many bytes must be read/written
  73. //             par.readWrite.offset= absolute offset in file in bytes
  74. // return:
  75. //    return values are stored in the request error field:
  76. //       error= return state of the action, UNIX error see man open/errno
  77. //       userData= is untouched can be used be user.
  78. //      
  79. ///////////////////////////////////////////////////////////////////////////////
  80. //
  81. // void reportTo( MemoryChannel<Request> *reportTo );
  82. // Description:
  83. //   set the channel where the file must report the result of the 
  84. //    actions back to.
  85. // Parameters:
  86. //    reportTo: the memory channel to use use MemoryChannelMultipleWriter 
  87. //              if more 
  88. //              than one file uses this channel to report back.
  89. //      
  90. ///////////////////////////////////////////////////////////////////////////////
  91. #include <kernel_types.h>
  92. #include "MemoryChannel.hpp"
  93. #include "Filename.hpp"
  94. const int ERR_ReadUnderflow = 1000;
  95. const int WRITECHUNK = 262144;
  96. class AsyncFile;
  97. class Request
  98. {
  99. public:
  100.   enum Action {
  101.     open,
  102.     close,
  103.     closeRemove,
  104.     read,   // Allways leave readv directly after 
  105.             // read because SimblockAsyncFileSystem depends on it
  106.     readv,
  107.     write,// Allways leave writev directly after 
  108.         // write because SimblockAsyncFileSystem depends on it
  109.     writev,
  110.     writeSync,// Allways leave writevSync directly after 
  111.     // writeSync because SimblockAsyncFileSystem depends on it
  112.     writevSync,
  113.     sync,
  114.     end,
  115.     append,
  116.     rmrf
  117.   };
  118.   Action action;
  119.   union {
  120.     struct {
  121.       Uint32 flags;
  122.     } open;
  123.     struct {
  124.       int numberOfPages;
  125.       struct{
  126. char *buf;
  127. size_t size;
  128. off_t offset;
  129.       } pages[16];
  130.     } readWrite;
  131.     struct {
  132.       const char * buf;
  133.       size_t size;
  134.     } append;
  135.     struct {
  136.       bool directory;
  137.       bool own_directory;
  138.     } rmrf;
  139.   } par;
  140.   int error;
  141.   
  142.   void set(BlockReference userReference, 
  143.    Uint32 userPointer,
  144.    Uint16 filePointer);
  145.   BlockReference theUserReference;
  146.   Uint32 theUserPointer;
  147.   Uint16 theFilePointer;
  148.    // Information for open, needed if the first open action fails.
  149.   AsyncFile* file;
  150.   Uint32 theTrace;
  151. };
  152. inline
  153. void 
  154. Request::set(BlockReference userReference, 
  155.      Uint32 userPointer, Uint16 filePointer) 
  156. {
  157.   theUserReference= userReference;
  158.   theUserPointer= userPointer;
  159.   theFilePointer= filePointer;
  160. }
  161. class AsyncFile
  162. {
  163. public:
  164.   AsyncFile();
  165.   ~AsyncFile();
  166.   
  167.   void reportTo( MemoryChannel<Request> *reportTo );
  168.   
  169.   void execute( Request* request );
  170.   
  171.   void doStart(Uint32 nodeId, const char * fspath, const char * backup_path);
  172.   // its a thread so its always running
  173.   void run();   
  174.   bool isOpen();
  175.   Filename theFileName;
  176. private:
  177.   
  178.   void openReq(Request *request);
  179.   void readReq(Request *request);
  180.   void readvReq(Request *request);
  181.   void writeReq(Request *request);
  182.   void writevReq(Request *request);
  183.   
  184.   void closeReq(Request *request);
  185.   void syncReq(Request *request);
  186.   void removeReq(Request *request);
  187.   void appendReq(Request *request);
  188.   void rmrfReq(Request *request, char * path, bool removePath);
  189.   void endReq();
  190.   
  191.   int readBuffer(char * buf, size_t size, off_t offset);
  192.   int writeBuffer(const char * buf, size_t size, off_t offset,
  193.   size_t chunk_size = WRITECHUNK);
  194.   
  195.   int extendfile(Request* request);
  196.   void createDirectories();
  197.     
  198. #ifdef NDB_WIN32
  199.   HANDLE hFile;
  200. #else
  201.   int theFd;
  202. #endif
  203.   
  204.   MemoryChannel<Request> *theReportTo;
  205.   MemoryChannel<Request>* theMemoryChannelPtr;
  206.   
  207.   struct NdbThread* theThreadPtr;
  208.   NdbMutex* theStartMutexPtr;
  209.   NdbCondition* theStartConditionPtr;
  210.   bool   theStartFlag;
  211.   int theWriteBufferSize;
  212.   char* theWriteBuffer;
  213.   
  214.   bool m_openedWithSync;
  215.   Uint32 m_syncCount;
  216.   Uint32 m_syncFrequency;
  217. };
  218. #endif