void REMOTE_release_request( Rrq* request) { /************************************** * * R E M O T E _ r e l e a s e _ r e q u e s t * ************************************** * * Functional description * Release a request block and friends. * **************************************/ Rdb* rdb = request->rrq_rdb; for (Rrq** p = &rdb->rdb_requests; *p; p = &(*p)->rrq_next) { if (*p == request) { *p = request->rrq_next; break; } } // Get rid of request and all levels for (;;) { Rrq::rrq_repeat* tail = request->rrq_rpt.begin(); const Rrq::rrq_repeat* const end = tail + request->rrq_max_msg; for (; tail <= end; tail++) { RMessage* message = tail->rrq_message; if (message) { if (!request->rrq_level) { #ifdef DEBUG_REMOTE_MEMORY printf("REMOTE_release_request free format %x\n", tail->rrq_format); #endif delete tail->rrq_format; } REMOTE_release_messages(message); } } Rrq* next = request->rrq_levels; #ifdef DEBUG_REMOTE_MEMORY printf("REMOTE_release_request free request %x\n", request); #endif delete request; if (!(request = next)) break; } }
void REMOTE_reset_statement( Rsr* statement) { /************************************** * * R E M O T E _ r e s e t _ s t a t e m e n t * ************************************** * * Functional description * Reset a statement by releasing all buffers except 1 * **************************************/ RMessage* message; if (!statement || (!(message = statement->rsr_message))) return; // Reset all the pipeline counters statement->rsr_rows_pending = 0; statement->rsr_msgs_waiting = 0; statement->rsr_reorder_level = 0; statement->rsr_batch_count = 0; // only one entry if (message->msg_next == message) return; // find the entry before statement->rsr_message RMessage* temp = message->msg_next; while (temp->msg_next != message) temp = temp->msg_next; temp->msg_next = message->msg_next; message->msg_next = message; #ifdef SCROLLABLE_CURSORS message->msg_prior = message; #endif statement->rsr_buffer = statement->rsr_message; REMOTE_release_messages(temp); }