hrev47212 adds 4 changesets to branch 'master' old head: edc6d1558e885df793ab3f4d5bc66e145506da0f new head: 680ca3b13d52422ea165f09173c82c8ba26e73c5 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=680ca3b+%5Eedc6d15 ---------------------------------------------------------------------------- 578558b: add-ons/kernel: add spaces between literals and identifiers Due to introduction of user-defined suffixes C++11 requires that there is a space between literal and identifier to avoid ambiguity. This patch makes the whole kernel build successfully with C++11. 2c00124: build: when using gcc4 build kernel with c++11 fad7246: runtime_loader: fix CID 1211997, proper corner case handling 680ca3b: runtime_loader: fix CID 1211995, improve generation counting There is no need to increase generation counter each time new DSO is registered. [ Pawel Dziepak <pdziepak@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- 17 files changed, 56 insertions(+), 44 deletions(-) build/jam/ArchitectureRules | 4 ++++ src/add-ons/kernel/bus_managers/scsi/wrapper.h | 12 ++++++------ src/add-ons/kernel/bus_managers/usb/usb.cpp | 2 +- src/add-ons/kernel/bus_managers/usb/usb_private.h | 6 +++--- src/add-ons/kernel/busses/usb/ehci.cpp | 2 +- src/add-ons/kernel/cpu/x86/generic_x86.cpp | 2 +- .../kernel/drivers/disk/usb/usb_disk/usb_disk.cpp | 14 +++++++------- .../kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp | 6 +++--- .../kernel/drivers/ports/usb_serial/Tracing.cpp | 2 +- src/add-ons/kernel/drivers/printer/usb/usb_printer.cpp | 6 +++--- .../layers/write_overlay/write_overlay.cpp | 2 +- src/add-ons/kernel/generic/ata_adapter/wrapper.h | 12 ++++++------ src/add-ons/kernel/generic/scsi_periph/wrapper.h | 12 ++++++------ src/system/kernel/arch/x86/Jamfile | 2 -- src/system/runtime_loader/elf_symbol_lookup.h | 4 +++- src/system/runtime_loader/elf_tls.cpp | 10 +++++++++- src/system/runtime_loader/elf_tls.h | 2 +- ############################################################################ Commit: 578558b439867f563d44d168a29223f76d6bb23e URL: http://cgit.haiku-os.org/haiku/commit/?id=578558b Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Wed May 7 17:16:39 2014 UTC add-ons/kernel: add spaces between literals and identifiers Due to introduction of user-defined suffixes C++11 requires that there is a space between literal and identifier to avoid ambiguity. This patch makes the whole kernel build successfully with C++11. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/bus_managers/scsi/wrapper.h b/src/add-ons/kernel/bus_managers/scsi/wrapper.h index 0265b5c..531f0db 100644 --- a/src/add-ons/kernel/bus_managers/scsi/wrapper.h +++ b/src/add-ons/kernel/bus_managers/scsi/wrapper.h @@ -59,32 +59,32 @@ #define SHOW_FLOW(seriousness, format, param...) \ do { if( seriousness <= debug_level_flow && seriousness <= DEBUG_MAX_LEVEL_FLOW ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME, param ); DEBUG_WAIT \ + dprintf("%s%s: " format "\n", FUNC_NAME, param ); DEBUG_WAIT \ }} while( 0 ) #define SHOW_FLOW0(seriousness, format) \ do { if( seriousness <= debug_level_flow && seriousness <= DEBUG_MAX_LEVEL_FLOW ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME); DEBUG_WAIT \ + dprintf("%s%s: " format "\n", FUNC_NAME); DEBUG_WAIT \ }} while( 0 ) #define SHOW_INFO(seriousness, format, param...) \ do { if( seriousness <= debug_level_info && seriousness <= DEBUG_MAX_LEVEL_INFO ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME, param ); DEBUG_WAIT \ + dprintf("%s%s: " format "\n", FUNC_NAME, param ); DEBUG_WAIT \ }} while( 0 ) #define SHOW_INFO0(seriousness, format) \ do { if( seriousness <= debug_level_info && seriousness <= DEBUG_MAX_LEVEL_INFO ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME); DEBUG_WAIT \ + dprintf("%s%s: " format "\n", FUNC_NAME); DEBUG_WAIT \ }} while( 0 ) #define SHOW_ERROR(seriousness, format, param...) \ do { if( seriousness <= debug_level_error && seriousness <= DEBUG_MAX_LEVEL_ERROR ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME, param ); DEBUG_WAIT_ERROR \ + dprintf("%s%s: " format "\n", FUNC_NAME, param ); DEBUG_WAIT_ERROR \ }} while( 0 ) #define SHOW_ERROR0(seriousness, format) \ do { if( seriousness <= debug_level_error && seriousness <= DEBUG_MAX_LEVEL_ERROR ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME); DEBUG_WAIT_ERROR \ + dprintf("%s%s: " format "\n", FUNC_NAME); DEBUG_WAIT_ERROR \ }} while( 0 ) #endif /* _WRAPPER_H */ diff --git a/src/add-ons/kernel/bus_managers/usb/usb.cpp b/src/add-ons/kernel/bus_managers/usb/usb.cpp index 83cf8a9..d937897 100644 --- a/src/add-ons/kernel/bus_managers/usb/usb.cpp +++ b/src/add-ons/kernel/bus_managers/usb/usb.cpp @@ -312,7 +312,7 @@ status_t queue_bulk(usb_pipe pipe, void *data, size_t dataLength, usb_callback_func callback, void *callbackCookie) { - TRACE_MODULE("queue_bulk(%"B_PRId32 ", %p, %" B_PRIuSIZE ", %p, %p)\n", + TRACE_MODULE("queue_bulk(%" B_PRId32 ", %p, %" B_PRIuSIZE ", %p, %p)\n", pipe, data, dataLength, callback, callbackCookie); Object *object = gUSBStack->GetObject(pipe); if (!object || (object->Type() & USB_OBJECT_BULK_PIPE) == 0) diff --git a/src/add-ons/kernel/bus_managers/usb/usb_private.h b/src/add-ons/kernel/bus_managers/usb/usb_private.h index e3f38a3..13c189b 100644 --- a/src/add-ons/kernel/bus_managers/usb/usb_private.h +++ b/src/add-ons/kernel/bus_managers/usb/usb_private.h @@ -25,7 +25,7 @@ #ifdef TRACE_USB #define TRACE(x...) TRACE_OUTPUT(this, "", x) #define TRACE_STATIC(x, y...) TRACE_OUTPUT(x, "", y) -#define TRACE_MODULE(x...) dprintf("usb "USB_MODULE_NAME": "x) +#define TRACE_MODULE(x...) dprintf("usb " USB_MODULE_NAME ": " x) #else #define TRACE(x...) /* nothing */ #define TRACE_STATIC(x, y...) /* nothing */ @@ -34,8 +34,8 @@ #define TRACE_ALWAYS(x...) TRACE_OUTPUT(this, "", x) #define TRACE_ERROR(x...) TRACE_OUTPUT(this, "error ", x) -#define TRACE_MODULE_ALWAYS(x...) dprintf("usb "USB_MODULE_NAME": "x) -#define TRACE_MODULE_ERROR(x...) dprintf("usb "USB_MODULE_NAME": "x) +#define TRACE_MODULE_ALWAYS(x...) dprintf("usb " USB_MODULE_NAME ": " x) +#define TRACE_MODULE_ERROR(x...) dprintf("usb " USB_MODULE_NAME ": " x) class Hub; class Stack; diff --git a/src/add-ons/kernel/busses/usb/ehci.cpp b/src/add-ons/kernel/busses/usb/ehci.cpp index c6b7bbd..aeed838 100644 --- a/src/add-ons/kernel/busses/usb/ehci.cpp +++ b/src/add-ons/kernel/busses/usb/ehci.cpp @@ -69,7 +69,7 @@ print_descriptor_chain(ehci_qtd *descriptor) while (descriptor) { dprintf(" %08" B_PRIx32 " n%08" B_PRIx32 " a%08" B_PRIx32 " t%08" B_PRIx32 " %08" B_PRIx32 " %08" B_PRIx32 " %08" B_PRIx32 " %08" B_PRIx32 - " %08" B_PRIx32 " s%"B_PRIuSIZE "\n", + " %08" B_PRIx32 " s%" B_PRIuSIZE "\n", descriptor->this_phy, descriptor->next_phy, descriptor->alt_next_phy, descriptor->token, descriptor->buffer_phy[0], descriptor->buffer_phy[1], diff --git a/src/add-ons/kernel/cpu/x86/generic_x86.cpp b/src/add-ons/kernel/cpu/x86/generic_x86.cpp index 94e6a1b..1edd1fd 100644 --- a/src/add-ons/kernel/cpu/x86/generic_x86.cpp +++ b/src/add-ons/kernel/cpu/x86/generic_x86.cpp @@ -21,7 +21,7 @@ //#define TRACE_MTRR #ifdef TRACE_MTRR -# define TRACE(x...) dprintf("mtrr: "x) +# define TRACE(x...) dprintf("mtrr: " x) #else # define TRACE(x...) /* nothing */ #endif diff --git a/src/add-ons/kernel/drivers/disk/usb/usb_disk/usb_disk.cpp b/src/add-ons/kernel/drivers/disk/usb/usb_disk/usb_disk.cpp index 5da2965..0c0a7e4 100644 --- a/src/add-ons/kernel/drivers/disk/usb/usb_disk/usb_disk.cpp +++ b/src/add-ons/kernel/drivers/disk/usb/usb_disk/usb_disk.cpp @@ -29,11 +29,11 @@ //#define TRACE_USB_DISK #ifdef TRACE_USB_DISK -#define TRACE(x...) dprintf(DRIVER_NAME": "x) -#define TRACE_ALWAYS(x...) dprintf(DRIVER_NAME": "x) +#define TRACE(x...) dprintf(DRIVER_NAME ": " x) +#define TRACE_ALWAYS(x...) dprintf(DRIVER_NAME ": " x) #else #define TRACE(x...) /* nothing */ -#define TRACE_ALWAYS(x...) dprintf(DRIVER_NAME": "x) +#define TRACE_ALWAYS(x...) dprintf(DRIVER_NAME ": " x) #endif @@ -796,7 +796,7 @@ usb_disk_device_added(usb_device newDevice, void **cookie) result = usb_disk_inquiry(lun); err_act action = err_act_ok; for (uint32 tries = 0; tries < 8; tries++) { - TRACE("usb lun %"B_PRIu8" inquiry attempt %"B_PRIu32" begin\n", + TRACE("usb lun %" B_PRIu8 " inquiry attempt %" B_PRIu32 " begin\n", i, tries); status_t ready = usb_disk_test_unit_ready(lun, &action); if (ready == B_OK || ready == B_DEV_NO_MEDIA @@ -808,18 +808,18 @@ usb_disk_device_added(usb_device newDevice, void **cookie) else if (/*usb_disk_mode_sense(lun) != B_OK*/true) lun->write_protected = false; - TRACE("usb lun %"B_PRIu8" ready. write protected = %c%s\n", i, + TRACE("usb lun %" B_PRIu8 " ready. write protected = %c%s\n", i, lun->write_protected ? 'y' : 'n', ready == B_DEV_NO_MEDIA ? " (no media inserted)" : ""); break; } - TRACE("usb lun %"B_PRIu8" inquiry attempt %"B_PRIu32" failed\n", + TRACE("usb lun %" B_PRIu8 " inquiry attempt %" B_PRIu32 " failed\n", i, tries); if (action != err_act_retry && action != err_act_many_retries) break; bigtime_t snoozeTime = 1000000 * tries; - TRACE("snoozing %"B_PRIu64" microseconds for usb lun\n", + TRACE("snoozing %" B_PRIu64 " microseconds for usb lun\n", snoozeTime); snooze(snoozeTime); } diff --git a/src/add-ons/kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp b/src/add-ons/kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp index b24a77c..3f5380c 100644 --- a/src/add-ons/kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp +++ b/src/add-ons/kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp @@ -23,11 +23,11 @@ //#define TRACE_USB_DISK #ifdef TRACE_USB_DISK -#define TRACE(x...) dprintf("\x1B[35m"DRIVER_NAME"\x1B[0m: "x) -#define TRACE_ALWAYS(x...) dprintf("\x1B[35m"DRIVER_NAME"\x1B[0m: "x) +#define TRACE(x...) dprintf("\x1B[35m" DRIVER_NAME "\x1B[0m: " x) +#define TRACE_ALWAYS(x...) dprintf("\x1B[35m" DRIVER_NAME "\x1B[0m: " x) #else #define TRACE(x...) /* nothing */ -#define TRACE_ALWAYS(x...) dprintf("\x1B[35m"DRIVER_NAME"\x1B[0m: "x) +#define TRACE_ALWAYS(x...) dprintf("\x1B[35m" DRIVER_NAME "\x1B[0m: " x) #endif diff --git a/src/add-ons/kernel/drivers/ports/usb_serial/Tracing.cpp b/src/add-ons/kernel/drivers/ports/usb_serial/Tracing.cpp index 4fcc5fa..ac8488c 100644 --- a/src/add-ons/kernel/drivers/ports/usb_serial/Tracing.cpp +++ b/src/add-ons/kernel/drivers/ports/usb_serial/Tracing.cpp @@ -81,7 +81,7 @@ usb_serial_trace(bool force, const char *format, ...) static char buffer[1024]; char *bufferPointer = buffer; if (!gLogToFile) { - const char *prefix = "\33[32m"DRIVER_NAME":\33[0m "; + const char *prefix = "\33[32m" DRIVER_NAME ":\33[0m "; strcpy(bufferPointer, prefix); bufferPointer += strlen(prefix); } diff --git a/src/add-ons/kernel/drivers/printer/usb/usb_printer.cpp b/src/add-ons/kernel/drivers/printer/usb/usb_printer.cpp index c690db3..4e67a22 100644 --- a/src/add-ons/kernel/drivers/printer/usb/usb_printer.cpp +++ b/src/add-ons/kernel/drivers/printer/usb/usb_printer.cpp @@ -31,11 +31,11 @@ // #define TRACE_USB_PRINTER 1 #ifdef TRACE_USB_PRINTER -#define TRACE(x...) dprintf(DRIVER_NAME": "x) -#define TRACE_ALWAYS(x...) dprintf(DRIVER_NAME": "x) +#define TRACE(x...) dprintf(DRIVER_NAME ": " x) +#define TRACE_ALWAYS(x...) dprintf(DRIVER_NAME ": " x) #else #define TRACE(x...) /* nothing */ -#define TRACE_ALWAYS(x...) dprintf(DRIVER_NAME": "x) +#define TRACE_ALWAYS(x...) dprintf(DRIVER_NAME ": " x) #endif diff --git a/src/add-ons/kernel/file_systems/layers/write_overlay/write_overlay.cpp b/src/add-ons/kernel/file_systems/layers/write_overlay/write_overlay.cpp index 5081db1..e49074a 100644 --- a/src/add-ons/kernel/file_systems/layers/write_overlay/write_overlay.cpp +++ b/src/add-ons/kernel/file_systems/layers/write_overlay/write_overlay.cpp @@ -2580,7 +2580,7 @@ overlay_std_ops(int32 op, ...) static file_system_module_info sOverlayFileSystem = { { - "file_systems/write_overlay"B_CURRENT_FS_API_VERSION, + "file_systems/write_overlay" B_CURRENT_FS_API_VERSION, 0, overlay_std_ops, }, diff --git a/src/add-ons/kernel/generic/ata_adapter/wrapper.h b/src/add-ons/kernel/generic/ata_adapter/wrapper.h index 07a659b..2518238 100644 --- a/src/add-ons/kernel/generic/ata_adapter/wrapper.h +++ b/src/add-ons/kernel/generic/ata_adapter/wrapper.h @@ -59,32 +59,32 @@ #define SHOW_FLOW(seriousness, format, param...) \ do { if( seriousness <= debug_level_flow && seriousness <= DEBUG_MAX_LEVEL_FLOW ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME, param ); DEBUG_WAIT \ + dprintf("%s%s: " format "\n", FUNC_NAME, param ); DEBUG_WAIT \ }} while( 0 ) #define SHOW_FLOW0(seriousness, format) \ do { if( seriousness <= debug_level_flow && seriousness <= DEBUG_MAX_LEVEL_FLOW ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME); DEBUG_WAIT \ + dprintf("%s%s: " format "\n", FUNC_NAME); DEBUG_WAIT \ }} while( 0 ) #define SHOW_INFO(seriousness, format, param...) \ do { if( seriousness <= debug_level_info && seriousness <= DEBUG_MAX_LEVEL_INFO ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME, param ); DEBUG_WAIT \ + dprintf("%s%s: " format "\n", FUNC_NAME, param ); DEBUG_WAIT \ }} while( 0 ) #define SHOW_INFO0(seriousness, format) \ do { if( seriousness <= debug_level_info && seriousness <= DEBUG_MAX_LEVEL_INFO ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME); DEBUG_WAIT \ + dprintf("%s%s: " format "\n", FUNC_NAME); DEBUG_WAIT \ }} while( 0 ) #define SHOW_ERROR(seriousness, format, param...) \ do { if( seriousness <= debug_level_error && seriousness <= DEBUG_MAX_LEVEL_ERROR ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME, param ); DEBUG_WAIT_ERROR \ + dprintf("%s%s: " format "\n", FUNC_NAME, param ); DEBUG_WAIT_ERROR \ }} while( 0 ) #define SHOW_ERROR0(seriousness, format) \ do { if( seriousness <= debug_level_error && seriousness <= DEBUG_MAX_LEVEL_ERROR ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME); DEBUG_WAIT_ERROR \ + dprintf("%s%s: " format "\n", FUNC_NAME); DEBUG_WAIT_ERROR \ }} while( 0 ) #endif /* _BENAPHORE_H */ diff --git a/src/add-ons/kernel/generic/scsi_periph/wrapper.h b/src/add-ons/kernel/generic/scsi_periph/wrapper.h index bc363f1..1d9663e 100644 --- a/src/add-ons/kernel/generic/scsi_periph/wrapper.h +++ b/src/add-ons/kernel/generic/scsi_periph/wrapper.h @@ -52,32 +52,32 @@ #define SHOW_FLOW(seriousness, format, param...) \ do { if( seriousness <= debug_level_flow && seriousness <= DEBUG_MAX_LEVEL_FLOW ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME, param ); DEBUG_WAIT \ + dprintf("%s%s: " format "\n", FUNC_NAME, param ); DEBUG_WAIT \ }} while( 0 ) #define SHOW_FLOW0(seriousness, format) \ do { if( seriousness <= debug_level_flow && seriousness <= DEBUG_MAX_LEVEL_FLOW ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME); DEBUG_WAIT \ + dprintf("%s%s: " format "\n", FUNC_NAME); DEBUG_WAIT \ }} while( 0 ) #define SHOW_INFO(seriousness, format, param...) \ do { if( seriousness <= debug_level_info && seriousness <= DEBUG_MAX_LEVEL_INFO ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME, param ); DEBUG_WAIT \ + dprintf("%s%s: " format "\n", FUNC_NAME, param ); DEBUG_WAIT \ }} while( 0 ) #define SHOW_INFO0(seriousness, format) \ do { if( seriousness <= debug_level_info && seriousness <= DEBUG_MAX_LEVEL_INFO ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME); DEBUG_WAIT \ + dprintf("%s%s: " format "\n", FUNC_NAME); DEBUG_WAIT \ }} while( 0 ) #define SHOW_ERROR(seriousness, format, param...) \ do { if( seriousness <= debug_level_error && seriousness <= DEBUG_MAX_LEVEL_ERROR ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME, param ); DEBUG_WAIT_ERROR \ + dprintf("%s%s: " format "\n", FUNC_NAME, param ); DEBUG_WAIT_ERROR \ }} while( 0 ) #define SHOW_ERROR0(seriousness, format) \ do { if( seriousness <= debug_level_error && seriousness <= DEBUG_MAX_LEVEL_ERROR ) { \ - dprintf( "%s%s: "format"\n", FUNC_NAME); DEBUG_WAIT_ERROR \ + dprintf("%s%s: " format "\n", FUNC_NAME); DEBUG_WAIT_ERROR \ }} while( 0 ) ############################################################################ Commit: 2c001246a0d7c42ecee24642a814c4f6b4fe7451 URL: http://cgit.haiku-os.org/haiku/commit/?id=2c00124 Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Wed May 7 17:19:18 2014 UTC build: when using gcc4 build kernel with c++11 ---------------------------------------------------------------------------- diff --git a/build/jam/ArchitectureRules b/build/jam/ArchitectureRules index 506055e..0c3200f 100644 --- a/build/jam/ArchitectureRules +++ b/build/jam/ArchitectureRules @@ -403,6 +403,10 @@ rule KernelArchitectureSetup architecture HAIKU_BOOT_C++FLAGS = $(HAIKU_C++FLAGS_$(architecture)) $(g++BaseFlags) ; HAIKU_BOOT_LINKFLAGS = ; + if $(gccVersion[1]) >= 4 { + HAIKU_KERNEL_C++FLAGS += -std=gnu++11 ; + } + HAIKU_KERNEL_PIC_CCFLAGS = -fno-pic ; HAIKU_KERNEL_PIC_LINKFLAGS = ; HAIKU_KERNEL_ADDON_LINKFLAGS = ; diff --git a/src/system/kernel/arch/x86/Jamfile b/src/system/kernel/arch/x86/Jamfile index ee6d93b..3941e18 100644 --- a/src/system/kernel/arch/x86/Jamfile +++ b/src/system/kernel/arch/x86/Jamfile @@ -17,8 +17,6 @@ SEARCH_SOURCE += [ FDirName $(SUBDIR) timers ] ; local archSpecificSources ; if $(TARGET_ARCH) = x86_64 { - SubDirC++Flags -std=gnu++11 ; - SEARCH_SOURCE += [ FDirName $(SUBDIR) 64 ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) paging 64bit ] ; ############################################################################ Commit: fad7246fcdc82a704e425f7f1bface9bee73484a URL: http://cgit.haiku-os.org/haiku/commit/?id=fad7246 Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Thu May 8 18:25:30 2014 UTC runtime_loader: fix CID 1211997, proper corner case handling ---------------------------------------------------------------------------- diff --git a/src/system/runtime_loader/elf_symbol_lookup.h b/src/system/runtime_loader/elf_symbol_lookup.h index 497fa12..433c9ab 100644 --- a/src/system/runtime_loader/elf_symbol_lookup.h +++ b/src/system/runtime_loader/elf_symbol_lookup.h @@ -60,6 +60,7 @@ struct SymbolLookupCache { : fTableSize(image->symhash[1]), fValues(NULL), + fDSOs(NULL), fValuesResolved(NULL) { if (fTableSize > 0) { @@ -70,9 +71,10 @@ struct SymbolLookupCache { fValuesResolved = (uint32*)malloc(4 * elementCount); memset(fValuesResolved, 0, 4 * elementCount); - if (fValues == NULL || fValuesResolved == NULL) { + if (fValues == NULL || fDSOs == NULL || fValuesResolved == NULL) { free(fValuesResolved); free(fValues); + free(fDSOs); fTableSize = 0; } } ############################################################################ Revision: hrev47212 Commit: 680ca3b13d52422ea165f09173c82c8ba26e73c5 URL: http://cgit.haiku-os.org/haiku/commit/?id=680ca3b Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Thu May 8 21:05:31 2014 UTC runtime_loader: fix CID 1211995, improve generation counting There is no need to increase generation counter each time new DSO is registered. ---------------------------------------------------------------------------- diff --git a/src/system/runtime_loader/elf_tls.cpp b/src/system/runtime_loader/elf_tls.cpp index 3a17f73..40bc66c 100644 --- a/src/system/runtime_loader/elf_tls.cpp +++ b/src/system/runtime_loader/elf_tls.cpp @@ -116,7 +116,7 @@ TLSBlockTemplates::Register(const TLSBlockTemplate& block) fTemplates.push_back(block); } - fTemplates[dso].SetGeneration(fGeneration++); + fTemplates[dso].SetGeneration(fGeneration); return dso; } @@ -127,6 +127,7 @@ TLSBlockTemplates::Unregister(unsigned dso) if (dso == unsigned(-1)) return; + fGeneration++; fFreeDSOs.push_back(dso); } @@ -155,6 +156,13 @@ TLSBlockTemplates::CreateBlock(unsigned dso) } +TLSBlockTemplates::TLSBlockTemplates() + : + fGeneration(0) +{ +} + + TLSBlock::TLSBlock() : fPointer(NULL) diff --git a/src/system/runtime_loader/elf_tls.h b/src/system/runtime_loader/elf_tls.h index 0fa7a07..9e8d859 100644 --- a/src/system/runtime_loader/elf_tls.h +++ b/src/system/runtime_loader/elf_tls.h @@ -48,7 +48,7 @@ public: TLSBlock CreateBlock(unsigned dso); private: - TLSBlockTemplates() { } + inline TLSBlockTemplates(); static TLSBlockTemplates* fInstance;