diff options
author | Till Straumann <strauman@slac.stanford.edu> | 2008-05-14 22:33:32 +0000 |
---|---|---|
committer | Till Straumann <strauman@slac.stanford.edu> | 2008-05-14 22:33:32 +0000 |
commit | 21637fd3804d0bcda03ed8695357e8f26427d215 (patch) | |
tree | 2776189f770c57e0e8dabd85e48781aa08a9d914 /c | |
parent | 2008-05-14 Joel Sherrill <joel.sherrill@OARcorp.com> (diff) | |
download | rtems-21637fd3804d0bcda03ed8695357e8f26427d215.tar.bz2 |
2008-05-14 Till Straumann <strauman@slac.stanford.edu>
* new-exceptions/bspsupport/irq.c: moved malloc/free
outside of irq-protected critical section.
Diffstat (limited to 'c')
-rw-r--r-- | c/src/lib/libcpu/powerpc/ChangeLog | 5 | ||||
-rw-r--r-- | c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/irq.c | 9 |
2 files changed, 11 insertions, 3 deletions
diff --git a/c/src/lib/libcpu/powerpc/ChangeLog b/c/src/lib/libcpu/powerpc/ChangeLog index 360e3cba50..d53193ec07 100644 --- a/c/src/lib/libcpu/powerpc/ChangeLog +++ b/c/src/lib/libcpu/powerpc/ChangeLog @@ -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> * mpc8260/console-generic/console-generic.c, diff --git a/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/irq.c b/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/irq.c index d972ba9b7b..1b9dcafefe 100644 --- a/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/irq.c +++ b/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/irq.c @@ -86,16 +86,18 @@ int BSP_install_rtems_shared_irq_handler (const rtems_irq_connect_data* irq) return 0; } + /* pre-allocate memory outside of critical section */ + vchain = (rtems_irq_connect_data*)malloc(sizeof(rtems_irq_connect_data)); + rtems_interrupt_disable(level); if ( (int)rtems_hdl_tbl[irq->name].next_handler == -1 ) { rtems_interrupt_enable(level); printk("IRQ vector %d already connected to an unshared handler\n",irq->name); + free(vchain); return 0; } - vchain = (rtems_irq_connect_data*)malloc(sizeof(rtems_irq_connect_data)); - /* save off topmost handler */ 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; rtems_hdl_tbl[irq->name]= *vchain; } - free(vchain); } /* 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); + free(vchain); + return 1; } |