- Timestamp:
- Feb 6, 2007, 10:54:34 PM (13 years ago)
- Children:
- 356914bb
- Parents:
- edffc8ed
- Location:
- cpukit
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
cpukit/ChangeLog
redffc8ed r4a2fee47 1 2007-02-06 Till Straumann <strauman@slac.stanford.edu> 2 3 * libcsupport/src/gxx_wrappers.c: fix PR#690. Supply 4 taskvar dtor to plug memory leak. Applied patch attached 5 to PR#690. 6 1 7 2007-02-06 Ralf Corsépius <ralf.corsepius@rtems.org> 2 8 -
cpukit/libcsupport/src/gxx_wrappers.c
redffc8ed r4a2fee47 41 41 * These typedefs should match with the ones defined in the file 42 42 * gcc/gthr-rtems.h in the gcc distribution. 43 */ 44 typedef void *__gthread_key_t; 43 * FIXME: T.S, 2007/01/31: -> gcc/gthr-rtems.h still declares 44 * void * __gthread_key_t; 45 */ 46 typedef struct __gthread_key_ { 47 void *val; /* this is switched with the task */ 48 void (*dtor)(void*); /* this remains in place for all tasks */ 49 } __gthread_key, *__gthread_key_t; 45 50 typedef int __gthread_once_t; 46 51 typedef void *__gthread_mutex_t; … … 72 77 { 73 78 rtems_mode saveMode; 79 __gthread_once_t o; 74 80 rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); 75 if( *(volatile __gthread_once_t *)once== 0 )81 if( (o = *(volatile __gthread_once_t *)once) == 0 ) 76 82 { 77 83 *(volatile __gthread_once_t *)once = 1; 78 (*func)();79 84 } 80 85 rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); 86 if ( o == 0 ) 87 (*func)(); 81 88 } 82 89 return 0; … … 92 99 */ 93 100 /* Do not pull your hair, trust me this works. :-) */ 94 __gthread_key_t *new_key = ( __gthread_key_t * )malloc( sizeof( __gthread_key_t ) ); 95 *key = ( __gthread_key_t )new_key; 96 *new_key = NULL; 101 __gthread_key_t new_key = ( __gthread_key_t )malloc( sizeof( *new_key ) ); 102 *key = new_key; 103 new_key->val = NULL; 104 new_key->dtor = dtor; 97 105 98 106 #ifdef DEBUG_GXX_WRAPPERS … … 100 108 #endif 101 109 /* register with RTEMS the buffer that will hold the key values */ 102 if( rtems_task_variable_add( RTEMS_SELF, (void **)new_key, NULL) == RTEMS_SUCCESSFUL )110 if( rtems_task_variable_add( RTEMS_SELF, (void **)new_key, dtor ) == RTEMS_SUCCESSFUL ) 103 111 return 0; 104 112 return -1; … … 110 118 printk( "gxx_wrappers: dtor key=%x, ptr=%x\n", key, ptr ); 111 119 #endif 112 *(void **)key= 0;120 key->val = 0; 113 121 return 0; 114 122 } … … 122 130 if( rtems_task_variable_delete( RTEMS_SELF, (void **)key ) == RTEMS_SUCCESSFUL ) 123 131 { 132 /* Hmm - hopefully all tasks using this key have gone away... */ 124 133 if( key ) free( (void *)key ); 125 134 return 0; … … 137 146 { 138 147 /* We do not have to do this, but what the heck ! */ 139 p= *( void **)key;148 p= key->val; 140 149 } 141 150 else … … 144 153 * threads are using at the moment of this call 145 154 */ 146 if( rtems_task_variable_add( RTEMS_SELF, (void **)key, NULL) != RTEMS_SUCCESSFUL )155 if( rtems_task_variable_add( RTEMS_SELF, (void **)key, key->dtor ) != RTEMS_SUCCESSFUL ) 147 156 { 148 157 rtems_panic ("rtems_gxx_getspecific"); 149 158 } 150 *( void ** )key= (void *)0;159 key->val = (void *)0; 151 160 } 152 161 … … 164 173 #endif 165 174 /* register with RTEMS the buffer that will hold the key values */ 166 if( rtems_task_variable_add( RTEMS_SELF, (void **)key, NULL) == RTEMS_SUCCESSFUL )175 if( rtems_task_variable_add( RTEMS_SELF, (void **)key, key->dtor ) == RTEMS_SUCCESSFUL ) 167 176 { 168 177 /* now let's set the proper value */ 169 *( void ** )key =(void *)ptr;178 key->val = (void *)ptr; 170 179 return 0; 171 180 }
Note: See TracChangeset
for help on using the changeset viewer.