2008-05-14 Till Straumann <strauman@slac.stanford.edu>

* new-exceptions/bspsupport/irq.c: moved malloc/free
	outside of irq-protected critical section.
This commit is contained in:
Till Straumann
2008-05-14 22:33:32 +00:00
parent 1d0ee80e4b
commit 21637fd380
2 changed files with 11 additions and 3 deletions

View File

@@ -1,3 +1,8 @@
2008-05-14 Till Straumann <strauman@slac.stanford.edu>
* new-exceptions/bspsupport/irq.c: moved malloc/free
outside of irq-protected critical section.
2008-04-24 Joel Sherrill <joel.sherrill@OARcorp.com> 2008-04-24 Joel Sherrill <joel.sherrill@OARcorp.com>
* mpc8260/console-generic/console-generic.c, * mpc8260/console-generic/console-generic.c,

View File

@@ -86,16 +86,18 @@ int BSP_install_rtems_shared_irq_handler (const rtems_irq_connect_data* irq)
return 0; return 0;
} }
/* pre-allocate memory outside of critical section */
vchain = (rtems_irq_connect_data*)malloc(sizeof(rtems_irq_connect_data));
rtems_interrupt_disable(level); rtems_interrupt_disable(level);
if ( (int)rtems_hdl_tbl[irq->name].next_handler == -1 ) { if ( (int)rtems_hdl_tbl[irq->name].next_handler == -1 ) {
rtems_interrupt_enable(level); rtems_interrupt_enable(level);
printk("IRQ vector %d already connected to an unshared handler\n",irq->name); printk("IRQ vector %d already connected to an unshared handler\n",irq->name);
free(vchain);
return 0; return 0;
} }
vchain = (rtems_irq_connect_data*)malloc(sizeof(rtems_irq_connect_data));
/* save off topmost handler */ /* save off topmost handler */
vchain[0]= rtems_hdl_tbl[irq->name]; vchain[0]= rtems_hdl_tbl[irq->name];
@@ -267,7 +269,6 @@ int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data* irq)
vchain = vchain->next_handler; vchain = vchain->next_handler;
rtems_hdl_tbl[irq->name]= *vchain; rtems_hdl_tbl[irq->name]= *vchain;
} }
free(vchain);
} }
/* Only disable at PIC if we removed the last handler */ /* Only disable at PIC if we removed the last handler */
@@ -282,6 +283,8 @@ int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data* irq)
rtems_interrupt_enable(level); rtems_interrupt_enable(level);
free(vchain);
return 1; return 1;
} }