1 /*****************************************************************************
2    Major portions of this software are copyrighted by the Medical College
3    of Wisconsin, 1994-2000, and are released under the Gnu General Public
4    License, Version 2.  See the file README.Copyright for details.
5 ******************************************************************************/
6 
7 #include "mrilib.h"
8 #include "thd.h"
9 
THD_purge_datablock(THD_datablock * blk,int mem_type)10 RwcBoolean THD_purge_datablock( THD_datablock *blk , int mem_type )
11 {
12    int ibr ;
13    void *ptr ;
14 
15 ENTRY("THD_purge_datablock") ;
16 
17    /*-- sanity checks --*/
18 
19    if( ! ISVALID_DATABLOCK(blk) || blk->brick == NULL ) RETURN( False );
20    if( (blk->malloc_type & mem_type) == 0 )             RETURN( False );
21    if( DBLK_LOCKED(blk) )                               RETURN( False );
22 
23    /*-- free the data space --*/
24 
25    switch( blk->malloc_type ){
26 
27       case DATABLOCK_MEM_MALLOC:
28 STATUS("MEM_MALLOC: clearing sub-bricks") ;
29          for( ibr=0 ; ibr < blk->nvals ; ibr++ ){
30 #if 1
31             mri_clear( DBLK_BRICK(blk,ibr) ) ;  /* 31 Jan 2007 */
32 #else
33             ptr = DBLK_ARRAY(blk,ibr) ;
34             if( ptr != NULL ){
35               free(ptr); mri_clear_data_pointer(DBLK_BRICK(blk,ibr));
36             }
37 #endif
38          }
39       RETURN( True );
40 
41       case DATABLOCK_MEM_MMAP:
42 STATUS("MEM_MMAP: unmapping") ;
43          ptr = DBLK_ARRAY(blk,0) ;
44          if( ptr != NULL ) munmap( ptr , (size_t)blk->total_bytes ) ;
45          for( ibr=0 ; ibr < blk->nvals ; ibr++ )
46            mri_clear_data_pointer( DBLK_BRICK(blk,ibr) ) ;
47       RETURN( True );
48 
49       case DATABLOCK_MEM_SHARED:   /* can't be purged */
50       RETURN( False );
51    }
52 
53    RETURN( False );  /* shouldn't be reached */
54 }
55 
56 /*----------------------------------------------------------
57    04 May 1998: purge just one sub-brick, if possible
58 ------------------------------------------------------------*/
59 
THD_purge_one_brick(THD_datablock * blk,int iv)60 RwcBoolean THD_purge_one_brick( THD_datablock *blk , int iv )
61 {
62    void *ptr ;
63 
64 ENTRY("THD_purge_one_brick") ;
65 
66    /* sanity checks */
67 
68    if( ! ISVALID_DATABLOCK(blk) || blk->brick == NULL ) RETURN( False );
69    if( DBLK_LOCKED(blk) )                               RETURN( False );
70    if( iv < 0 || iv >= blk->nvals )                     RETURN( False );
71    if( blk->malloc_type != DATABLOCK_MEM_MALLOC )       RETURN( False );
72 
73 #if 1
74    mri_clear( DBLK_BRICK(blk,iv) ) ;  /* 31 Jan 2007 */
75 #else
76    ptr = DBLK_ARRAY(blk,iv) ;
77    if( ptr != NULL ) free(ptr) ;
78    mri_clear_data_pointer( DBLK_BRICK(blk,iv) ) ;
79 #endif
80    RETURN( True );
81 }
82