MYBOOL LUSOL_realloc_a(LUSOLrec *LUSOL, int newsize) { int oldsize; if(newsize < 0) newsize = LUSOL->lena + MAX(abs(newsize), LUSOL_MINDELTA_a); oldsize = LUSOL->lena; LUSOL->lena = newsize; if(newsize > 0) newsize++; if(oldsize > 0) oldsize++; LUSOL->a = (REAL *) clean_realloc(LUSOL->a, sizeof(*(LUSOL->a)), newsize, oldsize); LUSOL->indc = (int *) clean_realloc(LUSOL->indc, sizeof(*(LUSOL->indc)), newsize, oldsize); LUSOL->indr = (int *) clean_realloc(LUSOL->indr, sizeof(*(LUSOL->indr)), newsize, oldsize); if((newsize == 0) || ((LUSOL->a != NULL) && (LUSOL->indc != NULL) && (LUSOL->indr != NULL))) return( TRUE ); else return( FALSE ); }
/** @brief Looks at the number of used frames in all workspaces and checks if the maximum number of frames has been reached. If max has been reached, it increases the available frame slots if possible. @return True on success, False otherwise. **/ static Bool ensure_empty_frame_slots(struct Workspace_list *workspaces) { //increase the number of slots for frames if necessary if(workspaces->used_frames == workspaces->max_frames) { struct Frame* temp = realloc(workspaces->frame_list, sizeof(struct Frame) * workspaces->max_frames * 2); if(!temp) { perror("Error: could not reallocate frame list"); return False;} //all the saved pointers in all the workspaces are now invalid. Time to update them. for(int k = 0; k < workspaces->used_workspaces; k++) { struct Workspace *frames = &workspaces->list[k]; if(frames->list != NULL) { for(int i = 0; i < frames->used; i++) { int real_frame_index = get_offset_in_array(frames->list[i], workspaces->frame_list, sizeof(struct Frame)); frames->list[i] = &temp[real_frame_index]; } } } workspaces->frame_list = temp; //increase the number of states in each workspace to match the number of available frames for(int k = 0; k < workspaces->used_workspaces; k++) { struct Saved_frame_state* temp2 = clean_realloc(workspaces->list[k].states, sizeof(struct Saved_frame_state) * workspaces->max_frames, sizeof(struct Saved_frame_state) * workspaces->max_frames * 2); if(!temp2) { perror("Error: could not reallocate frame states list"); return False;} //lets say this loops fails halfway through, the window isn't mapped and there won't be any memory leaks. // If another windows is then added and there is more memory, it will just reallocate some to a memory slot the same size. workspaces->list[k].states = temp2; } workspaces->max_frames *= 2; } return True; }
MYBOOL LUSOL_realloc_r(LUSOLrec *LUSOL, int newsize) { int oldsize; if(newsize < 0) newsize = LUSOL->maxm + MAX(abs(newsize), LUSOL_MINDELTA_rc); oldsize = LUSOL->maxm; LUSOL->maxm = newsize; if(newsize > 0) newsize++; if(oldsize > 0) oldsize++; LUSOL->lenr = (int *) clean_realloc(LUSOL->lenr, sizeof(*(LUSOL->lenr)), newsize, oldsize); LUSOL->ip = (int *) clean_realloc(LUSOL->ip, sizeof(*(LUSOL->ip)), newsize, oldsize); LUSOL->iqloc = (int *) clean_realloc(LUSOL->iqloc, sizeof(*(LUSOL->iqloc)), newsize, oldsize); LUSOL->ipinv = (int *) clean_realloc(LUSOL->ipinv, sizeof(*(LUSOL->ipinv)), newsize, oldsize); LUSOL->locr = (int *) clean_realloc(LUSOL->locr, sizeof(*(LUSOL->locr)), newsize, oldsize); if((newsize == 0) || ((LUSOL->lenr != NULL) && (LUSOL->ip != NULL) && (LUSOL->iqloc != NULL) && (LUSOL->ipinv != NULL) && (LUSOL->locr != NULL))) { #ifndef ClassicHamaxR #ifdef AlwaysSeparateHamaxR if(LUSOL->luparm[LUSOL_IP_PIVOTTYPE] == LUSOL_PIVMOD_TRP) #endif { LUSOL->amaxr = (REAL *) clean_realloc(LUSOL->amaxr, sizeof(*(LUSOL->amaxr)), newsize, oldsize); if((newsize > 0) && (LUSOL->amaxr == NULL)) return( FALSE ); } #endif return( TRUE ); } else return( FALSE ); }
MYBOOL LUSOL_realloc_c(LUSOLrec *LUSOL, int newsize) { int oldsize; if(newsize < 0) newsize = LUSOL->maxn + MAX(abs(newsize), LUSOL_MINDELTA_rc); oldsize = LUSOL->maxn; LUSOL->maxn = newsize; if(newsize > 0) newsize++; if(oldsize > 0) oldsize++; LUSOL->lenc = (int *) clean_realloc(LUSOL->lenc, sizeof(*(LUSOL->lenc)), newsize, oldsize); LUSOL->iq = (int *) clean_realloc(LUSOL->iq, sizeof(*(LUSOL->iq)), newsize, oldsize); LUSOL->iploc = (int *) clean_realloc(LUSOL->iploc, sizeof(*(LUSOL->iploc)), newsize, oldsize); LUSOL->iqinv = (int *) clean_realloc(LUSOL->iqinv, sizeof(*(LUSOL->iqinv)), newsize, oldsize); LUSOL->locc = (int *) clean_realloc(LUSOL->locc, sizeof(*(LUSOL->locc)), newsize, oldsize); LUSOL->w = (REAL *) clean_realloc(LUSOL->w, sizeof(*(LUSOL->w)), newsize, oldsize); #ifdef LUSOLSafeFastUpdate LUSOL->vLU6L = (REAL *) clean_realloc(LUSOL->vLU6L, sizeof(*(LUSOL->vLU6L)), newsize, oldsize); #else LUSOL->vLU6L = LUSOL->w; #endif if((newsize == 0) || ((LUSOL->w != NULL) && (LUSOL->lenc != NULL) && (LUSOL->iq != NULL) && (LUSOL->iploc != NULL) && (LUSOL->iqinv != NULL) && (LUSOL->locc != NULL))) { #ifndef ClassicHamaxR if(LUSOL->luparm[LUSOL_IP_PIVOTTYPE] == LUSOL_PIVMOD_TCP) { LUSOL->Ha = (REAL *) clean_realloc(LUSOL->Ha, sizeof(*(LUSOL->Ha)), newsize, oldsize); LUSOL->Hj = (int *) clean_realloc(LUSOL->Hj, sizeof(*(LUSOL->Hj)), newsize, oldsize); LUSOL->Hk = (int *) clean_realloc(LUSOL->Hk, sizeof(*(LUSOL->Hk)), newsize, oldsize); if((newsize > 0) && ((LUSOL->Ha == NULL) || (LUSOL->Hj == NULL) || (LUSOL->Hk == NULL))) return( FALSE ); } #endif #ifndef ClassicdiagU if(LUSOL->luparm[LUSOL_IP_KEEPLU] == FALSE) { LUSOL->diagU = (REAL *) clean_realloc(LUSOL->diagU, sizeof(*(LUSOL->diagU)), newsize, oldsize); if((newsize > 0) && (LUSOL->diagU == NULL)) return( FALSE ); } #endif return( TRUE ); } else return( FALSE ); }