/// <summary> /// Grows the size of the request allocation tables by 33%. /// /// This *MUST* be called with the reqlock held! /// </summary> /// <returns>ID to use for a new request.</returns> /// <param name="curlen">Current length of the allocation tables.</param> int GrowRequests (ref int curlen) { int newsize = curlen + curlen/3; var new_request_ids = new int [newsize]; var new_requests = new Worker [newsize]; var new_buffers = new byte [newsize][]; request_ids.CopyTo (new_request_ids, 0); Array.Clear (request_ids, 0, request_ids.Length); request_ids = new_request_ids; requests.CopyTo (new_requests, 0); Array.Clear (requests, 0, requests.Length); requests = new_requests; buffers.CopyTo (new_buffers, 0); Array.Clear (buffers, 0, buffers.Length); buffers = new_buffers; curlen = newsize; return curlen + 1; }
// Grows the size of the request allocation tables by 33%. // // Parameters: // curlen - current length of the allocation tables. // newid - ID to use for a new request. // // This *MUST* be called with the reqlock held! // void GrowRequests(ref int curlen, ref int newid) { int newsize = curlen + curlen/3; int[] new_request_ids = new int [newsize]; Worker[] new_requests = new Worker [newsize]; byte[][] new_buffers = new byte [newsize][]; request_ids.CopyTo (new_request_ids, 0); Array.Clear (request_ids, 0, request_ids.Length); request_ids = new_request_ids; requests.CopyTo (new_requests, 0); Array.Clear (requests, 0, requests.Length); requests = new_requests; buffers.CopyTo (new_buffers, 0); Array.Clear (buffers, 0, buffers.Length); buffers = new_buffers; newid = curlen + 1; curlen = newsize; }
public int RegisterRequest (Worker worker) { int result; lock (reqlock) { result = IdToIndex (GetNextRequestId ()); requests [result] = worker; // Don't create a new array if one already exists. byte[] a = buffers [result]; if (a == null) buffers [result] = new byte [BUFFER_SIZE]; } return request_ids [result]; }
/// <summary> /// Registers a request with the current instance. /// </summary> /// <param name="worker"> /// A <see cref="Worker" /> object containing the request to /// register. /// </param> /// <returns> /// A <see cref="int" /> containing the ID of the request. /// </returns> public int RegisterRequest(Worker worker) { int result = -1; lock (reqlock) { result = IdToIndex (GetNextRequestId ()); requests [result] = worker; // Don't create a new array if one already // exists. byte[] a = buffers [result]; if (a == null || a.Length != 16384) buffers [result] = new byte [16384]; } return request_ids [result]; }