From 4f05917494b22943ab0e7c466e4eb9f7a5896daa Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sat, 3 Oct 2020 02:50:49 +1000 Subject: [PATCH] Got rid of global_alloc/global_free. The global_alloc/global_free functions have outlived their usefulness. They don't allow consistently overriding the default memory allocation behaviour because they aren't used consistently, and we don't have standard library allocator wrappers for them that we'd need to use them consistently with all the standard library containers we're using. If you need to change the default allocator behaviour, you can override the new/delete operators, and there are ways to get more fine-grained control that way. We're already doing that to pre-fill memory in debug builds. Code was already starting to depend on global_alloc/global_free wrapping new/delete. For example some parts of the code (including the UI and Windows debugger) was putting the result of global_alloc in a std::unique_ptr wrappers without custom deleters, and the SPU sound device was assuming it could use global_free to release memory allocated with operator new. There was also code misunderstanding the behaviour of global_alloc, for example the GROM port cartridge code was checking for nullptr when a failure will actually throw std::bad_alloc. As well as substituting new/delete, I've made several things use smart pointers to reduce the chance of leaks, and fixed a couple of leaks, too. --- src/devices/bus/adamnet/adamnet.cpp | 2 +- src/devices/bus/cbmiec/cbmiec.cpp | 2 +- src/devices/bus/econet/econet.cpp | 2 +- src/devices/bus/ieee488/ieee488.cpp | 2 +- src/devices/bus/ti99/gromport/cartridges.cpp | 36 +++--- src/devices/bus/ti99/gromport/cartridges.h | 10 +- src/devices/bus/ti99/peb/horizon.cpp | 18 ++- src/devices/cpu/x86log.cpp | 4 +- src/devices/cpu/x86log.h | 34 +++--- src/devices/imagedev/floppy.cpp | 16 ++- src/devices/imagedev/floppy.h | 2 +- src/devices/imagedev/mfmhd.cpp | 23 ++-- src/devices/imagedev/mfmhd.h | 4 +- src/devices/imagedev/midiin.cpp | 18 ++- src/devices/imagedev/midiin.h | 2 +- src/devices/imagedev/midiout.cpp | 14 +-- src/devices/imagedev/midiout.h | 2 +- src/devices/sound/spu.cpp | 111 +++++++++--------- src/devices/sound/spu.h | 6 +- src/devices/sound/spureverb.cpp | 20 +--- src/devices/sound/spureverb.h | 12 +- src/emu/addrmap.cpp | 2 +- src/emu/debug/debugvw.cpp | 18 +-- src/emu/emualloc.cpp | 2 +- src/emu/emualloc.h | 8 +- src/emu/ioport.cpp | 14 +-- src/emu/render.cpp | 58 ++++----- src/emu/render.h | 7 +- src/emu/rendfont.h | 3 +- src/emu/rendlay.cpp | 12 +- src/emu/tilemap.cpp | 4 +- src/frontend/mame/clifront.cpp | 2 +- src/frontend/mame/mame.cpp | 42 ++++--- src/frontend/mame/mame.h | 6 +- src/frontend/mame/ui/menu.cpp | 2 +- src/frontend/mame/ui/menu.h | 4 +- src/frontend/mame/ui/text.cpp | 4 +- src/frontend/mame/ui/text.h | 5 +- src/frontend/mame/ui/ui.cpp | 12 +- src/frontend/mame/ui/ui.h | 2 +- src/lib/formats/imd_dsk.cpp | 14 +-- src/lib/formats/ipf_dsk.cpp | 35 ++++-- src/lib/formats/ipf_dsk.h | 22 ++-- src/lib/formats/mfi_dsk.cpp | 15 +-- src/lib/util/corealloc.h | 40 +------ src/lib/util/coretmpl.h | 6 +- src/mame/includes/apollo.h | 6 +- src/mame/machine/psxcd.cpp | 14 +-- src/mame/video/apollo.cpp | 26 ++-- src/osd/modules/debugger/debugimgui.cpp | 8 +- .../modules/debugger/win/consolewininfo.cpp | 4 +- .../debugger/win/disasmbasewininfo.cpp | 2 +- src/osd/modules/debugger/win/logwininfo.cpp | 2 +- .../modules/debugger/win/memorywininfo.cpp | 2 +- .../modules/debugger/win/pointswininfo.cpp | 6 +- src/osd/modules/lib/osdobj_common.cpp | 20 ++-- src/osd/modules/lib/osdobj_common.h | 6 +- src/osd/modules/midi/midi_module.h | 15 ++- src/osd/modules/midi/none.cpp | 9 +- src/osd/modules/midi/portmidi.cpp | 6 +- src/osd/modules/netdev/pcap.cpp | 2 +- src/osd/modules/netdev/taptun.cpp | 2 +- src/osd/modules/osdmodule.cpp | 60 +++------- src/osd/modules/osdmodule.h | 45 +++---- src/osd/modules/output/win32_output.cpp | 6 +- src/osd/modules/render/d3d/d3dhlsl.cpp | 4 +- src/osd/modules/render/draw13.cpp | 6 +- src/osd/modules/render/draw13.h | 8 +- src/osd/modules/render/drawd3d.cpp | 28 ++--- src/osd/modules/render/drawd3d.h | 10 +- src/osd/modules/render/drawgdi.cpp | 16 ++- src/osd/modules/render/drawgdi.h | 12 +- src/osd/modules/render/drawogl.cpp | 18 +-- src/osd/modules/render/drawogl.h | 7 +- src/osd/modules/render/drawsdl.cpp | 33 ++---- src/osd/modules/render/drawsdl.h | 16 +-- src/osd/osdepend.h | 2 +- src/osd/sdl/window.cpp | 3 +- src/osd/sdl/window.h | 8 +- src/tools/imgtool/modules/hp85_tape.cpp | 4 +- src/tools/imgtool/modules/hp9845_tape.cpp | 4 +- 81 files changed, 491 insertions(+), 608 deletions(-) diff --git a/src/devices/bus/adamnet/adamnet.cpp b/src/devices/bus/adamnet/adamnet.cpp index 69b25ce30e7..18b91c4fb8c 100644 --- a/src/devices/bus/adamnet/adamnet.cpp +++ b/src/devices/bus/adamnet/adamnet.cpp @@ -113,7 +113,7 @@ void adamnet_device::device_stop() void adamnet_device::add_device(device_t *target) { - auto entry = global_alloc(daisy_entry(target)); + auto entry = new daisy_entry(target); entry->m_interface->m_bus = this; diff --git a/src/devices/bus/cbmiec/cbmiec.cpp b/src/devices/bus/cbmiec/cbmiec.cpp index 98535963034..4ee8f287200 100644 --- a/src/devices/bus/cbmiec/cbmiec.cpp +++ b/src/devices/bus/cbmiec/cbmiec.cpp @@ -338,7 +338,7 @@ void cbm_iec_device::device_stop() void cbm_iec_device::add_device(cbm_iec_slot_device *slot, device_t *target) { - auto entry = global_alloc(daisy_entry(target)); + auto entry = new daisy_entry(target); entry->m_interface->m_slot = slot; entry->m_interface->m_bus = this; diff --git a/src/devices/bus/econet/econet.cpp b/src/devices/bus/econet/econet.cpp index f87850fe133..e9afc9c0d49 100644 --- a/src/devices/bus/econet/econet.cpp +++ b/src/devices/bus/econet/econet.cpp @@ -223,7 +223,7 @@ void econet_device::device_stop() void econet_device::add_device(device_t *target, int address) { - auto entry = global_alloc(daisy_entry(target)); + auto entry = new daisy_entry(target); entry->m_interface->m_econet = this; entry->m_interface->m_address = address; diff --git a/src/devices/bus/ieee488/ieee488.cpp b/src/devices/bus/ieee488/ieee488.cpp index bcbe20e0573..947aad2d1f7 100644 --- a/src/devices/bus/ieee488/ieee488.cpp +++ b/src/devices/bus/ieee488/ieee488.cpp @@ -164,7 +164,7 @@ void ieee488_device::device_stop() void ieee488_device::add_device(ieee488_slot_device *slot, device_t *target) { - auto entry = global_alloc(daisy_entry(target)); + auto entry = new daisy_entry(target); entry->m_interface->m_bus = this; entry->m_interface->m_slot = slot; diff --git a/src/devices/bus/ti99/gromport/cartridges.cpp b/src/devices/bus/ti99/gromport/cartridges.cpp index 6b2da977a2a..c703d331bf9 100644 --- a/src/devices/bus/ti99/gromport/cartridges.cpp +++ b/src/devices/bus/ti99/gromport/cartridges.cpp @@ -1558,13 +1558,13 @@ void ti99_cartridge_device::rpk::close() not a network socket) ***************************************************************/ -ti99_cartridge_device::rpk_socket::rpk_socket(const char* id, int length, uint8_t* contents, std::string &&pathname) - : m_id(id), m_length(length), m_contents(contents), m_pathname(std::move(pathname)) +ti99_cartridge_device::rpk_socket::rpk_socket(const char* id, int length, std::unique_ptr &&contents, std::string &&pathname) + : m_id(id), m_length(length), m_contents(std::move(contents)), m_pathname(std::move(pathname)) { } -ti99_cartridge_device::rpk_socket::rpk_socket(const char* id, int length, uint8_t* contents) - : rpk_socket(id, length, contents, "") +ti99_cartridge_device::rpk_socket::rpk_socket(const char* id, int length, std::unique_ptr &&contents) + : rpk_socket(id, length, std::move(contents), "") { } @@ -1609,7 +1609,7 @@ std::unique_ptr ti99_cartridge_device::rpk_re util::archive_file::error ziperr; uint32_t crc; int length; - uint8_t* contents; + std::unique_ptr contents; int header; // find the file attribute (required) @@ -1635,11 +1635,11 @@ std::unique_ptr ti99_cartridge_device::rpk_re length = zip.current_uncompressed_length(); // Allocate storage - contents = global_alloc_array_clear(length); - if (contents==nullptr) throw rpk_exception(RPK_OUT_OF_MEMORY); + try { contents = make_unique_clear(length); } + catch (std::bad_alloc const &) { throw rpk_exception(RPK_OUT_OF_MEMORY); } // and unzip file from the zip file - ziperr = zip.decompress(contents, length); + ziperr = zip.decompress(contents.get(), length); if (ziperr != util::archive_file::error::NONE) { if (ziperr == util::archive_file::error::UNSUPPORTED) throw rpk_exception(RPK_ZIP_UNSUPPORTED); @@ -1651,7 +1651,7 @@ std::unique_ptr ti99_cartridge_device::rpk_re if (sha1 != nullptr) { util::hash_collection actual_hashes; - actual_hashes.compute((const uint8_t *)contents, length, util::hash_collection::HASH_TYPES_CRC_SHA1); + actual_hashes.compute(contents.get(), length, util::hash_collection::HASH_TYPES_CRC_SHA1); util::hash_collection expected_hashes; expected_hashes.add_from_string(util::hash_collection::HASH_SHA1, sha1, strlen(sha1)); @@ -1660,7 +1660,7 @@ std::unique_ptr ti99_cartridge_device::rpk_re } // Create a socket instance - return std::make_unique(socketname, length, contents); + return std::make_unique(socketname, length, std::move(contents)); } /* @@ -1673,7 +1673,7 @@ std::unique_ptr ti99_cartridge_device::rpk_re const char* ram_filename; std::string ram_pname; unsigned int length; - uint8_t* contents; + std::unique_ptr contents; // find the length attribute length_string = ram_resource_node->get_attribute_string("length", nullptr); @@ -1701,8 +1701,8 @@ std::unique_ptr ti99_cartridge_device::rpk_re } // Allocate memory for this resource - contents = global_alloc_array_clear(length); - if (contents==nullptr) throw rpk_exception(RPK_OUT_OF_MEMORY); + try { contents = make_unique_clear(length); } + catch (std::bad_alloc const &) { throw rpk_exception(RPK_OUT_OF_MEMORY); } LOGMASKED(LOG_RPK, "[RPK handler] Allocating RAM buffer (%d bytes) for socket '%s'\n", length, socketname); @@ -1717,10 +1717,8 @@ std::unique_ptr ti99_cartridge_device::rpk_re // Get the file name (required if persistent) ram_filename = ram_resource_node->get_attribute_string("file", nullptr); if (ram_filename==nullptr) - { - global_free_array(contents); throw rpk_exception(RPK_INVALID_RAM_SPEC, " must have a 'file' attribute"); - } + ram_pname = std::string(system_name).append(PATH_SEPARATOR).append(ram_filename); // load, and fill rest with 00 LOGMASKED(LOG_RPK, "[RPK handler] Loading NVRAM contents from '%s'\n", ram_pname.c_str()); @@ -1734,15 +1732,15 @@ std::unique_ptr ti99_cartridge_device::rpk_re osd_file::error filerr = file.open(ram_pname); int bytes_read = 0; if (filerr == osd_file::error::NONE) - bytes_read = file.read(contents, length); + bytes_read = file.read(contents.get(), length); // fill remaining bytes (if necessary) - memset(((char *) contents) + bytes_read, 0x00, length - bytes_read); + std::fill_n(&contents[bytes_read], length - bytes_read, 0x00); } } // Create a socket instance - return std::make_unique(socketname, length, contents, std::move(ram_pname)); + return std::make_unique(socketname, length, std::move(contents), std::move(ram_pname)); } /*------------------------------------------------- diff --git a/src/devices/bus/ti99/gromport/cartridges.h b/src/devices/bus/ti99/gromport/cartridges.h index b494ad7e28d..f6e2e991d56 100644 --- a/src/devices/bus/ti99/gromport/cartridges.h +++ b/src/devices/bus/ti99/gromport/cartridges.h @@ -170,21 +170,21 @@ private: class rpk_socket { public: - rpk_socket(const char *id, int length, uint8_t *contents); - rpk_socket(const char *id, int length, uint8_t *contents, std::string &&pathname); + rpk_socket(const char *id, int length, std::unique_ptr &&contents); + rpk_socket(const char *id, int length, std::unique_ptr &&contents, std::string &&pathname); ~rpk_socket() {} const char* id() { return m_id; } int get_content_length() { return m_length; } - uint8_t* get_contents() { return m_contents; } + uint8_t* get_contents() { return m_contents.get(); } bool persistent_ram() { return !m_pathname.empty(); } const char* get_pathname() { return m_pathname.c_str(); } - void cleanup() { if (m_contents != nullptr) global_free_array(m_contents); } + void cleanup() { m_contents.reset(); } private: const char* m_id; uint32_t m_length; - uint8_t* m_contents; + std::unique_ptr m_contents; const std::string m_pathname; }; diff --git a/src/devices/bus/ti99/peb/horizon.cpp b/src/devices/bus/ti99/peb/horizon.cpp index 6da8483a046..8d9aa8dd20a 100644 --- a/src/devices/bus/ti99/peb/horizon.cpp +++ b/src/devices/bus/ti99/peb/horizon.cpp @@ -121,24 +121,22 @@ void horizon_ramdisk_device::nvram_read(emu_file &file) int size = 2097152*(1 << ioport("HORIZONSIZE")->read()); // NVRAM plus ROS - uint8_t* buffer = global_alloc_array_clear(MAXSIZE + ROSSIZE); + auto buffer = make_unique_clear(MAXSIZE + ROSSIZE); memset(m_nvram->pointer(), 0, size); memset(m_ros->pointer(), 0, ROSSIZE); // We assume the last 8K is ROS - int filesize = file.read(buffer, MAXSIZE+ROSSIZE); + int filesize = file.read(&buffer[0], MAXSIZE+ROSSIZE); int nvramsize = filesize - ROSSIZE; // If there is a reasonable size if (nvramsize >= 0) { // Copy from buffer to NVRAM and ROS - memcpy(m_nvram->pointer(), buffer, nvramsize); - memcpy(m_ros->pointer(), buffer + nvramsize, ROSSIZE); + memcpy(m_nvram->pointer(), &buffer[0], nvramsize); + memcpy(m_ros->pointer(), &buffer[nvramsize], ROSSIZE); } - - global_free_array(buffer); } //------------------------------------------------- @@ -150,11 +148,11 @@ void horizon_ramdisk_device::nvram_write(emu_file &file) { int nvramsize = 2097152*(1 << ioport("HORIZONSIZE")->read()); - uint8_t* buffer = global_alloc_array_clear(nvramsize + ROSSIZE); - memcpy(buffer, m_nvram->pointer(), nvramsize); - memcpy(buffer + nvramsize, m_ros->pointer(), ROSSIZE); + auto buffer = make_unique_clear(nvramsize + ROSSIZE); + memcpy(&buffer[0], m_nvram->pointer(), nvramsize); + memcpy(&buffer[nvramsize], m_ros->pointer(), ROSSIZE); - file.write(buffer, nvramsize + ROSSIZE); + file.write(buffer.get(), nvramsize + ROSSIZE); } void horizon_ramdisk_device::readz(offs_t offset, uint8_t *value) diff --git a/src/devices/cpu/x86log.cpp b/src/devices/cpu/x86log.cpp index b97f2553f11..7c7b13d1966 100644 --- a/src/devices/cpu/x86log.cpp +++ b/src/devices/cpu/x86log.cpp @@ -37,7 +37,7 @@ x86log_context *x86log_create_context(const char *filename) x86log_context *log; /* allocate the log */ - log = global_alloc_clear(); + log = new x86log_context; /* allocate the filename */ log->filename.assign(filename); @@ -59,7 +59,7 @@ void x86log_free_context(x86log_context *log) noexcept fclose(log->file); /* free the structure */ - global_free(log); + delete log; } diff --git a/src/devices/cpu/x86log.h b/src/devices/cpu/x86log.h index ba2a349a55f..1383295e720 100644 --- a/src/devices/cpu/x86log.h +++ b/src/devices/cpu/x86log.h @@ -8,10 +8,10 @@ ***************************************************************************/ -#pragma once +#ifndef MAME_CPU_X86LOG_H +#define MAME_CPU_X86LOG_H -#ifndef __X86LOG_H__ -#define __X86LOG_H__ +#pragma once #include #include @@ -38,34 +38,34 @@ typedef uint8_t x86code; /* code logging info */ struct log_comment { - x86code* base; - const char* string; + x86code* base = nullptr; + const char* string = nullptr; }; /* data ranges */ struct data_range_t { - x86code* base; - x86code* end; - int size; + x86code* base = nullptr; + x86code* end = nullptr; + int size = 0; }; /* the code logging context */ struct x86log_context { - std::string filename; /* name of the file */ - FILE* file; /* file we are logging to */ + std::string filename; // name of the file + FILE* file = nullptr; // file we are logging to - data_range_t data_range[MAX_DATA_RANGES]; /* list of data ranges */ - int data_range_count; /* number of data ranges */ + data_range_t data_range[MAX_DATA_RANGES]; // list of data ranges + int data_range_count = 0; // number of data ranges - log_comment comment_list[MAX_COMMENTS]; /* list of comments */ - int comment_count; /* number of live comments */ + log_comment comment_list[MAX_COMMENTS]; // list of comments + int comment_count = 0; // number of live comments - char comment_pool[COMMENT_POOL_SIZE]; /* string pool to hold comments */ - char* comment_pool_next; /* pointer to next string pool location */ + char comment_pool[COMMENT_POOL_SIZE]; // string pool to hold comments + char* comment_pool_next = nullptr; // pointer to next string pool location }; @@ -160,4 +160,4 @@ inline void x86log_printf(x86log_context* log, const char* format, Ts&&... xs) fflush(log->file); } -#endif /* __X86LOG_H__ */ +#endif // MAME_CPU_X86LOG_H diff --git a/src/devices/imagedev/floppy.cpp b/src/devices/imagedev/floppy.cpp index f39be79c761..fc4631199d8 100644 --- a/src/devices/imagedev/floppy.cpp +++ b/src/devices/imagedev/floppy.cpp @@ -178,7 +178,7 @@ floppy_image_device::floppy_image_device(const machine_config &mconfig, device_t device_image_interface(mconfig, *this), input_format(nullptr), output_format(nullptr), - image(nullptr), + image(), fif_list(nullptr), index_timer(nullptr), tracks(0), @@ -307,7 +307,7 @@ void floppy_image_device::commit_image() if (err != osd_file::error::NONE) popmessage("Error, unable to truncate image: %d", int(err)); - output_format->save(&io, image); + output_format->save(&io, image.get()); } //------------------------------------------------- @@ -473,12 +473,11 @@ image_init_result floppy_image_device::call_load() return image_init_result::FAIL; } - image = global_alloc(floppy_image(tracks, sides, form_factor)); - if (!best_format->load(&io, form_factor, image)) + image = std::make_unique(tracks, sides, form_factor); + if (!best_format->load(&io, form_factor, image.get())) { seterror(IMAGE_ERROR_UNSUPPORTED, "Incompatible image format or corrupted data"); - global_free(image); - image = nullptr; + image.reset(); return image_init_result::FAIL; } output_format = is_readonly() ? nullptr : best_format; @@ -501,8 +500,7 @@ void floppy_image_device::call_unload() if (image) { if(image_dirty) commit_image(); - global_free(image); - image = nullptr; + image.reset(); } wpt = 1; // disk sleeve is covering the sensor @@ -526,7 +524,7 @@ void floppy_image_device::call_unload() image_init_result floppy_image_device::call_create(int format_type, util::option_resolution *format_options) { - image = global_alloc(floppy_image(tracks, sides, form_factor)); + image = std::make_unique(tracks, sides, form_factor); output_format = nullptr; // search for a suitable format based on the extension diff --git a/src/devices/imagedev/floppy.h b/src/devices/imagedev/floppy.h index 515cf28f610..b163b0b6a42 100644 --- a/src/devices/imagedev/floppy.h +++ b/src/devices/imagedev/floppy.h @@ -154,7 +154,7 @@ protected: floppy_image_format_t *input_format; floppy_image_format_t *output_format; - floppy_image *image; + std::unique_ptr image; char extension_list[256]; floppy_image_format_t *fif_list; emu_timer *index_timer; diff --git a/src/devices/imagedev/mfmhd.cpp b/src/devices/imagedev/mfmhd.cpp index a90cf75ea54..61eabb12217 100644 --- a/src/devices/imagedev/mfmhd.cpp +++ b/src/devices/imagedev/mfmhd.cpp @@ -366,7 +366,7 @@ void mfm_harddisk_device::device_start() m_current_cylinder = m_landing_zone; // Park position m_spinup_timer->adjust(attotime::from_msec(m_spinupms)); - m_cache = global_alloc(mfmhd_trackimage_cache(machine())); + m_cache = std::make_unique(machine()); // In 5 second periods, check whether the cache has dirty lines m_cache_timer->adjust(attotime::from_msec(5000), 0, attotime::from_msec(5000)); @@ -411,7 +411,7 @@ void mfm_harddisk_device::device_reset() void mfm_harddisk_device::device_stop() { - if (m_cache!=nullptr) global_free(m_cache); + m_cache.reset(); } /* @@ -1010,9 +1010,8 @@ mfmhd_trackimage_cache::~mfmhd_trackimage_cache() while (current != nullptr) { - global_free_array(current->encdata); mfmhd_trackimage* currenttmp = current->next; - global_free(current); + delete current; current = currenttmp; } } @@ -1025,7 +1024,7 @@ void mfmhd_trackimage_cache::write_back_one() { if (current->dirty) { - m_mfmhd->write_track(current->encdata, current->cylinder, current->head); + m_mfmhd->write_track(current->encdata.get(), current->cylinder, current->head); current->dirty = false; break; } @@ -1045,7 +1044,7 @@ void mfmhd_trackimage_cache::cleanup() if (TRACE_CACHE) m_machine.logerror("[%s:cache] MFM HD cache: evict line cylinder=%d head=%d\n", m_mfmhd->tag(), current->cylinder, current->head); if (current->dirty) { - m_mfmhd->write_track(current->encdata, current->cylinder, current->head); + m_mfmhd->write_track(current->encdata.get(), current->cylinder, current->head); current->dirty = false; } mfmhd_trackimage* currenttmp = current->next; @@ -1087,11 +1086,11 @@ void mfmhd_trackimage_cache::init(mfm_harddisk_device* mfmhd, int tracksize, int { if (TRACE_DETAIL) m_machine.logerror("[%s:cache] MFM HD allocate cache slot\n", mfmhd->tag()); previous = current; - current = global_alloc(mfmhd_trackimage); - current->encdata = global_alloc_array(uint16_t, tracksize); + current = new mfmhd_trackimage; + current->encdata = std::make_unique(tracksize); // Load the first tracks into the slots - state = m_mfmhd->load_track(current->encdata, cylinder, head); + state = m_mfmhd->load_track(current->encdata.get(), cylinder, head); if (state != CHDERR_NONE) throw emu_fatalerror("Cannot load (c=%d,h=%d) from hard disk", cylinder, head); current->dirty = false; @@ -1148,7 +1147,7 @@ uint16_t* mfmhd_trackimage_cache::get_trackimage(int cylinder, int head) current->next = m_tracks; // put the previous head into the next field m_tracks = current; // set this line as new head } - return current->encdata; + return current->encdata.get(); } else { @@ -1168,11 +1167,11 @@ uint16_t* mfmhd_trackimage_cache::get_trackimage(int cylinder, int head) if (current->dirty) { - m_mfmhd->write_track(current->encdata, current->cylinder, current->head); + m_mfmhd->write_track(current->encdata.get(), current->cylinder, current->head); current->dirty = false; } - state = m_mfmhd->load_track(current->encdata, cylinder, head); + state = m_mfmhd->load_track(current->encdata.get(), cylinder, head); current->dirty = false; current->cylinder = cylinder; diff --git a/src/devices/imagedev/mfmhd.h b/src/devices/imagedev/mfmhd.h index 2d689a168cb..007be4be420 100644 --- a/src/devices/imagedev/mfmhd.h +++ b/src/devices/imagedev/mfmhd.h @@ -27,7 +27,7 @@ public: bool dirty; int cylinder; int head; - uint16_t* encdata; // MFM encoding per byte + std::unique_ptr encdata; // MFM encoding per byte mfmhd_trackimage* next; }; @@ -152,7 +152,7 @@ private: attotime m_settle_time; attotime m_step_time; - mfmhd_trackimage_cache* m_cache; + std::unique_ptr m_cache; mfmhd_image_format_t* m_format; void head_move(); diff --git a/src/devices/imagedev/midiin.cpp b/src/devices/imagedev/midiin.cpp index 6086cb48a3e..62c7cba52a1 100644 --- a/src/devices/imagedev/midiin.cpp +++ b/src/devices/imagedev/midiin.cpp @@ -26,7 +26,7 @@ midiin_device::midiin_device(const machine_config &mconfig, const char *tag, dev : device_t(mconfig, MIDIIN, tag, owner, clock), device_image_interface(mconfig, *this), device_serial_interface(mconfig, *this), - m_midi(nullptr), + m_midi(), m_timer(nullptr), m_input_cb(*this), m_xmit_read(0), @@ -43,7 +43,7 @@ void midiin_device::device_start() { m_input_cb.resolve_safe(); m_timer = timer_alloc(0); - m_midi = nullptr; + m_midi.reset(); m_timer->enable(false); } @@ -68,7 +68,7 @@ void midiin_device::device_timer(emu_timer &timer, device_timer_id id, int param uint8_t buf[8192*4]; int bytesRead; - if (m_midi == nullptr) { + if (!m_midi) { return; } @@ -91,14 +91,13 @@ void midiin_device::device_timer(emu_timer &timer, device_timer_id id, int param call_load -------------------------------------------------*/ -image_init_result midiin_device::call_load(void) +image_init_result midiin_device::call_load() { m_midi = machine().osd().create_midi_device(); if (!m_midi->open_input(filename())) { - global_free(m_midi); - m_midi = nullptr; + m_midi.reset(); return image_init_result::FAIL; } @@ -111,15 +110,14 @@ image_init_result midiin_device::call_load(void) call_unload -------------------------------------------------*/ -void midiin_device::call_unload(void) +void midiin_device::call_unload() { if (m_midi) { m_midi->close(); - global_free(m_midi); } - m_timer->enable(false); - m_midi = nullptr; + m_midi.reset(); + m_timer->enable(false); } void midiin_device::tra_complete() diff --git a/src/devices/imagedev/midiin.h b/src/devices/imagedev/midiin.h index ad9eeabf236..dbebdfd71fc 100644 --- a/src/devices/imagedev/midiin.h +++ b/src/devices/imagedev/midiin.h @@ -60,7 +60,7 @@ private: void xmit_char(uint8_t data); - osd_midi_device *m_midi; + std::unique_ptr m_midi; emu_timer *m_timer; devcb_write_line m_input_cb; uint8_t m_xmitring[XMIT_RING_SIZE]; diff --git a/src/devices/imagedev/midiout.cpp b/src/devices/imagedev/midiout.cpp index 3c0613e2015..e9551a50d17 100644 --- a/src/devices/imagedev/midiout.cpp +++ b/src/devices/imagedev/midiout.cpp @@ -26,7 +26,7 @@ midiout_device::midiout_device(const machine_config &mconfig, const char *tag, d : device_t(mconfig, MIDIOUT, tag, owner, clock), device_image_interface(mconfig, *this), device_serial_interface(mconfig, *this), - m_midi(nullptr) + m_midi() { } @@ -36,7 +36,7 @@ midiout_device::midiout_device(const machine_config &mconfig, const char *tag, d void midiout_device::device_start() { - m_midi = nullptr; + m_midi.reset(); } void midiout_device::device_reset() @@ -51,14 +51,13 @@ void midiout_device::device_reset() call_load -------------------------------------------------*/ -image_init_result midiout_device::call_load(void) +image_init_result midiout_device::call_load() { m_midi = machine().osd().create_midi_device(); if (!m_midi->open_output(filename())) { - global_free(m_midi); - m_midi = nullptr; + m_midi.reset(); return image_init_result::FAIL; } @@ -69,13 +68,12 @@ image_init_result midiout_device::call_load(void) call_unload -------------------------------------------------*/ -void midiout_device::call_unload(void) +void midiout_device::call_unload() { if (m_midi) { m_midi->close(); - global_free(m_midi); - m_midi = nullptr; + m_midi.reset(); } } diff --git a/src/devices/imagedev/midiout.h b/src/devices/imagedev/midiout.h index 2b182e0273d..20bc87131c5 100644 --- a/src/devices/imagedev/midiout.h +++ b/src/devices/imagedev/midiout.h @@ -53,7 +53,7 @@ protected: virtual void rcv_complete() override; // Rx completed receiving byte private: - osd_midi_device *m_midi; + std::unique_ptr m_midi; }; // device type definition diff --git a/src/devices/sound/spu.cpp b/src/devices/sound/spu.cpp index 2f85c6c87f7..9a8f503cf04 100644 --- a/src/devices/sound/spu.cpp +++ b/src/devices/sound/spu.cpp @@ -272,7 +272,8 @@ public: invalid_end, loopaddr, last_update_end; - signed short *data,*loop,*dend; + std::unique_ptr data; + signed short *loop,*dend; adpcm_decoder decoder, update_decoder; mutable int ref_count; bool valid, @@ -301,8 +302,8 @@ public: ref_count--; if (ref_count==0) { - cache_size-=(dend-data)<<1; - global_free(this); + cache_size-=(dend-data.get())<<1; + delete this; } } @@ -521,7 +522,7 @@ public: head=xam->offset; marker_tail=xam->prev; if (marker_tail) marker_tail->next=nullptr; - global_free(xam); + delete xam; } // Set marker head to nullptr if the list is now empty @@ -544,7 +545,7 @@ public: { stream_marker *m=marker_head; marker_head=marker_head->next; - global_free(m); + delete m; } marker_head=marker_tail=nullptr; @@ -566,7 +567,7 @@ public: stream_marker *xam=marker_head; marker_head=xam->next; - global_free(xam); + delete xam; if (marker_head) marker_head->prev=nullptr; } @@ -606,12 +607,12 @@ static inline int clamp(const int v) spu_device::sample_cache::~sample_cache() { - global_free_array(data); + data.reset(); while (loop_cache) { sample_loop_cache *lc=loop_cache; loop_cache=lc->next; - global_free(lc); + delete lc; } } @@ -623,7 +624,7 @@ signed short *spu_device::sample_cache::get_sample_pointer(const unsigned int ad { if ((addr>=start) && (addr>4)*28); + return &data[((addr-start)>>4)*28]; } else { return nullptr; @@ -668,9 +669,9 @@ bool spu_device::sample_cache::get_loop_pointer(cache_pointer *cp) unsigned int spu_device::sample_cache::get_sample_address(const signed short *ptr) const { - if ((ptr>=data) && (ptr<=dend)) + if ((ptr>=data.get()) && (ptr<=dend)) { - return start+(((ptr-data)/28)<<4); + return start+(((ptr-data.get())/28)<<4); } else { return -1; @@ -705,7 +706,7 @@ void spu_device::sample_cache::add_loop_cache(sample_loop_cache *lc) bool spu_device::sample_cache::is_valid_pointer(signed short *ptr) const { - if ((ptr>=data) && (data<=dend)) return true; + if ((ptr>=data.get()) && (data.get()<=dend)) return true; for (sample_loop_cache *slc=loop_cache; slc; slc=slc->next) if ((ptr>=slc->data) && (ptr<(slc->data+num_loop_cache_samples))) return true; @@ -720,7 +721,7 @@ bool spu_device::sample_cache::try_update(spu_device *spu) { if ((invalid_start>=start) && (invalid_end<=end)) { - adpcm_packet *ap=(adpcm_packet *)(spu->spu_ram+start); + adpcm_packet *ap=(adpcm_packet *)&spu->spu_ram[start]; unsigned int a; unsigned int loop=0; @@ -756,8 +757,8 @@ bool spu_device::sample_cache::try_update(spu_device *spu) printf("\n"); #endif - signed short *dp=data+(((invalid_start-start)>>4)*28); - ap=(adpcm_packet *)(spu->spu_ram+invalid_start); + signed short *dp=&data[((invalid_start-start)>>4)*28]; + ap=(adpcm_packet *)&spu->spu_ram[invalid_start]; for (a=invalid_start; alen; unsigned int adr=lc->loopstart; for (unsigned int i=0; ((ispu_ram+adr),dp); + dp=tmp.decode_packet((adpcm_packet *)&spu->spu_ram[adr],dp); } } @@ -847,7 +848,7 @@ bool spu_device::cache_pointer::update(spu_device *spu) // Cache is invalid, calculate play address offset from start of // old cache block - unsigned int off=ptr-cache->data, + unsigned int off=ptr-cache->data.get(), addr=cache->start; // Release cache block and get updated one @@ -856,7 +857,7 @@ bool spu_device::cache_pointer::update(spu_device *spu) // Calculate play address in new cache block - ptr=cache->data+off; + ptr=&cache->data[off]; if (ptr>=cache->dend) { @@ -870,7 +871,7 @@ bool spu_device::cache_pointer::update(spu_device *spu) // Return false if we do not have a cache block or the play address is invalid - if ((cache) && ((ptr>=cache->data) && (ptrdend))) + if ((cache) && ((ptr>=cache->data.get()) && (ptrdend))) { return true; } else @@ -967,15 +968,15 @@ void spu_device::device_start() m_irq_handler.resolve_safe(); voice=new voiceinfo [24]; - spu_ram=new unsigned char [spu_ram_size]; + spu_ram=std::make_unique(spu_ram_size); xa_buffer=new spu_stream_buffer(xa_sector_size,xa_buffer_sectors); cdda_buffer=new spu_stream_buffer(cdda_sector_size,cdda_buffer_sectors); init_stream(); - cache=new sample_cache *[spu_ram_size>>4]; - memset(cache,0,(spu_ram_size>>4)*sizeof(sample_cache *)); + cache=std::make_unique(spu_ram_size>>4); + std::fill_n(cache.get(), spu_ram_size>>4, nullptr); // register save state stuff save_item(NAME(reg)); // this covers all spureg.* plus the reverb parameter block @@ -1031,16 +1032,16 @@ void spu_device::device_reset() cdda_playing=false; m_cd_out_ptr = 0; - memset(spu_ram,0,spu_ram_size); + memset(spu_ram.get(),0,spu_ram_size); memset(reg,0,0x200); memset(voice,0,sizeof(voiceinfo)*24); spureg.status|=(1<<7)|(1<<10); - memset(cache,0,(spu_ram_size>>4)*sizeof(sample_cache *)); + std::fill_n(cache.get(), spu_ram_size>>4, nullptr); for (auto & elem : output_buf) - elem=new unsigned char [output_buffer_size]; + elem=std::make_unique(output_buffer_size); output_head=output_tail=output_size=0; noise_t=0; @@ -1058,7 +1059,7 @@ void spu_device::device_post_load() dirty_flags = -1; // kill and reallocate reverb to avoid artifacts - global_free(rev); + delete rev; rev = new reverb(44100); // and do some update processing @@ -1074,16 +1075,16 @@ void spu_device::device_post_load() void spu_device::device_stop() { for (auto & elem : output_buf) - global_free_array(elem); + elem.reset(); kill_stream(); - global_free_array(spu_ram); + spu_ram.reset(); invalidate_cache(0,spu_ram_size); - global_free_array(cache); - global_free(xa_buffer); - global_free(cdda_buffer); - global_free_array(voice); + cache.reset(); + delete xa_buffer; + delete cdda_buffer; + delete [] voice; } // // @@ -1107,7 +1108,7 @@ void spu_device::init_stream() void spu_device::kill_stream() { - global_free(rev); + delete rev; rev=nullptr; } @@ -1262,7 +1263,7 @@ void spu_device::write_data(const unsigned short data) assert(taddr>4]) flush_cache(cache[taddr>>4],taddr,taddr+2); - *((unsigned short *)(spu_ram+taddr))=data; + *((unsigned short *)&spu_ram[taddr])=data; taddr+=2; } @@ -1342,7 +1343,7 @@ spu_device::sample_cache *spu_device::get_sample_cache(const unsigned int addr) sc->start=addr; sc->loop=nullptr; - adpcm_packet *ap=(adpcm_packet *)(spu_ram+sc->start); + adpcm_packet *ap=(adpcm_packet *)&spu_ram[sc->start]; unsigned int a; for (a=addr; a<(512*1024); a+=16, ap++) { @@ -1358,13 +1359,13 @@ spu_device::sample_cache *spu_device::get_sample_cache(const unsigned int addr) sc->end=(std::min)(spu_ram_size,a+16); unsigned int sz=((sc->end-sc->start)>>4)*28; - sc->data=new signed short [sz]; + sc->data=std::make_unique(sz); sample_cache::cache_size+=sz<<1; sc->loopaddr=loop; - if (loop) sc->loop=sc->data+(((loop-sc->start)>>4)*28); + if (loop) sc->loop=&sc->data[((loop-sc->start)>>4)*28]; - signed short *dp=sc->data; - ap=(adpcm_packet *)(spu_ram+sc->start); + signed short *dp=sc->data.get(); + ap=(adpcm_packet *)&spu_ram[sc->start]; for (a=sc->start; aend; a+=16, ap++) dp=sc->decoder.decode_packet(ap,dp); @@ -1389,7 +1390,7 @@ bool spu_device::translate_sample_addr(const unsigned int addr, cache_pointer *c cp->reset(); if ((cp->cache=get_sample_cache(addr))) { - cp->ptr=cp->cache->data+(((addr-cp->cache->start)>>4)*28); + cp->ptr=&cp->cache->data[((addr-cp->cache->start)>>4)*28]; cp->cache->add_ref(); return true; } @@ -1530,7 +1531,7 @@ spu_device::sample_loop_cache *spu_device::get_loop_cache(sample_cache *cache, c signed short *dp=lc->data; for (unsigned int i=0; ((iend)); i++, adr+=16) - dp=tmp.decode_packet((adpcm_packet *)(spu_ram+adr),dp); + dp=tmp.decode_packet((adpcm_packet *)&spu_ram[adr],dp); #ifdef log_loop_cache log(log_spu,"spu: add loop cache %08x %08x->%08x (end at %08x)\n",lc,lpen,lpst,adr); @@ -1572,7 +1573,7 @@ void spu_device::update_voice_loop(const unsigned int v) { ra=spureg.voice[v].repaddr<<3; ra=(ra+0xf)&~0xf; - const adpcm_packet *ap=ra?(adpcm_packet *)(spu_ram+ra):nullptr; + const adpcm_packet *ap=ra?(adpcm_packet *)&spu_ram[ra]:nullptr; if (ap) { @@ -2393,8 +2394,8 @@ void spu_device::generate_xa(void *ptr, const unsigned int sz) // Write to SPU XA buffer (for emulation purposes - some games read this // back to do analysers, etc...) - *(signed short *)(spu_ram+xa_out_ptr)=vl; - *(signed short *)(spu_ram+xa_out_ptr+0x800)=vr; + *(signed short *)&spu_ram[xa_out_ptr]=vl; + *(signed short *)&spu_ram[xa_out_ptr+0x800]=vr; xa_out_ptr=(xa_out_ptr+2)&0x7ff; // Mix samples into output buffer @@ -2430,7 +2431,7 @@ void spu_device::generate_xa(void *ptr, const unsigned int sz) { xa_playing=false; - memset(spu_ram,0,0x1000); + memset(spu_ram.get(),0,0x1000); xa_out_ptr=0; } } @@ -2465,8 +2466,8 @@ void spu_device::generate_cdda(void *ptr, const unsigned int sz) int16_t vr = ((sp[1]*volr)>>15); // if the volume adjusted samples are stored here, vibribbon does nothing - *(signed short *)(spu_ram+m_cd_out_ptr)=sp[0]; - *(signed short *)(spu_ram+m_cd_out_ptr+0x400)=sp[1]; + *(signed short *)&spu_ram[m_cd_out_ptr]=sp[0]; + *(signed short *)&spu_ram[m_cd_out_ptr+0x400]=sp[1]; m_cd_out_ptr=(m_cd_out_ptr+2)&0x3ff; //if((m_cd_out_ptr == ((spureg.irq_addr << 3) & ~0x400)) && (spureg.ctrl & spuctrl_irq_enable)) @@ -2575,10 +2576,10 @@ void spu_device::generate(void *ptr, const unsigned int sz) while ((left) && (output_size)) { unsigned int n=(std::min)((std::min)(left,output_buffer_size-output_head),output_size); - memcpy(dp,output_buf[0]+output_head,n); + memcpy(dp,&output_buf[0][output_head],n); rev->process((signed short *)dp, - (signed short *)(output_buf[1]+output_head), + (signed short *)&output_buf[1][output_head], spu_reverb_cfg, (signed short)spureg.rvol_l, (signed short)spureg.rvol_r, @@ -2683,10 +2684,10 @@ void spu_device::process_until(const unsigned int tsample) process_samples=(std::min)(process_samples, (output_buffer_size-output_tail)>>2); - unsigned char *outptr=output_buf[0]+output_tail, - *reverbptr=output_buf[1]+output_tail, - *fmptr=output_buf[2]+output_tail, - *noiseptr=output_buf[3]+output_tail; + unsigned char *outptr=&output_buf[0][output_tail], + *reverbptr=&output_buf[1][output_tail], + *fmptr=&output_buf[2][output_tail], + *noiseptr=&output_buf[3][output_tail]; output_tail+=process_samples<<2; output_tail&=(output_buffer_size-1); @@ -2796,13 +2797,13 @@ void spu_device::start_dma(uint8_t *mainram, bool to_spu, uint32_t size) { invalidate_cache(st,en); - memcpy(spu_ram+(spureg.trans_addr<<3), mainram, size); + memcpy(&spu_ram[spureg.trans_addr<<3], mainram, size); dirty_flags|=dirtyflag_ram; } else { - memcpy(mainram, spu_ram+(spureg.trans_addr<<3), size); + memcpy(mainram, &spu_ram[spureg.trans_addr<<3], size); } } diff --git a/src/devices/sound/spu.h b/src/devices/sound/spu.h index 54942d9d324..7aee602e38c 100644 --- a/src/devices/sound/spu.h +++ b/src/devices/sound/spu.h @@ -49,7 +49,7 @@ protected: // internal state devcb_write_line m_irq_handler; - unsigned char *spu_ram; + std::unique_ptr spu_ram; reverb *rev; unsigned int taddr; unsigned int sample_t; @@ -73,13 +73,13 @@ protected: bool status_enabled, xa_playing, cdda_playing; int xa_voll, xa_volr, changed_xa_vol; voiceinfo *voice; - sample_cache **cache; + std::unique_ptr cache; float samples_per_frame; float samples_per_cycle; static float freq_multiplier; - unsigned char *output_buf[4]; + std::unique_ptr output_buf[4]; unsigned int output_head; unsigned int output_tail; unsigned int output_size; diff --git a/src/devices/sound/spureverb.cpp b/src/devices/sound/spureverb.cpp index cf747af1acb..e57c33d448d 100644 --- a/src/devices/sound/spureverb.cpp +++ b/src/devices/sound/spureverb.cpp @@ -34,15 +34,11 @@ spu_device::reverb::reverb(const int hz, const int maxdelay) for (int c=0; c<2; c++) { for (int f=0; f<4; f++) { - y[c][f]=new signed short [maxdelay]; - memset(y[c][f], 0, sizeof(signed short) * maxdelay); + y[c][f]=make_unique_clear(maxdelay); } - x[c]=new signed short [maxdelay]; - memset(x[c], 0, sizeof(signed short) * maxdelay); - ax[c]=new signed short [maxdelay]; - memset(ax[c], 0, sizeof(signed short) * maxdelay); - ay[c]=new signed short [maxdelay]; - memset(ay[c], 0, sizeof(signed short) * maxdelay); + x[c]=make_unique_clear(maxdelay); + ax[c]=make_unique_clear(maxdelay); + ay[c]=make_unique_clear(maxdelay); } memset(bx1,0,sizeof(bx1)); memset(by1,0,sizeof(by1)); @@ -54,14 +50,6 @@ spu_device::reverb::reverb(const int hz, const int maxdelay) spu_device::reverb::~reverb() { - for (int c=0; c<2; c++) - { - for (int f=0; f<4; f++) - global_free_array(y[c][f]); - global_free_array(x[c]); - global_free_array(ax[c]); - global_free_array(ay[c]); - } } // diff --git a/src/devices/sound/spureverb.h b/src/devices/sound/spureverb.h index 64b174bcfb6..d87c3a6b4b8 100644 --- a/src/devices/sound/spureverb.h +++ b/src/devices/sound/spureverb.h @@ -29,12 +29,12 @@ struct spu_device::reverb_preset class spu_device::reverb { - signed short - *y[2][4], - *x[2], - *ax[2], - *ay[2], - bx1[2][2],by1[2]; + std::unique_ptr + y[2][4], + x[2], + ax[2], + ay[2]; + signed short bx1[2][2],by1[2]; int yp, max_delay, sound_hz; typedef int comb_param[2][4]; diff --git a/src/emu/addrmap.cpp b/src/emu/addrmap.cpp index 61f7375d236..604e05ab864 100644 --- a/src/emu/addrmap.cpp +++ b/src/emu/addrmap.cpp @@ -873,7 +873,7 @@ void address_map::global_mask(offs_t mask) address_map_entry &address_map::operator()(offs_t start, offs_t end) { - address_map_entry *ptr = global_alloc(address_map_entry(*m_device, *this, start, end)); + address_map_entry *ptr = new address_map_entry(*m_device, *this, start, end); m_entrylist.append(*ptr); return *ptr; } diff --git a/src/emu/debug/debugvw.cpp b/src/emu/debug/debugvw.cpp index 1d88f0485e2..a104bb82529 100644 --- a/src/emu/debug/debugvw.cpp +++ b/src/emu/debug/debugvw.cpp @@ -326,7 +326,7 @@ debug_view_manager::~debug_view_manager() { debug_view *oldhead = m_viewlist; m_viewlist = oldhead->m_next; - global_free(oldhead); + delete oldhead; } } @@ -340,25 +340,25 @@ debug_view *debug_view_manager::alloc_view(debug_view_type type, debug_view_osd_ switch (type) { case DVT_CONSOLE: - return append(global_alloc(debug_view_console(machine(), osdupdate, osdprivate))); + return append(new debug_view_console(machine(), osdupdate, osdprivate)); case DVT_STATE: - return append(global_alloc(debug_view_state(machine(), osdupdate, osdprivate))); + return append(new debug_view_state(machine(), osdupdate, osdprivate)); case DVT_DISASSEMBLY: - return append(global_alloc(debug_view_disasm(machine(), osdupdate, osdprivate))); + return append(new debug_view_disasm(machine(), osdupdate, osdprivate)); case DVT_MEMORY: - return append(global_alloc(debug_view_memory(machine(), osdupdate, osdprivate))); + return append(new debug_view_memory(machine(), osdupdate, osdprivate)); case DVT_LOG: - return append(global_alloc(debug_view_log(machine(), osdupdate, osdprivate))); + return append(new debug_view_log(machine(), osdupdate, osdprivate)); case DVT_BREAK_POINTS: - return append(global_alloc(debug_view_breakpoints(machine(), osdupdate, osdprivate))); + return append(new debug_view_breakpoints(machine(), osdupdate, osdprivate)); case DVT_WATCH_POINTS: - return append(global_alloc(debug_view_watchpoints(machine(), osdupdate, osdprivate))); + return append(new debug_view_watchpoints(machine(), osdupdate, osdprivate)); default: fatalerror("Attempt to create invalid debug view type %d\n", type); @@ -378,7 +378,7 @@ void debug_view_manager::free_view(debug_view &view) if (*viewptr == &view) { *viewptr = view.m_next; - global_free(&view); + delete &view; break; } } diff --git a/src/emu/emualloc.cpp b/src/emu/emualloc.cpp index bc08416abb9..1dd78feaeed 100644 --- a/src/emu/emualloc.cpp +++ b/src/emu/emualloc.cpp @@ -143,7 +143,7 @@ void resource_pool::remove(void *ptr) // delete the object and break if (LOG_ALLOCS) fprintf(stderr, "#%06d, delete %d bytes\n", u32(deleteme->m_id), u32(deleteme->m_size)); - global_free(deleteme); + delete deleteme; break; } } diff --git a/src/emu/emualloc.h b/src/emu/emualloc.h index 0ed7cc7ea75..630c3d0a1fd 100644 --- a/src/emu/emualloc.h +++ b/src/emu/emualloc.h @@ -26,10 +26,10 @@ //************************************************************************** // pool allocation helpers -#define pool_alloc(_pool, _type) (_pool).add_object(global_alloc(_type)) -#define pool_alloc_clear(_pool, _type) (_pool).add_object(global_alloc_clear _type) -#define pool_alloc_array(_pool, _type, _num) (_pool).add_array(global_alloc_array(_type,_num), (_num)) -#define pool_alloc_array_clear(_pool, _type, _num) (_pool).add_array(global_alloc_array_clear<_type>(_num), (_num)) +#define pool_alloc(_pool, _type) (_pool).add_object(new _type) +#define pool_alloc_clear(_pool, _type) (_pool).add_object(make_unique_clear _type .release()) +#define pool_alloc_array(_pool, _type, _num) (_pool).add_array(new _type [_num], (_num)) +#define pool_alloc_array_clear(_pool, _type, _num) (_pool).add_array(make_unique_clear<_type []>(_num).release(), (_num)) #define pool_free(_pool, v) (_pool).remove(v) diff --git a/src/emu/ioport.cpp b/src/emu/ioport.cpp index f406ee6420b..bad25e4030a 100644 --- a/src/emu/ioport.cpp +++ b/src/emu/ioport.cpp @@ -1282,7 +1282,7 @@ void ioport_field::expand_diplocation(const char *location, std::string &errorbu errorbuf.append(string_format("Switch location '%s' has invalid format!\n", location)); // allocate a new entry - m_diploclist.append(*global_alloc(ioport_diplocation(name.c_str(), swnum, invert))); + m_diploclist.append(*new ioport_diplocation(name.c_str(), swnum, invert)); entries++; // advance to the next item @@ -1618,15 +1618,15 @@ ioport_port_live::ioport_port_live(ioport_port &port) // allocate analog state if it's analog analog_field *analog = nullptr; if (field.is_analog()) - analog = &analoglist.append(*global_alloc(analog_field(field))); + analog = &analoglist.append(*new analog_field(field)); // allocate a dynamic field for reading if (field.has_dynamic_read()) - readlist.append(*global_alloc(dynamic_field(field))); + readlist.append(*new dynamic_field(field)); // allocate a dynamic field for writing if (field.has_dynamic_write()) - writelist.append(*global_alloc(dynamic_field(field))); + writelist.append(*new dynamic_field(field)); // let the field initialize its live state field.init_live_state(analog); @@ -1956,7 +1956,7 @@ digital_joystick &ioport_manager::digjoystick(int player, int number) return joystick; // create a new one - return m_joystick_list.append(*global_alloc(digital_joystick(player, number))); + return m_joystick_list.append(*new digital_joystick(player, number)); } @@ -3011,7 +3011,7 @@ ioport_configurer& ioport_configurer::field_alloc(ioport_type type, ioport_value // append the field if (type != IPT_UNKNOWN && type != IPT_UNUSED) m_curport->m_active |= mask; - m_curfield = &m_curport->m_fieldlist.append(*global_alloc(ioport_field(*m_curport, type, defval, mask, string_from_token(name)))); + m_curfield = &m_curport->m_fieldlist.append(*new ioport_field(*m_curport, type, defval, mask, string_from_token(name))); // reset the current setting m_cursetting = nullptr; @@ -3068,7 +3068,7 @@ ioport_configurer& ioport_configurer::setting_alloc(ioport_value value, const ch if (m_curfield == nullptr) throw emu_fatalerror("alloc_setting called with no active field (value=%X name=%s)\n", value, name); - m_cursetting = global_alloc(ioport_setting(*m_curfield, value & m_curfield->mask(), string_from_token(name))); + m_cursetting = new ioport_setting(*m_curfield, value & m_curfield->mask(), string_from_token(name)); // append a new setting m_curfield->m_settinglist.append(*m_cursetting); return *this; diff --git a/src/emu/render.cpp b/src/emu/render.cpp index 817ae6e14cc..ef06e0c922c 100644 --- a/src/emu/render.cpp +++ b/src/emu/render.cpp @@ -337,11 +337,10 @@ void render_texture::reset(render_manager &manager, texture_scaler_func scaler, void render_texture::release() { // free all scaled versions - for (auto & elem : m_scaled) + for (auto &elem : m_scaled) { - m_manager->invalidate_all(elem.bitmap); - global_free(elem.bitmap); - elem.bitmap = nullptr; + m_manager->invalidate_all(elem.bitmap.get()); + elem.bitmap.reset(); elem.seqid = 0; } @@ -378,12 +377,9 @@ void render_texture::set_bitmap(bitmap_t &bitmap, const rectangle &sbounds, text // invalidate all scaled versions for (auto & elem : m_scaled) { - if (elem.bitmap != nullptr) - { - m_manager->invalidate_all(elem.bitmap); - global_free(elem.bitmap); - } - elem.bitmap = nullptr; + if (elem.bitmap) + m_manager->invalidate_all(elem.bitmap.get()); + elem.bitmap.reset(); elem.seqid = 0; } } @@ -460,21 +456,21 @@ void render_texture::get_scaled(u32 dwidth, u32 dheight, render_texinfo &texinfo // didn't find one -- take the entry with the lowest seqnum for (scalenum = 0; scalenum < ARRAY_LENGTH(m_scaled); scalenum++) - if ((lowest == -1 || m_scaled[scalenum].seqid < m_scaled[lowest].seqid) && !primlist.has_reference(m_scaled[scalenum].bitmap)) + if ((lowest == -1 || m_scaled[scalenum].seqid < m_scaled[lowest].seqid) && !primlist.has_reference(m_scaled[scalenum].bitmap.get())) lowest = scalenum; if (-1 == lowest) throw emu_fatalerror("render_texture::get_scaled: Too many live texture instances!"); // throw out any existing entries scaled = &m_scaled[lowest]; - if (scaled->bitmap != nullptr) + if (scaled->bitmap) { - m_manager->invalidate_all(scaled->bitmap); - global_free(scaled->bitmap); + m_manager->invalidate_all(scaled->bitmap.get()); + scaled->bitmap.reset(); } // allocate a new bitmap - scaled->bitmap = global_alloc(bitmap_argb32(dwidth, dheight)); + scaled->bitmap = std::make_unique(dwidth, dheight); scaled->seqid = ++m_curseq; // let the scaler do the work @@ -482,7 +478,7 @@ void render_texture::get_scaled(u32 dwidth, u32 dheight, render_texinfo &texinfo } // finally fill out the new info - primlist.add_reference(scaled->bitmap); + primlist.add_reference(scaled->bitmap.get()); texinfo.base = &scaled->bitmap->pix(0); texinfo.rowpixels = scaled->bitmap->rowpixels(); texinfo.width = dwidth; @@ -3051,11 +3047,11 @@ done: //------------------------------------------------- render_manager::render_manager(running_machine &machine) - : m_machine(machine), - m_ui_target(nullptr), - m_live_textures(0), - m_texture_id(0), - m_ui_container(global_alloc(render_container(*this))) + : m_machine(machine) + , m_ui_target(nullptr) + , m_live_textures(0) + , m_texture_id(0) + , m_ui_container(new render_container(*this)) { // register callbacks machine.configuration().config_register("video", config_load_delegate(&render_manager::config_load, this), config_save_delegate(&render_manager::config_save, this)); @@ -3129,12 +3125,12 @@ float render_manager::max_update_rate() const render_target *render_manager::target_alloc(const internal_layout *layoutfile, u32 flags) { - return &m_targetlist.append(*global_alloc(render_target(*this, layoutfile, flags))); + return &m_targetlist.append(*new render_target(*this, layoutfile, flags)); } render_target *render_manager::target_alloc(util::xml::data_node const &layout, u32 flags) { - return &m_targetlist.append(*global_alloc(render_target(*this, layout, flags))); + return &m_targetlist.append(*new render_target(*this, layout, flags)); } @@ -3251,19 +3247,9 @@ void render_manager::texture_free(render_texture *texture) // font_alloc - allocate a new font instance //------------------------------------------------- -render_font *render_manager::font_alloc(const char *filename) +std::unique_ptr render_manager::font_alloc(const char *filename) { - return global_alloc(render_font(*this, filename)); -} - - -//------------------------------------------------- -// font_free - release a font instance -//------------------------------------------------- - -void render_manager::font_free(render_font *font) -{ - global_free(font); + return std::unique_ptr(new render_font(*this, filename)); } @@ -3301,7 +3287,7 @@ void render_manager::resolve_tags() render_container *render_manager::container_alloc(screen_device *screen) { - auto container = global_alloc(render_container(*this, screen)); + auto container = new render_container(*this, screen); if (screen != nullptr) m_screen_container_list.append(*container); return container; diff --git a/src/emu/render.h b/src/emu/render.h index 1545a3f041d..1a32024045e 100644 --- a/src/emu/render.h +++ b/src/emu/render.h @@ -411,8 +411,8 @@ private: // a scaled_texture contains a single scaled entry for a texture struct scaled_texture { - bitmap_argb32 * bitmap; // final bitmap - u32 seqid; // sequence number + std::unique_ptr bitmap; // final bitmap + u32 seqid; // sequence number }; // internal state @@ -1192,8 +1192,7 @@ public: void texture_free(render_texture *texture); // fonts - render_font *font_alloc(const char *filename = nullptr); - void font_free(render_font *font); + std::unique_ptr font_alloc(const char *filename = nullptr); // reference tracking void invalidate_all(void *refptr); diff --git a/src/emu/rendfont.h b/src/emu/rendfont.h index aa04a094d75..fc0c4853733 100644 --- a/src/emu/rendfont.h +++ b/src/emu/rendfont.h @@ -27,9 +27,10 @@ class render_font // construction/destruction render_font(render_manager &manager, const char *filename); - virtual ~render_font(); public: + virtual ~render_font(); + // getters render_manager &manager() const { return m_manager; } diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp index de64a98bf30..5f3fb42b1a8 100644 --- a/src/emu/rendlay.cpp +++ b/src/emu/rendlay.cpp @@ -1587,9 +1587,8 @@ protected: // overrides virtual void draw(running_machine &machine, bitmap_argb32 &dest, const rectangle &bounds, int state) override { - render_font *font = machine.render().font_alloc("default"); + auto font = machine.render().font_alloc("default"); draw_text(*font, dest, bounds, m_string.c_str(), m_textalign, color(state)); - machine.render().font_free(font); } private: @@ -2278,9 +2277,8 @@ protected: virtual void draw(running_machine &machine, bitmap_argb32 &dest, const rectangle &bounds, int state) override { - render_font *const font = machine.render().font_alloc("default"); + auto font = machine.render().font_alloc("default"); draw_text(*font, dest, bounds, string_format("%0*d", m_digits, state).c_str(), m_textalign, color(state)); - machine.render().font_free(font); } private: @@ -2375,7 +2373,7 @@ protected: u32 const a = c.a * 255.0f; // get the width of the string - render_font *font = machine.render().font_alloc("default"); + auto font = machine.render().font_alloc("default"); float aspect = 1.0f; s32 width; @@ -2517,7 +2515,6 @@ protected: } // free the temporary bitmap and font - machine.render().font_free(font); } private: @@ -2537,7 +2534,7 @@ private: u32 const a = c.a * 255.0f; // get the width of the string - render_font *font = machine.render().font_alloc("default"); + auto font = machine.render().font_alloc("default"); float aspect = 1.0f; s32 width; int currx = 0; @@ -2678,7 +2675,6 @@ private: } // free the temporary bitmap and font - machine.render().font_free(font); } void load_reel_bitmap(int number) diff --git a/src/emu/tilemap.cpp b/src/emu/tilemap.cpp index 4252b9259a2..5757f35341f 100644 --- a/src/emu/tilemap.cpp +++ b/src/emu/tilemap.cpp @@ -1611,14 +1611,14 @@ tilemap_manager::~tilemap_manager() tilemap_t &tilemap_manager::create(device_gfx_interface &decoder, tilemap_get_info_delegate tile_get_info, tilemap_mapper_delegate mapper, u16 tilewidth, u16 tileheight, u32 cols, u32 rows, tilemap_t *allocated) { if (!allocated) - allocated = global_alloc(tilemap_t)(machine().root_device()); + allocated = new tilemap_t(machine().root_device()); return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, mapper, tilewidth, tileheight, cols, rows)); } tilemap_t &tilemap_manager::create(device_gfx_interface &decoder, tilemap_get_info_delegate tile_get_info, tilemap_standard_mapper mapper, u16 tilewidth, u16 tileheight, u32 cols, u32 rows, tilemap_t *allocated) { if (!allocated) - allocated = global_alloc(tilemap_t)(machine().root_device()); + allocated = new tilemap_t(machine().root_device()); return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, mapper, tilewidth, tileheight, cols, rows)); } diff --git a/src/frontend/mame/clifront.cpp b/src/frontend/mame/clifront.cpp index 4785b718d68..978227bade0 100644 --- a/src/frontend/mame/clifront.cpp +++ b/src/frontend/mame/clifront.cpp @@ -343,7 +343,7 @@ int cli_frontend::execute(std::vector &args) } util::archive_file::cache_clear(); - global_free(manager); + delete manager; return m_result; } diff --git a/src/frontend/mame/mame.cpp b/src/frontend/mame/mame.cpp index 908da0e2bf6..b996bae1dc0 100644 --- a/src/frontend/mame/mame.cpp +++ b/src/frontend/mame/mame.cpp @@ -10,38 +10,44 @@ #include "emu.h" #include "mame.h" -#include "emuopts.h" -#include "mameopts.h" -#include "pluginopts.h" -#include "osdepend.h" -#include "validity.h" -#include "clifront.h" -#include "luaengine.h" -#include -#include "ui/ui.h" + +#include "ui/inifile.h" #include "ui/selgame.h" #include "ui/simpleselgame.h" +#include "ui/ui.h" + #include "cheat.h" -#include "ui/inifile.h" +#include "clifront.h" +#include "emuopts.h" +#include "luaengine.h" +#include "mameopts.h" +#include "pluginopts.h" +#include "validity.h" + #include "xmlfile.h" +#include "osdepend.h" + +#include + + //************************************************************************** // MACHINE MANAGER //************************************************************************** -mame_machine_manager* mame_machine_manager::m_manager = nullptr; +mame_machine_manager *mame_machine_manager::s_manager = nullptr; mame_machine_manager* mame_machine_manager::instance(emu_options &options, osd_interface &osd) { - if (!m_manager) - m_manager = global_alloc(mame_machine_manager(options, osd)); + if (!s_manager) + s_manager = new mame_machine_manager(options, osd); - return m_manager; + return s_manager; } mame_machine_manager* mame_machine_manager::instance() { - return m_manager; + return s_manager; } //------------------------------------------------- @@ -51,7 +57,7 @@ mame_machine_manager* mame_machine_manager::instance() mame_machine_manager::mame_machine_manager(emu_options &options,osd_interface &osd) : machine_manager(options, osd), m_plugins(std::make_unique()), - m_lua(global_alloc(lua_engine)), + m_lua(std::make_unique()), m_new_driver_pending(nullptr), m_firstrun(true), m_autoboot_timer(nullptr) @@ -65,8 +71,8 @@ mame_machine_manager::mame_machine_manager(emu_options &options,osd_interface &o mame_machine_manager::~mame_machine_manager() { - global_free(m_lua); - m_manager = nullptr; + m_lua.reset(); + s_manager = nullptr; } diff --git a/src/frontend/mame/mame.h b/src/frontend/mame/mame.h index 041612de758..037d714b39c 100644 --- a/src/frontend/mame/mame.h +++ b/src/frontend/mame/mame.h @@ -35,7 +35,7 @@ public: ~mame_machine_manager(); plugin_options &plugins() const { return *m_plugins; } - lua_engine *lua() { return m_lua; } + lua_engine *lua() { return m_lua.get(); } virtual void update_machine() override; @@ -72,12 +72,12 @@ private: mame_machine_manager &operator=(mame_machine_manager &&) = delete; std::unique_ptr m_plugins; // pointer to plugin options - lua_engine * m_lua; + std::unique_ptr m_lua; const game_driver * m_new_driver_pending; // pointer to the next pending driver bool m_firstrun; - static mame_machine_manager* m_manager; + static mame_machine_manager *s_manager; emu_timer *m_autoboot_timer; // autoboot timer std::unique_ptr m_ui; // internal data from ui.cpp std::unique_ptr m_cheat; // internal data from cheat.cpp diff --git a/src/frontend/mame/ui/menu.cpp b/src/frontend/mame/ui/menu.cpp index 7ce0beb0fb1..b1bcbb908b7 100644 --- a/src/frontend/mame/ui/menu.cpp +++ b/src/frontend/mame/ui/menu.cpp @@ -1234,7 +1234,7 @@ uint32_t menu::ui_handler(render_container &container, mame_ui_manager &mui) // if we have no menus stacked up, start with the main menu if (!state->topmost_menu()) - state->stack_push(std::unique_ptr(global_alloc_clear(mui, container))); + state->stack_push(std::unique_ptr(make_unique_clear(mui, container))); // update the menu state if (state->topmost_menu()) diff --git a/src/frontend/mame/ui/menu.h b/src/frontend/mame/ui/menu.h index 800b0b6ca7b..5a7d4374bf6 100644 --- a/src/frontend/mame/ui/menu.h +++ b/src/frontend/mame/ui/menu.h @@ -100,12 +100,12 @@ public: template static void stack_push(Params &&... args) { - stack_push(std::unique_ptr(global_alloc_clear(std::forward(args)...))); + stack_push(std::unique_ptr(make_unique_clear(std::forward(args)...))); } template static void stack_push_special_main(Params &&... args) { - std::unique_ptr ptr(global_alloc_clear(std::forward(args)...)); + std::unique_ptr ptr(make_unique_clear(std::forward(args)...)); ptr->set_special_main_menu(true); stack_push(std::move(ptr)); } diff --git a/src/frontend/mame/ui/text.cpp b/src/frontend/mame/ui/text.cpp index 6df9ff29049..0e61b1710db 100644 --- a/src/frontend/mame/ui/text.cpp +++ b/src/frontend/mame/ui/text.cpp @@ -295,7 +295,7 @@ float text_layout::actual_height() const void text_layout::start_new_line(text_layout::text_justify justify, float height) { // create a new line - std::unique_ptr new_line(global_alloc_clear(*this, justify, actual_height(), height * yscale())); + std::unique_ptr new_line(std::make_unique(*this, justify, actual_height(), height * yscale())); // update the current line m_current_line = new_line.get(); @@ -303,7 +303,7 @@ void text_layout::start_new_line(text_layout::text_justify justify, float height m_truncating = false; // append it - m_lines.push_back(std::move(new_line)); + m_lines.emplace_back(std::move(new_line)); } diff --git a/src/frontend/mame/ui/text.h b/src/frontend/mame/ui/text.h index c5755c39813..fdf000c850a 100644 --- a/src/frontend/mame/ui/text.h +++ b/src/frontend/mame/ui/text.h @@ -7,16 +7,17 @@ Text functionality for MAME's crude user interface ***************************************************************************/ +#ifndef MAME_FRONTEND_UI_TEXT_H +#define MAME_FRONTEND_UI_TEXT_H #pragma once -#ifndef MAME_FRONTEND_UI_TEXT_H -#define MAME_FRONTEND_UI_TEXT_H class render_font; class render_container; namespace ui { + /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp index 6e4ed7f3552..d65cf9c581b 100644 --- a/src/frontend/mame/ui/ui.cpp +++ b/src/frontend/mame/ui/ui.cpp @@ -164,7 +164,7 @@ static uint32_t const mouse_bitmap[32*32] = mame_ui_manager::mame_ui_manager(running_machine &machine) : ui_manager(machine) - , m_font(nullptr) + , m_font() , m_handler_callback(nullptr) , m_handler_callback_type(ui_callback_type::GENERAL) , m_handler_param(0) @@ -244,11 +244,7 @@ void mame_ui_manager::exit() m_mouse_arrow_texture = nullptr; // free the font - if (m_font != nullptr) - { - machine().render().font_free(m_font); - m_font = nullptr; - } + m_font.reset(); } @@ -640,9 +636,9 @@ void mame_ui_manager::update_and_render(render_container &container) render_font *mame_ui_manager::get_font() { // allocate the font and messagebox string - if (m_font == nullptr) + if (!m_font) m_font = machine().render().font_alloc(machine().options().ui_font()); - return m_font; + return m_font.get(); } diff --git a/src/frontend/mame/ui/ui.h b/src/frontend/mame/ui/ui.h index 8c0504464d3..af9ad03efcc 100644 --- a/src/frontend/mame/ui/ui.h +++ b/src/frontend/mame/ui/ui.h @@ -271,7 +271,7 @@ private: using device_feature_set = std::set >; // instance variables - render_font * m_font; + std::unique_ptr m_font; handler_callback_func m_handler_callback; ui_callback_type m_handler_callback_type; uint32_t m_handler_param; diff --git a/src/lib/formats/imd_dsk.cpp b/src/lib/formats/imd_dsk.cpp index 0489bf28b5e..631eac9b297 100644 --- a/src/lib/formats/imd_dsk.cpp +++ b/src/lib/formats/imd_dsk.cpp @@ -158,18 +158,18 @@ static floperr_t imd_expand_file(floppy_image_legacy *floppy , uint64_t offset , return FLOPPY_ERROR_SUCCESS; } - auto buffer = global_alloc_array(uint8_t , size_after_off); + auto buffer = std::make_unique(size_after_off); // Read the part of file after offset - floppy_image_read(floppy , buffer , offset , size_after_off); + floppy_image_read(floppy, buffer.get(), offset, size_after_off); // Add zeroes - floppy_image_write_filler(floppy , 0 , offset , amount); + floppy_image_write_filler(floppy, 0, offset, amount); // Write back the part of file after offset - floppy_image_write(floppy, buffer, offset + amount, size_after_off); + floppy_image_write(floppy, buffer.get(), offset + amount, size_after_off); - global_free_array(buffer); + buffer.reset(); // Update track offsets struct imddsk_tag *tag = get_tag(floppy); @@ -528,7 +528,7 @@ bool imd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) sects[i].bad_crc = stype == 5 || stype == 6 || stype == 7 || stype == 8; if(stype == 2 || stype == 4 || stype == 6 || stype == 8) { - sects[i].data = global_alloc_array(uint8_t, actual_size); + sects[i].data = new uint8_t [actual_size]; memset(sects[i].data, img[pos++], actual_size); } else { sects[i].data = &img[pos]; @@ -547,7 +547,7 @@ bool imd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) for(int i=0; i< m_sector_count.back(); i++) if(sects[i].data && (sects[i].data < &img[0] || sects[i].data >= (&img[0] + size))) - global_free_array(sects[i].data); + delete [] sects[i].data; } return true; diff --git a/src/lib/formats/ipf_dsk.cpp b/src/lib/formats/ipf_dsk.cpp index ed6505fd385..fc81ffe66ce 100644 --- a/src/lib/formats/ipf_dsk.cpp +++ b/src/lib/formats/ipf_dsk.cpp @@ -1,12 +1,27 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#include #include "ipf_dsk.h" +#include + + const floppy_format_type FLOPPY_IPF_FORMAT = &floppy_image_format_creator; -ipf_format::ipf_format(): tinfos(nullptr), tcount(0), type(0), release(0), revision(0), encoder_type(0), -encoder_revision(0), origin(0), min_cylinder(0), max_cylinder(0), min_head(0), max_head(0), credit_day(0), credit_time(0) +ipf_format::ipf_format() : + tinfos(), + tcount(0), + type(0), + release(0), + revision(0), + encoder_type(0), + encoder_revision(0), + origin(0), + min_cylinder(0), + max_cylinder(0), + min_head(0), + max_head(0), + credit_day(0), + credit_time(0) { } @@ -84,12 +99,11 @@ bool ipf_format::parse(std::vector &data, floppy_image *image) { image->set_variant(floppy_image::DSDD); // Not handling anything else yet tcount = 84*2+1; // Usual max - tinfos = global_alloc_array_clear(tcount); + tinfos.resize(tcount); bool res = scan_all_tags(data); if(res) res = generate_tracks(image); - global_free_array(tinfos); - tinfos = nullptr; + tinfos.clear(); return res; } @@ -121,14 +135,11 @@ ipf_format::track_info *ipf_format::get_index(uint32_t idx) if(idx > 1000) return nullptr; if(idx >= tcount) { - auto ti1 = global_alloc_array_clear(idx+1); - memcpy(ti1, tinfos, tcount*sizeof(tinfos)); - global_free_array(tinfos); + tinfos.resize(idx+1); tcount = idx+1; - tinfos = ti1; } - return tinfos+idx; + return &tinfos[idx]; } bool ipf_format::parse_imge(const uint8_t *imge) @@ -246,7 +257,7 @@ bool ipf_format::scan_all_tags(std::vector &data) bool ipf_format::generate_tracks(floppy_image *image) { for(uint32_t i = 0; i != tcount; i++) { - track_info *t = tinfos + i; + track_info *t = &tinfos[i]; if(t->info_set && t->data) { if(!generate_track(t, image)) return false; diff --git a/src/lib/formats/ipf_dsk.h b/src/lib/formats/ipf_dsk.h index 7db2415afd4..e026cab2c4c 100644 --- a/src/lib/formats/ipf_dsk.h +++ b/src/lib/formats/ipf_dsk.h @@ -24,22 +24,22 @@ public: private: struct track_info { - uint32_t cylinder, head, type; - uint32_t sigtype, process, reserved[3]; - uint32_t size_bytes, size_cells; - uint32_t index_bytes, index_cells; - uint32_t datasize_cells, gapsize_cells; - uint32_t block_count, weak_bits; + uint32_t cylinder = 0, head = 0, type = 0; + uint32_t sigtype = 0, process = 0, reserved[3] = { 0, 0, 0 }; + uint32_t size_bytes = 0, size_cells = 0; + uint32_t index_bytes = 0, index_cells = 0; + uint32_t datasize_cells = 0, gapsize_cells = 0; + uint32_t block_count = 0, weak_bits = 0; - uint32_t data_size_bits; + uint32_t data_size_bits = 0; - bool info_set; + bool info_set = false; - const uint8_t *data; - uint32_t data_size; + const uint8_t *data = nullptr; + uint32_t data_size = 0; }; - track_info *tinfos; + std::vector tinfos; uint32_t tcount; uint32_t type, release, revision; diff --git a/src/lib/formats/mfi_dsk.cpp b/src/lib/formats/mfi_dsk.cpp index 0f118ce620f..eb86d8d80da 100644 --- a/src/lib/formats/mfi_dsk.cpp +++ b/src/lib/formats/mfi_dsk.cpp @@ -187,8 +187,8 @@ bool mfi_format::save(io_generic *io, floppy_image *image) int pos = sizeof(header) + (tracks << resolution)*heads*sizeof(entry); int epos = 0; - auto precomp = global_alloc_array(uint32_t, max_track_size); - auto postcomp = global_alloc_array(uint8_t, max_track_size*4 + 1000); + auto precomp = std::make_unique(max_track_size); + auto postcomp = std::make_unique(max_track_size*4 + 1000); for(int track=0; track <= (tracks-1) << 2; track += 4 >> resolution) for(int head=0; headget_write_splice_position(track >> 2, head, track & 3); epos++; - io_generic_write(io, postcomp, pos, csize); + io_generic_write(io, postcomp.get(), pos, csize); pos += csize; } io_generic_write(io, entries, sizeof(header), (tracks << resolution)*heads*sizeof(entry)); - global_free_array(precomp); - global_free_array(postcomp); return true; } diff --git a/src/lib/util/corealloc.h b/src/lib/util/corealloc.h index 5d1f055e19b..db8aacf6cb2 100644 --- a/src/lib/util/corealloc.h +++ b/src/lib/util/corealloc.h @@ -8,54 +8,24 @@ ***************************************************************************/ -#pragma once - #ifndef MAME_LIB_UTIL_COREALLOC_H #define MAME_LIB_UTIL_COREALLOC_H +#pragma once + #include "osdcore.h" -#include - #include +#include #include -#include #include +#include #include #include -//************************************************************************** -// MACROS -//************************************************************************** - -// global allocation helpers -- use these instead of new and delete -#define global_alloc(Type) new Type -#define global_alloc_array(Type, Num) new Type[Num] -#define global_free(Ptr) do { delete Ptr; } while (0) -#define global_free_array(Ptr) do { delete[] Ptr; } while (0) - - - -template -inline T* global_alloc_clear(Params &&... args) -{ - void *const ptr = ::operator new(sizeof(T)); // allocate memory - std::memset(ptr, 0, sizeof(T)); - return new(ptr) T(std::forward(args)...); -} - -template -inline T* global_alloc_array_clear(std::size_t num) -{ - auto const size = sizeof(T) * num; - void *const ptr = new unsigned char[size]; // allocate memory - std::memset(ptr, 0, size); - return new(ptr) T[num](); -} - - +// global allocation helpers template struct MakeUniqClearT { typedef std::unique_ptr single_object; }; diff --git a/src/lib/util/coretmpl.h b/src/lib/util/coretmpl.h index 95d8230f565..a06c4fb8a46 100644 --- a/src/lib/util/coretmpl.h +++ b/src/lib/util/coretmpl.h @@ -202,7 +202,7 @@ public: if (m_tail == &toreplace) m_tail = &object; object.m_next = toreplace.m_next; - global_free(&toreplace); + delete &toreplace; return object; } return append(object); @@ -253,7 +253,7 @@ public: // remove the given object and free its memory void remove(ElementType &object) noexcept { - global_free(&detach(object)); + delete &detach(object); } // find an object by index in the list @@ -305,7 +305,7 @@ public: { ItemType *result = m_freelist.detach_head(); if (result == nullptr) - result = global_alloc(ItemType); + result = new ItemType; return result; } diff --git a/src/mame/includes/apollo.h b/src/mame/includes/apollo.h index a645dc31a72..367a926baa5 100644 --- a/src/mame/includes/apollo.h +++ b/src/mame/includes/apollo.h @@ -438,7 +438,7 @@ public: protected: required_device m_screen; - apollo_graphics_15i(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, device_type type); + apollo_graphics_15i(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); // device-level overrides virtual void device_start() override; @@ -544,8 +544,8 @@ protected: uint32_t m_color_lookup_table[16]; - lut_fifo *m_lut_fifo; - bt458 *m_bt458; + std::unique_ptr m_lut_fifo; + std::unique_ptr m_bt458; }; diff --git a/src/mame/machine/psxcd.cpp b/src/mame/machine/psxcd.cpp index b7271d751b0..ddbcf2e267b 100644 --- a/src/mame/machine/psxcd.cpp +++ b/src/mame/machine/psxcd.cpp @@ -146,12 +146,12 @@ void psxcd_device::device_stop() for (int i = 0; i < MAX_PSXCD_TIMERS; i++) { if(m_timerinuse[i] && m_timers[i]->ptr()) - global_free((command_result *)m_timers[i]->ptr()); + delete (command_result *)m_timers[i]->ptr(); } while(res_queue) { command_result *res = res_queue->next; - global_free(res_queue); + delete res_queue; res_queue = res; } } @@ -164,7 +164,7 @@ void psxcd_device::device_reset() for (int i = 0; i < MAX_PSXCD_TIMERS; i++) { if(m_timerinuse[i] && m_timers[i]->ptr()) - global_free((command_result *)m_timers[i]->ptr()); + delete (command_result *)m_timers[i]->ptr(); m_timers[i]->adjust(attotime::never, 0, attotime::never); m_timerinuse[i] = false; } @@ -175,7 +175,7 @@ void psxcd_device::device_reset() while(res_queue) { command_result *res = res_queue->next; - global_free(res_queue); + delete res_queue; res_queue = res; } @@ -363,7 +363,7 @@ void psxcd_device::write(offs_t offset, uint8_t data) m_int1 = nullptr; res_queue = res->next; - global_free(res); + delete res; m_regs.sr &= ~0x20; rdp = 0; if(res_queue) @@ -867,7 +867,7 @@ void psxcd_device::cmd_complete(command_result *res) psxcd_device::command_result *psxcd_device::prepare_result(uint8_t res, uint8_t *data, int sz, uint8_t errcode) { - auto cr=global_alloc(command_result); + auto cr=new command_result; cr->res=res; if (sz) @@ -1072,7 +1072,7 @@ void psxcd_device::play_sector() if ((mode&mode_report) && !(sector & 15)) // slow the int rate { - auto res=global_alloc(command_result); + auto res=new command_result; uint8_t track = cdrom_get_track(m_cdrom_handle, sector) + 1; res->res=intr_dataready; diff --git a/src/mame/video/apollo.cpp b/src/mame/video/apollo.cpp index 84183400c2a..a1b4c667fbf 100644 --- a/src/mame/video/apollo.cpp +++ b/src/mame/video/apollo.cpp @@ -1725,25 +1725,18 @@ void apollo_graphics_15i::device_add_mconfig(machine_config &config) DEFINE_DEVICE_TYPE(APOLLO_GRAPHICS, apollo_graphics_15i, "apollo_graphics_15i", "Apollo Screen") apollo_graphics_15i::apollo_graphics_15i(const machine_config &mconfig,const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, APOLLO_GRAPHICS, tag, owner, clock), - m_screen(*this, VIDEO_SCREEN_TAG), - m_lut_fifo(nullptr), - m_bt458(nullptr) + apollo_graphics_15i(mconfig, APOLLO_GRAPHICS, tag, owner, clock) { } -apollo_graphics_15i::apollo_graphics_15i(const machine_config &mconfig,const char *tag, device_t *owner, uint32_t clock, device_type type) : +apollo_graphics_15i::apollo_graphics_15i(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock), - m_screen(*this, VIDEO_SCREEN_TAG), - m_lut_fifo(nullptr), - m_bt458(nullptr) + m_screen(*this, VIDEO_SCREEN_TAG) { } apollo_graphics_15i::~apollo_graphics_15i() { - if (m_lut_fifo) global_free(m_lut_fifo); - if (m_bt458) global_free(m_bt458); } //------------------------------------------------- @@ -1798,8 +1791,8 @@ void apollo_graphics_15i::device_start() memset(m_color_lookup_table, 0, sizeof(m_color_lookup_table)); - m_lut_fifo = nullptr; - m_bt458 = nullptr; + m_lut_fifo.reset(); + m_bt458.reset(); } //------------------------------------------------- @@ -1852,12 +1845,9 @@ void apollo_graphics_15i::device_reset() m_buffer_width = 1024; m_buffer_height = 1024; - if (m_lut_fifo) global_free(m_lut_fifo); - if (m_bt458) global_free(m_bt458); + m_lut_fifo = std::make_unique(); - m_lut_fifo = global_alloc(lut_fifo); - - m_bt458 = global_alloc(bt458(machine())); + m_bt458 = std::make_unique(machine()); m_bt458->start(); m_bt458->reset(); } @@ -1899,7 +1889,7 @@ void apollo_graphics_19i::device_add_mconfig(machine_config &config) DEFINE_DEVICE_TYPE(APOLLO_MONO19I, apollo_graphics_19i, "apollo_graphics_19i", "Apollo 19\" Monochrome Screen") apollo_graphics_19i::apollo_graphics_19i(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - apollo_graphics_15i(mconfig, tag, owner, clock, APOLLO_MONO19I) + apollo_graphics_15i(mconfig, APOLLO_MONO19I, tag, owner, clock) { } diff --git a/src/osd/modules/debugger/debugimgui.cpp b/src/osd/modules/debugger/debugimgui.cpp index 296b148c5db..da3e58d4bcf 100644 --- a/src/osd/modules/debugger/debugimgui.cpp +++ b/src/osd/modules/debugger/debugimgui.cpp @@ -225,11 +225,7 @@ static void view_list_remove(debug_area* item) static debug_area *dview_alloc(running_machine &machine, debug_view_type type) { - debug_area *dv; - - dv = global_alloc(debug_area(machine, type)); - - return dv; + return new debug_area(machine, type); } static inline void map_attr_to_fg_bg(unsigned char attr, rgb_t *fg, rgb_t *bg) @@ -1406,7 +1402,7 @@ void debug_imgui::update() if(to_delete != nullptr) { view_list_remove(to_delete); - global_free(to_delete); + delete to_delete; } ImGui::PopStyleColor(12); diff --git a/src/osd/modules/debugger/win/consolewininfo.cpp b/src/osd/modules/debugger/win/consolewininfo.cpp index e6ad4c0986f..5589a48018a 100644 --- a/src/osd/modules/debugger/win/consolewininfo.cpp +++ b/src/osd/modules/debugger/win/consolewininfo.cpp @@ -30,10 +30,10 @@ consolewin_info::consolewin_info(debugger_windows_interface &debugger) : goto cleanup; // create the views - m_views[1].reset(global_alloc(debugview_info(debugger, *this, window(), DVT_STATE))); + m_views[1].reset(new debugview_info(debugger, *this, window(), DVT_STATE)); if (!m_views[1]->is_valid()) goto cleanup; - m_views[2].reset(global_alloc(debugview_info(debugger, *this, window(), DVT_CONSOLE))); + m_views[2].reset(new debugview_info(debugger, *this, window(), DVT_CONSOLE)); if (!m_views[2]->is_valid()) goto cleanup; diff --git a/src/osd/modules/debugger/win/disasmbasewininfo.cpp b/src/osd/modules/debugger/win/disasmbasewininfo.cpp index 800443b47c1..f68a7652c77 100644 --- a/src/osd/modules/debugger/win/disasmbasewininfo.cpp +++ b/src/osd/modules/debugger/win/disasmbasewininfo.cpp @@ -26,7 +26,7 @@ disasmbasewin_info::disasmbasewin_info(debugger_windows_interface &debugger, boo if (!window()) return; - m_views[0].reset(global_alloc(disasmview_info(debugger, *this, window()))); + m_views[0].reset(new disasmview_info(debugger, *this, window())); if ((m_views[0] == nullptr) || !m_views[0]->is_valid()) { m_views[0].reset(); diff --git a/src/osd/modules/debugger/win/logwininfo.cpp b/src/osd/modules/debugger/win/logwininfo.cpp index 6d2cd59b554..88b6022aa9a 100644 --- a/src/osd/modules/debugger/win/logwininfo.cpp +++ b/src/osd/modules/debugger/win/logwininfo.cpp @@ -19,7 +19,7 @@ logwin_info::logwin_info(debugger_windows_interface &debugger) : if (!window()) return; - m_views[0].reset(global_alloc(logview_info(debugger, *this, window()))); + m_views[0].reset(new logview_info(debugger, *this, window())); if ((m_views[0] == nullptr) || !m_views[0]->is_valid()) { m_views[0].reset(); diff --git a/src/osd/modules/debugger/win/memorywininfo.cpp b/src/osd/modules/debugger/win/memorywininfo.cpp index 93151cc018d..18f28252f12 100644 --- a/src/osd/modules/debugger/win/memorywininfo.cpp +++ b/src/osd/modules/debugger/win/memorywininfo.cpp @@ -23,7 +23,7 @@ memorywin_info::memorywin_info(debugger_windows_interface &debugger) : if (!window()) return; - m_views[0].reset(global_alloc(memoryview_info(debugger, *this, window()))); + m_views[0].reset(new memoryview_info(debugger, *this, window())); if ((m_views[0] == nullptr) || !m_views[0]->is_valid()) { m_views[0].reset(); diff --git a/src/osd/modules/debugger/win/pointswininfo.cpp b/src/osd/modules/debugger/win/pointswininfo.cpp index 24a8f865e6f..eb2ca1875e2 100644 --- a/src/osd/modules/debugger/win/pointswininfo.cpp +++ b/src/osd/modules/debugger/win/pointswininfo.cpp @@ -20,7 +20,7 @@ pointswin_info::pointswin_info(debugger_windows_interface &debugger) : if (!window()) return; - m_views[0].reset(global_alloc(debugview_info(debugger, *this, window(), DVT_BREAK_POINTS))); + m_views[0].reset(new debugview_info(debugger, *this, window(), DVT_BREAK_POINTS)); if ((m_views[0] == nullptr) || !m_views[0]->is_valid()) { m_views[0].reset(); @@ -96,7 +96,7 @@ bool pointswin_info::handle_command(WPARAM wparam, LPARAM lparam) { case ID_SHOW_BREAKPOINTS: m_views[0].reset(); - m_views[0].reset(global_alloc(debugview_info(debugger(), *this, window(), DVT_BREAK_POINTS))); + m_views[0].reset(new debugview_info(debugger(), *this, window(), DVT_BREAK_POINTS)); if (!m_views[0]->is_valid()) m_views[0].reset(); win_set_window_text_utf8(window(), "All Breakpoints"); @@ -105,7 +105,7 @@ bool pointswin_info::handle_command(WPARAM wparam, LPARAM lparam) case ID_SHOW_WATCHPOINTS: m_views[0].reset(); - m_views[0].reset(global_alloc(debugview_info(debugger(), *this, window(), DVT_WATCH_POINTS))); + m_views[0].reset(new debugview_info(debugger(), *this, window(), DVT_WATCH_POINTS)); if (!m_views[0]->is_valid()) m_views[0].reset(); win_set_window_text_utf8(window(), "All Watchpoints"); diff --git a/src/osd/modules/lib/osdobj_common.cpp b/src/osd/modules/lib/osdobj_common.cpp index 25d4b979e87..a04952bcdbc 100644 --- a/src/osd/modules/lib/osdobj_common.cpp +++ b/src/osd/modules/lib/osdobj_common.cpp @@ -290,42 +290,42 @@ void osd_common_t::register_options() int num; std::vector dnames; - m_mod_man.get_module_names(OSD_MONITOR_PROVIDER, 20, &num, names); + m_mod_man.get_module_names(OSD_MONITOR_PROVIDER, 20, num, names); for (int i = 0; i < num; i++) dnames.push_back(names[i]); update_option(OSD_MONITOR_PROVIDER, dnames); - m_mod_man.get_module_names(OSD_FONT_PROVIDER, 20, &num, names); + m_mod_man.get_module_names(OSD_FONT_PROVIDER, 20, num, names); dnames.clear(); for (int i = 0; i < num; i++) dnames.push_back(names[i]); update_option(OSD_FONT_PROVIDER, dnames); - m_mod_man.get_module_names(OSD_KEYBOARDINPUT_PROVIDER, 20, &num, names); + m_mod_man.get_module_names(OSD_KEYBOARDINPUT_PROVIDER, 20, num, names); dnames.clear(); for (int i = 0; i < num; i++) dnames.push_back(names[i]); update_option(OSD_KEYBOARDINPUT_PROVIDER, dnames); - m_mod_man.get_module_names(OSD_MOUSEINPUT_PROVIDER, 20, &num, names); + m_mod_man.get_module_names(OSD_MOUSEINPUT_PROVIDER, 20, num, names); dnames.clear(); for (int i = 0; i < num; i++) dnames.push_back(names[i]); update_option(OSD_MOUSEINPUT_PROVIDER, dnames); - m_mod_man.get_module_names(OSD_LIGHTGUNINPUT_PROVIDER, 20, &num, names); + m_mod_man.get_module_names(OSD_LIGHTGUNINPUT_PROVIDER, 20, num, names); dnames.clear(); for (int i = 0; i < num; i++) dnames.push_back(names[i]); update_option(OSD_LIGHTGUNINPUT_PROVIDER, dnames); - m_mod_man.get_module_names(OSD_JOYSTICKINPUT_PROVIDER, 20, &num, names); + m_mod_man.get_module_names(OSD_JOYSTICKINPUT_PROVIDER, 20, num, names); dnames.clear(); for (int i = 0; i < num; i++) dnames.push_back(names[i]); update_option(OSD_JOYSTICKINPUT_PROVIDER, dnames); - m_mod_man.get_module_names(OSD_SOUND_PROVIDER, 20, &num, names); + m_mod_man.get_module_names(OSD_SOUND_PROVIDER, 20, num, names); dnames.clear(); for (int i = 0; i < num; i++) dnames.push_back(names[i]); @@ -333,7 +333,7 @@ void osd_common_t::register_options() #if 0 // Register midi options and update options - m_mod_man.get_module_names(OSD_MIDI_PROVIDER, 20, &num, names); + m_mod_man.get_module_names(OSD_MIDI_PROVIDER, 20, num, names); dnames.clear(); for (int i = 0; i < num; i++) dnames.push_back(names[i]); @@ -341,13 +341,13 @@ void osd_common_t::register_options() #endif // Register debugger options and update options - m_mod_man.get_module_names(OSD_DEBUG_PROVIDER, 20, &num, names); + m_mod_man.get_module_names(OSD_DEBUG_PROVIDER, 20, num, names); dnames.clear(); for (int i = 0; i < num; i++) dnames.push_back(names[i]); update_option(OSD_DEBUG_PROVIDER, dnames); - m_mod_man.get_module_names(OSD_OUTPUT_PROVIDER, 20, &num, names); + m_mod_man.get_module_names(OSD_OUTPUT_PROVIDER, 20, num, names); dnames.clear(); for (int i = 0; i < num; i++) dnames.push_back(names[i]); diff --git a/src/osd/modules/lib/osdobj_common.h b/src/osd/modules/lib/osdobj_common.h index 9fb1b1eef6b..2df6a91b827 100644 --- a/src/osd/modules/lib/osdobj_common.h +++ b/src/osd/modules/lib/osdobj_common.h @@ -216,7 +216,7 @@ public: virtual osd_font::ptr font_alloc() override { return m_font_module->font_alloc(); } virtual bool get_font_families(std::string const &font_path, std::vector > &result) override { return m_font_module->get_font_families(font_path, result); } - virtual osd_midi_device *create_midi_device() override { return m_midi->create_midi_device(); } + virtual std::unique_ptr create_midi_device() override { return m_midi->create_midi_device(); } // FIXME: everything below seems to be osd specific and not part of // this INTERFACE but part of the osd IMPLEMENTATION @@ -311,10 +311,10 @@ private: // this template function creates a stub which constructs a debugger -template +template debug_module *osd_debugger_creator() { - return global_alloc(_DeviceClass()); + return new DeviceClass(); } #endif // MAME_OSD_LIB_OSDOBJ_COMMON_H diff --git a/src/osd/modules/midi/midi_module.h b/src/osd/modules/midi/midi_module.h index 6c50cdd3edc..8e64800622e 100644 --- a/src/osd/modules/midi/midi_module.h +++ b/src/osd/modules/midi/midi_module.h @@ -4,13 +4,17 @@ * midi_module.h * */ +#ifndef MAME_OSD_MODULES_MIDI_MIDI_MODULE_H +#define MAME_OSD_MODULES_MIDI_MIDI_MODULE_H -#ifndef MIDI_MODULE_H_ -#define MIDI_MODULE_H_ +#pragma once #include "osdepend.h" #include "modules/osdmodule.h" +#include + + //============================================================ // CONSTANTS //============================================================ @@ -23,10 +27,9 @@ public: virtual ~midi_module() { } // specific routines - virtual osd_midi_device *create_midi_device() = 0; + virtual std::unique_ptr create_midi_device() = 0; // FIXME: should return a list of strings ... - virtual void list_midi_devices(void) = 0; + virtual void list_midi_devices() = 0; }; - -#endif /* MIDI_MODULE_H_ */ +#endif // MAME_OSD_MODULES_MIDI_MIDI_MODULE_H diff --git a/src/osd/modules/midi/none.cpp b/src/osd/modules/midi/none.cpp index 822de79bd08..25f83b45fbe 100644 --- a/src/osd/modules/midi/none.cpp +++ b/src/osd/modules/midi/none.cpp @@ -17,8 +17,7 @@ class none_module : public osd_module, public midi_module { public: - none_module() - : osd_module(OSD_MIDI_PROVIDER, "pm"), midi_module() + none_module() : osd_module(OSD_MIDI_PROVIDER, "pm"), midi_module() { } virtual ~none_module() { } @@ -26,7 +25,7 @@ public: virtual int init(const osd_options &options) override; virtual void exit() override; - virtual osd_midi_device *create_midi_device() override; + virtual std::unique_ptr create_midi_device() override; virtual void list_midi_devices() override; }; @@ -43,9 +42,9 @@ public: virtual void write(uint8_t data) override; }; -osd_midi_device *none_module::create_midi_device() +std::unique_ptr none_module::create_midi_device() { - return global_alloc(osd_midi_device_none()); + return std::make_unique(); } diff --git a/src/osd/modules/midi/portmidi.cpp b/src/osd/modules/midi/portmidi.cpp index 64f71ca6689..9deca98ea2d 100644 --- a/src/osd/modules/midi/portmidi.cpp +++ b/src/osd/modules/midi/portmidi.cpp @@ -29,7 +29,7 @@ public: virtual int init(const osd_options &options)override; virtual void exit()override; - virtual osd_midi_device *create_midi_device() override; + virtual std::unique_ptr create_midi_device() override; virtual void list_midi_devices() override; }; @@ -60,9 +60,9 @@ private: bool rx_sysex; }; -osd_midi_device *pm_module::create_midi_device() +std::unique_ptr pm_module::create_midi_device() { - return global_alloc(osd_midi_device_pm()); + return std::make_unique(); } diff --git a/src/osd/modules/netdev/pcap.cpp b/src/osd/modules/netdev/pcap.cpp index 799cff9ec0e..2ae32df0f3b 100644 --- a/src/osd/modules/netdev/pcap.cpp +++ b/src/osd/modules/netdev/pcap.cpp @@ -250,7 +250,7 @@ netdev_pcap::~netdev_pcap() static CREATE_NETDEV(create_pcap) { - auto *dev = global_alloc(netdev_pcap(ifname, ifdev, rate)); + auto *dev = new netdev_pcap(ifname, ifdev, rate); return dynamic_cast(dev); } diff --git a/src/osd/modules/netdev/taptun.cpp b/src/osd/modules/netdev/taptun.cpp index 1b549f5b3b2..baa45da0d5d 100644 --- a/src/osd/modules/netdev/taptun.cpp +++ b/src/osd/modules/netdev/taptun.cpp @@ -337,7 +337,7 @@ int netdev_tap::recv_dev(uint8_t **buf) static CREATE_NETDEV(create_tap) { - auto *dev = global_alloc(netdev_tap(ifname, ifdev, rate)); + auto *dev = new netdev_tap(ifname, ifdev, rate); return dynamic_cast(dev); } diff --git a/src/osd/modules/osdmodule.cpp b/src/osd/modules/osdmodule.cpp index 75adc5c75bb..fec18ac5335 100644 --- a/src/osd/modules/osdmodule.cpp +++ b/src/osd/modules/osdmodule.cpp @@ -12,36 +12,23 @@ osd_module_manager::osd_module_manager() { - for (int i=0; i module = mod_type(); if (module->probe()) { osd_printf_verbose("===> registered module %s %s\n", module->name(), module->type()); - *slot = module; + m_modules.emplace_back(std::move(module)); } else { osd_printf_verbose("===> not supported %s %s\n", module->name(), module->type()); - global_free(module); } } @@ -54,7 +41,7 @@ osd_module *osd_module_manager::get_module_generic(const char *type, const char { int const i = get_module_index(type, name); if (i >= 0) - return m_modules[i]; + return m_modules[i].get(); else return nullptr; } @@ -64,54 +51,43 @@ osd_module *osd_module_manager::select_module(const char *type, const char *name osd_module *m = get_module_generic(type, name); // FIXME: check if already exists! - int i; - for (i = 0; m_selected[i] != nullptr; i++) - ; - m_selected[i] = m; + if (m) + m_selected.emplace_back(*m); return m; } void osd_module_manager::init(const osd_options &options) { - for (int i = 0; m_selected[i] != nullptr; i++) - { - m_selected[i]->init(options); - } + for (osd_module &m : m_selected) + m.init(options); } void osd_module_manager::exit() { // Find count - int cnt; - for (cnt = 0; m_selected[cnt] != nullptr; cnt++) - ; - for (int i = cnt - 1; i >= 0; i--) + while (!m_selected.empty()) { - m_selected[i]->exit(); - m_selected[i] = nullptr; + m_selected.back().get().exit(); + m_selected.pop_back(); } } int osd_module_manager::get_module_index(const char *type, const char *name) const { - for (int i = 0; m_modules[i] != nullptr; i++) + for (int i = 0; m_modules.size() > i; i++) { - if (strcmp(m_modules[i]->type(), type) == 0 && ((name[0] == 0) || (strcmp(name, m_modules[i]->name())==0))) + if ((m_modules[i]->type() == type) && (!name[0] || (m_modules[i]->name() == name))) return i; } return -1; } -void osd_module_manager::get_module_names(const char *type, const int max, int *num, const char *names[]) const +void osd_module_manager::get_module_names(const char *type, const int max, int &num, const char *names[]) const { - *num = 0; - for (int i = 0; m_modules[i] != nullptr; i++) + num = 0; + for (int i = 0; (m_modules.size() > i) && (max > num); i++) { - if ((strcmp(m_modules[i]->type(), type) == 0) && (*num < max)) - { - names[*num] = m_modules[i]->name(); - *num = *num + 1; - } - + if (m_modules[i]->type() == type) + names[num++] = m_modules[i]->name().c_str(); } } diff --git a/src/osd/modules/osdmodule.h b/src/osd/modules/osdmodule.h index 95178b27f70..cd72ad2c480 100644 --- a/src/osd/modules/osdmodule.h +++ b/src/osd/modules/osdmodule.h @@ -7,62 +7,63 @@ OSD module management *******************************************************************c********/ - -//#pragma once - #ifndef MAME_OSD_MODULES_OSDMODULE_H #define MAME_OSD_MODULES_OSDMODULE_H +#pragma once + #include "osdcore.h" #include "osdepend.h" +#include +#include +#include +#include + + //============================================================ // TYPE DEFINITIONS //============================================================ class osd_options; -class osd_module; // ======================> osd_module class osd_module { public: - - osd_module(const char *type, const char *name) - : m_name(name), m_type(type) - {} virtual ~osd_module() { } - const char * name() const { return m_name.c_str(); } - const char * type() const { return m_type.c_str(); } + std::string const &name() const { return m_name; } + std::string const &type() const { return m_type; } virtual bool probe() { return true; } virtual int init(const osd_options &options) = 0; virtual void exit() { } +protected: + osd_module(const char *type, const char *name) : m_name(name), m_type(type) { } + osd_module(osd_module const &) = delete; + private: - std::string m_name; - std::string m_type; + std::string const m_name; + std::string const m_type; }; // a module_type is simply a pointer to its alloc function -typedef osd_module *(*module_type)(); +typedef std::unique_ptr (*module_type)(); // this template function creates a stub which constructs a module -template -osd_module *module_creator() +template +std::unique_ptr module_creator() { - return global_alloc(ModuleClass()); + return std::unique_ptr(new ModuleClass); } class osd_module_manager { public: - - static const int MAX_MODULES = 64; - osd_module_manager(); ~osd_module_manager(); @@ -79,7 +80,7 @@ public: osd_module *select_module(const char *type, const char *name = ""); - void get_module_names(const char *type, const int max, int *num, const char *names[]) const; + void get_module_names(const char *type, const int max, int &num, const char *names[]) const; void init(const osd_options &options); @@ -88,8 +89,8 @@ public: private: int get_module_index(const char *type, const char *name) const; - osd_module *m_modules[MAX_MODULES]; - osd_module *m_selected[MAX_MODULES]; + std::vector > m_modules; + std::vector > m_selected; }; #define MODULE_DEFINITION(mod_id, mod_class) \ diff --git a/src/osd/modules/output/win32_output.cpp b/src/osd/modules/output/win32_output.cpp index f01c46b735d..98731b32164 100644 --- a/src/osd/modules/output/win32_output.cpp +++ b/src/osd/modules/output/win32_output.cpp @@ -162,7 +162,7 @@ void output_win32::exit() { registered_client *temp = m_clientlist; m_clientlist = temp->next; - global_free(temp); + delete temp; } // broadcast a shutdown message @@ -266,7 +266,7 @@ LRESULT output_win32::register_client(HWND hwnd, LPARAM id) } // add us to the end - *client = global_alloc(registered_client); + *client = new registered_client; (*client)->next = nullptr; (*client)->id = id; (*client)->hwnd = hwnd; @@ -293,7 +293,7 @@ LRESULT output_win32::unregister_client(HWND hwnd, LPARAM id) { registered_client *temp = *client; *client = (*client)->next; - global_free(temp); + delete temp; found = true; break; } diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp index b1bbb8a758e..9fa89e0b1c7 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.cpp +++ b/src/osd/modules/render/d3d/d3dhlsl.cpp @@ -223,7 +223,7 @@ shaders::~shaders() if (options != nullptr) { - global_free(options); + delete options; options = nullptr; } } @@ -499,7 +499,7 @@ bool shaders::init(d3d_base *d3dintf, running_machine *machine, renderer_d3d9 *r snap_width = winoptions.d3d_snap_width(); snap_height = winoptions.d3d_snap_height(); - this->options = (hlsl_options*)global_alloc_clear(); + this->options = make_unique_clear().release(); this->options->params_init = false; // copy last options if initialized diff --git a/src/osd/modules/render/draw13.cpp b/src/osd/modules/render/draw13.cpp index 96b04efc3d9..af7c8559ca0 100644 --- a/src/osd/modules/render/draw13.cpp +++ b/src/osd/modules/render/draw13.cpp @@ -335,7 +335,7 @@ int renderer_sdl2::RendererSupportsFormat(Uint32 format, Uint32 access, const ch void renderer_sdl2::add_list(copy_info_t **head, const copy_info_t *element, Uint32 bm) { - copy_info_t *newci = global_alloc(copy_info_t); + copy_info_t *newci = new copy_info_t; *newci = *element; newci->bm_mask = bm; @@ -917,7 +917,7 @@ void renderer_sdl2::exit() (int) bi->perf); copy_info_t *freeme = bi; bi = bi->next; - global_free(freeme); + delete freeme; } s_blit_info[i] = nullptr; } @@ -942,7 +942,7 @@ texture_info * renderer_sdl2::texture_update(const render_primitive &prim) // if we didn't find one, create a new texture if (texture == nullptr && prim.texture.base != nullptr) { - texture = global_alloc(texture_info(this, prim.texture, setup, prim.flags)); + texture = new texture_info(this, prim.texture, setup, prim.flags); /* add us to the texture list */ m_texlist.prepend(*texture); } diff --git a/src/osd/modules/render/draw13.h b/src/osd/modules/render/draw13.h index 26a6bb565bf..21126e8d76a 100644 --- a/src/osd/modules/render/draw13.h +++ b/src/osd/modules/render/draw13.h @@ -8,10 +8,10 @@ // //============================================================ -#pragma once +#ifndef MAME_OSD_MODULES_RENDER_DRAW13_H +#define MAME_OSD_MODULES_RENDER_DRAW13_H -#ifndef __DRAW20__ -#define __DRAW20__ +#pragma once // OSD headers #ifndef OSD_WINDOWS @@ -210,4 +210,4 @@ private: static const copy_info_t s_blit_info_default[]; }; -#endif // __DRAW20__ +#endif // MAME_OSD_MODULES_RENDER_DRAW13_H diff --git a/src/osd/modules/render/drawd3d.cpp b/src/osd/modules/render/drawd3d.cpp index df1e31a0c25..ee5dffdeaf0 100644 --- a/src/osd/modules/render/drawd3d.cpp +++ b/src/osd/modules/render/drawd3d.cpp @@ -118,7 +118,7 @@ static inline uint32_t ycc_to_rgb(uint8_t y, uint8_t cb, uint8_t cr) // drawd3d_init //============================================================ -static d3d_base * d3dintf; // FIX ME +static d3d_base *d3dintf = nullptr; // FIX ME //============================================================ @@ -202,14 +202,15 @@ render_primitive_list *renderer_d3d9::get_primitives() bool renderer_d3d9::init(running_machine &machine) { - d3dintf = global_alloc(d3d_base); + d3dintf = new d3d_base; d3dintf->d3d9_dll = osd::dynamic_module::open({ "d3d9.dll" }); d3d9_create_fn d3d9_create_ptr = d3dintf->d3d9_dll->bind("Direct3DCreate9"); if (d3d9_create_ptr == nullptr) { - global_free(d3dintf); + delete d3dintf; + d3dintf = nullptr; osd_printf_verbose("Direct3D: Unable to find Direct3D 9 runtime library\n"); return true; } @@ -217,7 +218,8 @@ bool renderer_d3d9::init(running_machine &machine) d3dintf->d3dobj = (*d3d9_create_ptr)(D3D_SDK_VERSION); if (d3dintf->d3dobj == nullptr) { - global_free(d3dintf); + delete d3dintf; + d3dintf = nullptr; osd_printf_verbose("Direct3D: Unable to initialize Direct3D 9\n"); return true; } @@ -462,7 +464,7 @@ void d3d_texture_manager::create_resources() void d3d_texture_manager::delete_resources() { // is part of m_texlist and will be free'd there - //global_free(m_default_texture); + //delete m_default_texture; m_default_texture = nullptr; // free all textures @@ -505,7 +507,7 @@ renderer_d3d9::renderer_d3d9(std::shared_ptr window) : osd_renderer(window, FLAG_NONE), m_adapter(0), m_width(0), m_height(0), m_refresh(0), m_create_error_count(0), m_device(nullptr), m_gamma_supported(0), m_pixformat(), m_vertexbuf(nullptr), m_lockedbuf(nullptr), m_numverts(0), m_vectorbatch(nullptr), m_batchindex(0), m_numpolys(0), m_toggle(false), m_screen_format(), m_last_texture(nullptr), m_last_texture_flags(0), m_last_blendenable(0), m_last_blendop(0), m_last_blendsrc(0), m_last_blenddst(0), m_last_filter(0), - m_last_wrap(), m_last_modmode(0), m_shaders(nullptr), m_texture_manager(nullptr) + m_last_wrap(), m_last_modmode(0), m_shaders(nullptr), m_texture_manager() { } @@ -811,7 +813,7 @@ int renderer_d3d9::device_create(HWND hwnd) return 1; } - m_texture_manager = global_alloc(d3d_texture_manager(this)); + m_texture_manager = std::make_unique(this); // try for XRGB first m_screen_format = D3DFMT_X8R8G8B8; @@ -871,7 +873,7 @@ int renderer_d3d9::device_create_resources() // create shaders only once if (m_shaders == nullptr) { - m_shaders = (shaders*)global_alloc_clear(); + m_shaders = new shaders; } if (m_shaders->init(d3dintf, &win->machine(), this)) @@ -962,7 +964,7 @@ renderer_d3d9::~renderer_d3d9() //if (m_shaders != nullptr) //{ // // delete the HLSL interface - // global_free(m_shaders); + // delete m_shaders; // m_shaders = nullptr; //} } @@ -972,7 +974,7 @@ void renderer_d3d9::exit() if (d3dintf != nullptr) { d3dintf->d3dobj->Release(); - global_free(d3dintf); + delete d3dintf; d3dintf = nullptr; } } @@ -984,11 +986,7 @@ void renderer_d3d9::device_delete() // we do not delete the HLSL interface here - if (m_texture_manager != nullptr) - { - global_free(m_texture_manager); - m_texture_manager = nullptr; - } + m_texture_manager.reset(); // free the device itself if (m_device != nullptr) diff --git a/src/osd/modules/render/drawd3d.h b/src/osd/modules/render/drawd3d.h index 03527d7374e..2fa4a30873c 100644 --- a/src/osd/modules/render/drawd3d.h +++ b/src/osd/modules/render/drawd3d.h @@ -5,11 +5,11 @@ // drawd3d.h - Win32 Direct3D header // //============================================================ +#ifndef MAME_OSD_MODULES_RENDER_DRAWD3D_H +#define MAME_OSD_MODULES_RENDER_DRAWD3D_H #pragma once -#ifndef __WIN_DRAWD3D__ -#define __WIN_DRAWD3D__ #ifdef OSD_WINDOWS @@ -127,7 +127,7 @@ public: uint32_t get_last_texture_flags() const { return m_last_texture_flags; } - d3d_texture_manager * get_texture_manager() const { return m_texture_manager; } + d3d_texture_manager * get_texture_manager() const { return m_texture_manager.get(); } texture_info * get_default_texture(); shaders * get_shaders() const { return m_shaders; } @@ -171,9 +171,9 @@ private: shaders * m_shaders; // HLSL interface - d3d_texture_manager * m_texture_manager; // texture manager + std::unique_ptr m_texture_manager; // texture manager }; #endif // OSD_WINDOWS -#endif // __WIN_DRAWD3D__ +#endif // MAME_OSD_MODULES_RENDER_DRAWD3D_H diff --git a/src/osd/modules/render/drawgdi.cpp b/src/osd/modules/render/drawgdi.cpp index bd0e6425b6e..32dac94c24a 100644 --- a/src/osd/modules/render/drawgdi.cpp +++ b/src/osd/modules/render/drawgdi.cpp @@ -16,9 +16,6 @@ renderer_gdi::~renderer_gdi() { - // free the bitmap memory - if (m_bmdata != nullptr) - global_free_array(m_bmdata); } //============================================================ @@ -83,13 +80,13 @@ int renderer_gdi::draw(const int update) if (pitch * height * 4 > m_bmsize) { m_bmsize = pitch * height * 4 * 2; - global_free_array(m_bmdata); - m_bmdata = global_alloc_array(uint8_t, m_bmsize); + m_bmdata.reset(); + m_bmdata = std::make_unique(m_bmsize); } // draw the primitives to the bitmap win->m_primlist->acquire_lock(); - software_renderer::draw_primitives(*win->m_primlist, m_bmdata, width, height, pitch); + software_renderer::draw_primitives(*win->m_primlist, m_bmdata.get(), width, height, pitch); win->m_primlist->release_lock(); // fill in bitmap-specific info @@ -97,8 +94,9 @@ int renderer_gdi::draw(const int update) m_bminfo.bmiHeader.biHeight = -height; // blit to the screen - StretchDIBits(win->m_dc, 0, 0, width, height, - 0, 0, width, height, - m_bmdata, &m_bminfo, DIB_RGB_COLORS, SRCCOPY); + StretchDIBits( + win->m_dc, 0, 0, width, height, + 0, 0, width, height, + m_bmdata.get(), &m_bminfo, DIB_RGB_COLORS, SRCCOPY); return 0; } diff --git a/src/osd/modules/render/drawgdi.h b/src/osd/modules/render/drawgdi.h index 49d05c18daa..7984998f4bc 100644 --- a/src/osd/modules/render/drawgdi.h +++ b/src/osd/modules/render/drawgdi.h @@ -5,11 +5,11 @@ // drawgdi.h - Win32 GDI drawing // //============================================================ +#ifndef MAME_OSD_MODULES_RENDER_DRAWGDI_H +#define MAME_OSD_MODULES_RENDER_DRAWGDI_H #pragma once -#ifndef __DRAWGDI__ -#define __DRAWGDI__ // standard windows headers #include @@ -47,9 +47,9 @@ public: virtual void toggle_fsfx() override {}; private: - BITMAPINFO m_bminfo; - uint8_t * m_bmdata; - size_t m_bmsize; + BITMAPINFO m_bminfo; + std::unique_ptr m_bmdata; + size_t m_bmsize; }; -#endif // __DRAWGDI__ +#endif // MAME_OSD_MODULES_RENDER_DRAWGDI_H diff --git a/src/osd/modules/render/drawogl.cpp b/src/osd/modules/render/drawogl.cpp index ae030224e74..6d3eae1e8ad 100644 --- a/src/osd/modules/render/drawogl.cpp +++ b/src/osd/modules/render/drawogl.cpp @@ -307,7 +307,7 @@ renderer_ogl::~renderer_ogl() // free the memory in the window destroy_all_textures(); - global_free(m_gl_context); + delete m_gl_context; m_gl_context = nullptr; } @@ -366,7 +366,7 @@ static void loadgl_functions(osd_gl_context *context) //============================================================ #ifdef USE_DISPATCH_GL -osd_gl_dispatch *gl_dispatch; +osd_gl_dispatch *gl_dispatch = nullptr; #endif void renderer_ogl::load_gl_lib(running_machine &machine) @@ -394,7 +394,7 @@ void renderer_ogl::load_gl_lib(running_machine &machine) #endif #endif #ifdef USE_DISPATCH_GL - gl_dispatch = global_alloc(osd_gl_dispatch); + gl_dispatch = new osd_gl_dispatch; #endif s_dll_loaded = true; } @@ -566,12 +566,12 @@ int renderer_ogl::create() // create renderer #if defined(OSD_WINDOWS) - m_gl_context = global_alloc(win_gl_context(std::static_pointer_cast(win)->platform_window())); + m_gl_context = new win_gl_context(std::static_pointer_cast(win)->platform_window()); #elif defined(OSD_MAC) // TODO -// m_gl_context = global_alloc(mac_gl_context(std::static_pointer_cast(win)->platform_window())); +// m_gl_context = new mac_gl_context(std::static_pointer_cast(win)->platform_window()); #else - m_gl_context = global_alloc(sdl_gl_context(std::static_pointer_cast(win)->platform_window())); + m_gl_context = new sdl_gl_context(std::static_pointer_cast(win)->platform_window()); #endif if (m_gl_context->LastErrorMsg() != nullptr) { @@ -696,7 +696,7 @@ void renderer_ogl::destroy_all_textures() texture->data=nullptr; texture->data_own=false; } - global_free(texture); + delete texture; } i++; } @@ -1907,7 +1907,7 @@ ogl_texture_info *renderer_ogl::texture_create(const render_texinfo *texsource, ogl_texture_info *texture; // allocate a new texture - texture = global_alloc(ogl_texture_info); + texture = new ogl_texture_info; // fill in the core data texture->hash = texture_compute_hash(texsource, flags); @@ -1979,7 +1979,7 @@ ogl_texture_info *renderer_ogl::texture_create(const render_texinfo *texsource, { if ( texture_shader_create(texsource, texture, flags) ) { - global_free(texture); + delete texture; return nullptr; } } diff --git a/src/osd/modules/render/drawogl.h b/src/osd/modules/render/drawogl.h index 525ba0c3ffa..891c5cec814 100644 --- a/src/osd/modules/render/drawogl.h +++ b/src/osd/modules/render/drawogl.h @@ -7,12 +7,11 @@ // SDLMAME by Olivier Galibert and R. Belmont // //============================================================ +#ifndef MAME_OSD_MODULES_RENDER_DRAWOGL_H +#define MAME_OSD_MODULES_RENDER_DRAWOGL_H #pragma once -#ifndef __DRAWOGL__ -#define __DRAWOGL__ - // OSD headers #ifndef OSD_WINDOWS #ifdef OSD_MAC @@ -239,4 +238,4 @@ private: static bool s_dll_loaded; }; -#endif // __DRAWOGL__ +#endif // MAME_OSD_MODULES_RENDER_DRAWOGL_H diff --git a/src/osd/modules/render/drawsdl.cpp b/src/osd/modules/render/drawsdl.cpp index 76dc1375e5b..1797c5be597 100644 --- a/src/osd/modules/render/drawsdl.cpp +++ b/src/osd/modules/render/drawsdl.cpp @@ -111,11 +111,7 @@ void renderer_sdl1::setup_texture(const osd_dim &size) // Determine preferred pixelformat and set up yuv if necessary SDL_GetCurrentDisplayMode(win->monitor()->oshandle(), &mode); - if (m_yuv_bitmap) - { - global_free_array(m_yuv_bitmap); - m_yuv_bitmap = nullptr; - } + m_yuv_bitmap.reset(); fmt = (sdl_sm->pixel_format ? sdl_sm->pixel_format : mode.format); @@ -134,7 +130,7 @@ void renderer_sdl1::setup_texture(const osd_dim &size) m_hw_scale_width = (m_hw_scale_width + 1) & ~1; } if (sdl_sm->is_yuv) - m_yuv_bitmap = global_alloc_array(uint16_t, m_hw_scale_width * m_hw_scale_height); + m_yuv_bitmap = std::make_unique(m_hw_scale_width * m_hw_scale_height); int w = m_hw_scale_width * sdl_sm->mult_w; int h = m_hw_scale_height * sdl_sm->mult_h; @@ -257,16 +253,6 @@ renderer_sdl1::~renderer_sdl1() { destroy_all_textures(); - if (m_yuv_lookup != nullptr) - { - global_free_array(m_yuv_lookup); - m_yuv_lookup = nullptr; - } - if (m_yuv_bitmap != nullptr) - { - global_free_array(m_yuv_bitmap); - m_yuv_bitmap = nullptr; - } SDL_DestroyRenderer(m_sdl_renderer); } @@ -448,8 +434,8 @@ int renderer_sdl1::draw(int update) { assert (m_yuv_bitmap != nullptr); assert (surfptr != nullptr); - software_renderer::draw_primitives(*win->m_primlist, m_yuv_bitmap, mamewidth, mameheight, mamewidth); - sm->yuv_blit((uint16_t *)m_yuv_bitmap, surfptr, pitch, m_yuv_lookup, mamewidth, mameheight); + software_renderer::draw_primitives(*win->m_primlist, m_yuv_bitmap.get(), mamewidth, mameheight, mamewidth); + sm->yuv_blit(m_yuv_bitmap.get(), surfptr, pitch, m_yuv_lookup.get(), mamewidth, mameheight); } win->m_primlist->release_lock(); @@ -525,12 +511,11 @@ void renderer_sdl1::yuv_lookup_set(unsigned int pen, unsigned char red, void renderer_sdl1::yuv_init() { - unsigned char r,g,b; - if (m_yuv_lookup == nullptr) - m_yuv_lookup = global_alloc_array(uint32_t, 65536); - for (r = 0; r < 32; r++) - for (g = 0; g < 32; g++) - for (b = 0; b < 32; b++) + if (!m_yuv_lookup) + m_yuv_lookup = std::make_unique(65536); + for (unsigned char r = 0; r < 32; r++) + for (unsigned char g = 0; g < 32; g++) + for (unsigned char b = 0; b < 32; b++) { int idx = (r << 10) | (g << 5) | b; yuv_lookup_set(idx, diff --git a/src/osd/modules/render/drawsdl.h b/src/osd/modules/render/drawsdl.h index 6c0b51c0663..bc8246a632d 100644 --- a/src/osd/modules/render/drawsdl.h +++ b/src/osd/modules/render/drawsdl.h @@ -10,10 +10,10 @@ // //============================================================ -#pragma once +#ifndef MAME_OSD_MODULES_RENDER_DRAWSDL_H +#define MAME_OSD_MODULES_RENDER_DRAWSDL_H -#ifndef __DRAWSDL1__ -#define __DRAWSDL1__ +#pragma once #include @@ -26,8 +26,8 @@ public: : osd_renderer(w, FLAG_NEEDS_OPENGL | extra_flags) , m_sdl_renderer(nullptr) , m_texture_id(nullptr) - , m_yuv_lookup(nullptr) - , m_yuv_bitmap(nullptr) + , m_yuv_lookup() + , m_yuv_bitmap() //, m_hw_scale_width(0) //, m_hw_scale_height(0) , m_last_hofs(0) @@ -61,8 +61,8 @@ private: SDL_Texture *m_texture_id; // YUV overlay - uint32_t *m_yuv_lookup; - uint16_t *m_yuv_bitmap; + std::unique_ptr m_yuv_lookup; + std::unique_ptr m_yuv_bitmap; // if we leave scaling to SDL and the underlying driver, this // is the render_target_width/height to use @@ -85,4 +85,4 @@ struct sdl_scale_mode void (*yuv_blit)(const uint16_t *bitmap, uint8_t *ptr, const int pitch, const uint32_t *lookup, const int width, const int height); }; -#endif // __DRAWSDL1__ +#endif // MAME_OSD_MODULES_RENDER_DRAWSDL_H diff --git a/src/osd/osdepend.h b/src/osd/osdepend.h index f2c4e36c0e5..ad7b52049a6 100644 --- a/src/osd/osdepend.h +++ b/src/osd/osdepend.h @@ -91,7 +91,7 @@ public: virtual bool execute_command(const char *command) = 0; // midi interface - virtual osd_midi_device *create_midi_device() = 0; + virtual std::unique_ptr create_midi_device() = 0; protected: virtual ~osd_interface() { } diff --git a/src/osd/sdl/window.cpp b/src/osd/sdl/window.cpp index 70886d76a73..9f07ce7cd49 100644 --- a/src/osd/sdl/window.cpp +++ b/src/osd/sdl/window.cpp @@ -1137,12 +1137,11 @@ sdl_window_info::sdl_window_info( m_prescale = video_config.prescale; m_windowed_dim = osd_dim(config->width, config->height); - m_original_mode = global_alloc(SDL_DM_Wrapper); + m_original_mode = std::make_unique(); } sdl_window_info::~sdl_window_info() { - global_free(m_original_mode); } diff --git a/src/osd/sdl/window.h b/src/osd/sdl/window.h index d6010e91ed2..bfe32e6e8a0 100644 --- a/src/osd/sdl/window.h +++ b/src/osd/sdl/window.h @@ -8,8 +8,8 @@ // //============================================================ -#ifndef __SDLWINDOW__ -#define __SDLWINDOW__ +#ifndef MAME_OSD_SDL_WINDOW_H +#define MAME_OSD_SDL_WINDOW_H #include "osdsdl.h" #include "video.h" @@ -87,7 +87,7 @@ private: render_target * m_target; // Original display_mode - SDL_DM_Wrapper *m_original_mode; + std::unique_ptr m_original_mode; int m_extra_flags; @@ -152,4 +152,4 @@ int drawsdl2_init(running_machine &machine, osd_draw_callbacks *callbacks); int drawbgfx_init(running_machine &machine, osd_draw_callbacks *callbacks); -#endif /* __SDLWINDOW__ */ +#endif // MAME_OSD_SDL_WINDOW_H diff --git a/src/tools/imgtool/modules/hp85_tape.cpp b/src/tools/imgtool/modules/hp85_tape.cpp index dada87e290a..fbdef06a7cb 100644 --- a/src/tools/imgtool/modules/hp85_tape.cpp +++ b/src/tools/imgtool/modules/hp85_tape.cpp @@ -866,7 +866,7 @@ namespace { tape_image_85& get_tape_image(tape_state_t& ts) { if (ts.img == nullptr) { - ts.img = global_alloc(tape_image_85); + ts.img = new tape_image_85; } return *(ts.img); @@ -916,7 +916,7 @@ namespace { delete state.stream; // Free tape_image - global_free(&tape_image); + delete &tape_image; } imgtoolerr_t hp85_tape_begin_enum (imgtool::directory &enumeration, const char *path) diff --git a/src/tools/imgtool/modules/hp9845_tape.cpp b/src/tools/imgtool/modules/hp9845_tape.cpp index d3416deaefd..e9abc99789c 100644 --- a/src/tools/imgtool/modules/hp9845_tape.cpp +++ b/src/tools/imgtool/modules/hp9845_tape.cpp @@ -985,7 +985,7 @@ static tape_state_t& get_tape_state(imgtool::image &img) static tape_image_t& get_tape_image(tape_state_t& ts) { if (ts.img == nullptr) { - ts.img = global_alloc(tape_image_t); + ts.img = new tape_image_t; } return *(ts.img); @@ -1034,7 +1034,7 @@ static void hp9845_tape_close(imgtool::image &image) delete state.stream; // Free tape_image - global_free(&tape_image); + delete &tape_image; } static imgtoolerr_t hp9845_tape_begin_enum (imgtool::directory &enumeration, const char *path)