@@ -2060,6 +2060,7 @@ struct release_t {
20602060int hugetlb_allocated = 0 ;
20612061
20622062static struct release_t release_info [NUM_BUFFERS ];
2063+ static struct release_t * new_release_info ;
20632064static int release_pos = 0 ;
20642065
20652066#if defined(OS_LINUX ) && !defined(NO_WARMUP )
@@ -2110,8 +2111,13 @@ static void *alloc_mmap(void *address){
21102111#if (defined(SMP ) || defined(USE_LOCKING )) && !defined(USE_OPENMP )
21112112 LOCK_COMMAND (& alloc_lock );
21122113#endif
2114+ if (release_pos < NUM_BUFFERS ) {
21132115 release_info [release_pos ].address = map_address ;
21142116 release_info [release_pos ].func = alloc_mmap_free ;
2117+ } else {
2118+ new_release_info [release_pos - NUM_BUFFERS ].address = map_address ;
2119+ new_release_info [release_pos - NUM_BUFFERS ].func = alloc_mmap_free ;
2120+ }
21152121 release_pos ++ ;
21162122#if (defined(SMP ) || defined(USE_LOCKING )) && !defined(USE_OPENMP )
21172123 UNLOCK_COMMAND (& alloc_lock );
@@ -2274,8 +2280,13 @@ static void *alloc_mmap(void *address){
22742280#if (defined(SMP ) || defined(USE_LOCKING )) && !defined(USE_OPENMP )
22752281 LOCK_COMMAND (& alloc_lock );
22762282#endif
2283+ if (release_pos < NUM_BUFFERS ) {
22772284 release_info [release_pos ].address = map_address ;
22782285 release_info [release_pos ].func = alloc_mmap_free ;
2286+ { else {
2287+ new_release_info [release_pos - NUM_BUFFERS ].address = map_address ;
2288+ new_release_info [release_pos - NUM_BUFFERS ].func = alloc_mmap_free ;
2289+ }
22792290 release_pos ++ ;
22802291#if (defined(SMP ) || defined(USE_LOCKING )) && !defined(USE_OPENMP )
22812292 UNLOCK_COMMAND (& alloc_lock );
@@ -2307,8 +2318,13 @@ static void *alloc_malloc(void *address){
23072318 if (map_address == (void * )NULL ) map_address = (void * )-1 ;
23082319
23092320 if (map_address != (void * )-1 ) {
2321+ if (release_pos < NUM_BUFFERS ) {
23102322 release_info [release_pos ].address = map_address ;
23112323 release_info [release_pos ].func = alloc_malloc_free ;
2324+ } else {
2325+ new_release_info [release_pos - NUM_BUFFERS ].address = map_address ;
2326+ new_release_info [release_pos - NUM_BUFFERS ].func = alloc_malloc_free ;
2327+ }
23122328 release_pos ++ ;
23132329 }
23142330
@@ -2341,8 +2357,13 @@ static void *alloc_qalloc(void *address){
23412357 if (map_address == (void * )NULL ) map_address = (void * )-1 ;
23422358
23432359 if (map_address != (void * )-1 ) {
2360+ if (release_pos < NUM_BUFFERS ) {
23442361 release_info [release_pos ].address = map_address ;
23452362 release_info [release_pos ].func = alloc_qalloc_free ;
2363+ } else {
2364+ new_release_info [release_pos - NUM_BUFFERS ].address = map_address ;
2365+ new_release_info [release_pos - NUM_BUFFERS ].func = alloc_qalloc_free ;
2366+ }
23462367 release_pos ++ ;
23472368 }
23482369
@@ -2370,8 +2391,13 @@ static void *alloc_windows(void *address){
23702391 if (map_address == (void * )NULL ) map_address = (void * )-1 ;
23712392
23722393 if (map_address != (void * )-1 ) {
2394+ if (release_pos < NUM_BUFFERS ) {
23732395 release_info [release_pos ].address = map_address ;
23742396 release_info [release_pos ].func = alloc_windows_free ;
2397+ } else {
2398+ new_release_info [release_pos - NUM_BUFFERS ].address = map_address ;
2399+ new_release_info [release_pos - NUM_BUFFERS ].func = alloc_windows_free ;
2400+ }
23752401 release_pos ++ ;
23762402 }
23772403
@@ -2414,9 +2440,15 @@ static void *alloc_devicedirver(void *address){
24142440 fd , 0 );
24152441
24162442 if (map_address != (void * )-1 ) {
2443+ if (release_pos < NUM_BUFFERS ) {
24172444 release_info [release_pos ].address = map_address ;
24182445 release_info [release_pos ].attr = fd ;
24192446 release_info [release_pos ].func = alloc_devicedirver_free ;
2447+ } else {
2448+ new_release_info [release_pos - NUM_BUFFERS ].address = map_address ;
2449+ new_release_info [release_pos - NUM_BUFFERS ].attr = fd ;
2450+ new_release_info [release_pos - NUM_BUFFERS ].func = alloc_devicedirver_free ;
2451+ }
24202452 release_pos ++ ;
24212453 }
24222454
@@ -2450,9 +2482,15 @@ static void *alloc_shm(void *address){
24502482
24512483 shmctl (shmid , IPC_RMID , 0 );
24522484
2485+ if (release_pos < NUM_BUFFERS ) {
24532486 release_info [release_pos ].address = map_address ;
24542487 release_info [release_pos ].attr = shmid ;
24552488 release_info [release_pos ].func = alloc_shm_free ;
2489+ } else {
2490+ new_release_info [release_pos - NUM_BUFFERS ].address = map_address ;
2491+ new_release_info [release_pos - NUM_BUFFERS ].attr = shmid ;
2492+ new_release_info [release_pos - NUM_BUFFERS ].func = alloc_shm_free ;
2493+ }
24562494 release_pos ++ ;
24572495 }
24582496
@@ -2556,8 +2594,13 @@ static void *alloc_hugetlb(void *address){
25562594#endif
25572595
25582596 if (map_address != (void * )-1 ){
2597+ if (release_pos < NUM_BUFFERS ) {
25592598 release_info [release_pos ].address = map_address ;
25602599 release_info [release_pos ].func = alloc_hugetlb_free ;
2600+ } else {
2601+ new_release_info [release_pos - NUM_BUFFERS ].address = map_address ;
2602+ new_release_info [release_pos - NUM_BUFFERS ].func = alloc_hugetlb_free ;
2603+ }
25612604 release_pos ++ ;
25622605 }
25632606
@@ -2604,9 +2647,15 @@ static void *alloc_hugetlbfile(void *address){
26042647 fd , 0 );
26052648
26062649 if (map_address != (void * )-1 ) {
2650+ if (release_pos < NUM_BUFFERS ) {
26072651 release_info [release_pos ].address = map_address ;
26082652 release_info [release_pos ].attr = fd ;
26092653 release_info [release_pos ].func = alloc_hugetlbfile_free ;
2654+ } else {
2655+ new_release_info [release_pos - NUM_BUFFERS ].address = map_address ;
2656+ new_release_info [release_pos - NUM_BUFFERS ].attr = fd ;
2657+ new_release_info [release_pos - NUM_BUFFERS ].func = alloc_hugetlbfile_free ;
2658+ }
26102659 release_pos ++ ;
26112660 }
26122661
@@ -2663,6 +2712,8 @@ static int memory_overflowed = 0;
26632712
26642713void * blas_memory_alloc (int procpos ){
26652714
2715+ int i ;
2716+
26662717 int position ;
26672718#if defined(WHEREAMI ) && !defined(USE_OPENMP )
26682719 int mypos = 0 ;
@@ -2926,8 +2977,9 @@ void *blas_memory_alloc(int procpos){
29262977 if (memory_overflowed ) goto terminate ;
29272978 printf ("num_buffers exceeded, adding auxiliary array\n" );
29282979 memory_overflowed = 1 ;
2929- newmemory = (struct newmemstruct * ) malloc (512 * sizeof (struct newmemstruct ));
2930- for (int i = 0 ;i < 512 ;i ++ ) {
2980+ new_release_info = (struct release_t * ) malloc (512 * sizeof (struct release_t ));
2981+ newmemory = (struct newmemstruct * ) malloc (512 * sizeof (struct newmemstruct ));
2982+ for (i = 0 ; i < 512 ; i ++ ) {
29312983 newmemory [i ].addr = (void * )0 ;
29322984#if defined(WHEREAMI ) && !defined(USE_OPENMP )
29332985 newmemory [i ].pos = -1 ;
@@ -3101,7 +3153,10 @@ void blas_shutdown(void){
31013153 LOCK_COMMAND (& alloc_lock );
31023154
31033155 for (pos = 0 ; pos < release_pos ; pos ++ ) {
3156+ if (pos < NUM_BUFFERS )
31043157 release_info [pos ].func (& release_info [pos ]);
3158+ else
3159+ new_release_info [pos - NUM_BUFFERS ].func (& new_release_info [pos - NUM_BUFFERS ]);
31053160 }
31063161
31073162#ifdef SEEK_ADDRESS
@@ -3118,6 +3173,15 @@ void blas_shutdown(void){
31183173#endif
31193174 memory [pos ].lock = 0 ;
31203175 }
3176+ if (memory_overflowed )
3177+ for (pos = 0 ; pos < 512 ; pos ++ ){
3178+ newmemory [pos ].addr = (void * )0 ;
3179+ newmemory [pos ].used = 0 ;
3180+ #if defined(WHEREAMI ) && !defined(USE_OPENMP )
3181+ newmemory [pos ].pos = -1 ;
3182+ #endif
3183+ newmemory [pos ].lock = 0 ;
3184+ }
31213185
31223186 UNLOCK_COMMAND (& alloc_lock );
31233187
0 commit comments