void AsyncFile::readvReq( Request * request) { #if ! defined(HAVE_PREAD) readReq(request); return; #elif defined NDB_WIN32 // ReadFileScatter? readReq(request); return; #else int return_value; int length = 0; struct iovec iov[20]; // the parameter in the signal restricts this to 20 deep for(int i=0; i < request->par.readWrite.numberOfPages ; i++) { iov[i].iov_base= request->par.readWrite.pages[i].buf; iov[i].iov_len= request->par.readWrite.pages[i].size; length = length + iov[i].iov_len; } lseek( theFd, request->par.readWrite.pages[0].offset, SEEK_SET ); return_value = ::readv(theFd, iov, request->par.readWrite.numberOfPages); if (return_value == -1) { request->error = errno; return; } else if (return_value != length) { request->error = 1011; return; } #endif }
void AsyncFile::run() { Request *request; // Create theMemoryChannel in the thread that will wait for it NdbMutex_Lock(theStartMutexPtr); theMemoryChannelPtr = new MemoryChannel<Request>(); theStartFlag = true; // Create write buffer for bigger writes theWriteBufferSize = WRITEBUFFERSIZE; theWriteBufferUnaligned = (char *) ndbd_malloc(theWriteBufferSize + NDB_O_DIRECT_WRITE_ALIGNMENT-1); theWriteBuffer = (char *) (((UintPtr)theWriteBufferUnaligned + NDB_O_DIRECT_WRITE_ALIGNMENT - 1) & ~(UintPtr)(NDB_O_DIRECT_WRITE_ALIGNMENT - 1)); NdbMutex_Unlock(theStartMutexPtr); NdbCondition_Signal(theStartConditionPtr); if (!theWriteBuffer) { DEBUG(ndbout_c("AsyncFile::writeReq, Failed allocating write buffer")); return; }//if while (1) { request = theMemoryChannelPtr->readChannel(); if (!request) { DEBUG(ndbout_c("Nothing read from Memory Channel in AsyncFile")); endReq(); return; }//if m_current_request= request; switch (request->action) { case Request:: open: openReq(request); break; case Request:: close: closeReq(request); break; case Request:: closeRemove: closeReq(request); removeReq(request); break; case Request:: readPartial: case Request:: read: readReq(request); break; case Request:: readv: readvReq(request); break; case Request:: write: writeReq(request); break; case Request:: writev: writevReq(request); break; case Request:: writeSync: writeReq(request); syncReq(request); break; case Request:: writevSync: writevReq(request); syncReq(request); break; case Request:: sync: syncReq(request); break; case Request:: append: appendReq(request); break; case Request:: append_synch: appendReq(request); syncReq(request); break; case Request::rmrf: rmrfReq(request, (char*)theFileName.c_str(), request->par.rmrf.own_directory); break; case Request:: end: if (theFd > 0) closeReq(request); endReq(); return; default: DEBUG(ndbout_c("Invalid Request")); abort(); break; }//switch m_last_request= request; m_current_request= 0; // No need to signal as ndbfs only uses tryRead theReportTo->writeChannelNoSignal(request); }//while }//AsyncFile::run()
void AsyncFile::readvReq( Request * request) { readReq(request); return; }