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