/** * Receive as many items as possible from the given byte buffer to this buffer. * * <p>The <TT>receiveItems()</TT> method must not block the calling thread; if it does, all * message I/O in MP will be blocked. * * @param i Index of first item to receive, in the range 0 .. <TT>length</TT>-1. * @param num Maximum number of items to receive. * @param buffer Byte buffer. * @return Number of items received. */ protected int receiveItems(int i, int num, ByteBuffer buffer) { LongBuffer longbuffer = buffer.asLongBuffer(); int n = 0; int r = i / myColCount; int row = r * myRowStride + myLowerRow; int c = i % myColCount; int col = c * myColStride + myLowerCol; int ncols = Math.min(myColCount - c, longbuffer.remaining()); while (r < myRowCount && ncols > 0) { long[] myMatrix_row = myMatrix[row]; while (c < ncols) { myMatrix_row[col] = myOp.op(myMatrix_row[col], longbuffer.get()); ++c; col += myColStride; } n += ncols; ++r; row += myRowStride; c = 0; col = myLowerCol; ncols = Math.min(myColCount, longbuffer.remaining()); } buffer.position(buffer.position() + 8 * n); return n; }
/** * Store the given item in this buffer. * * <p>The <TT>put()</TT> method must not block the calling thread; if it does, all message I/O in * MP will be blocked. * * @param i Item index in the range 0 .. <TT>length()</TT>-1. * @param item Item to be stored at index <TT>i</TT>. */ public void put(int i, long item) { int row = (i / myColCount) * myRowStride + myLowerRow; int col = (i % myColCount) * myColStride + myLowerCol; myMatrix[row][col] = myOp.op(myMatrix[row][col], item); }