[MacPorts] #64909: libaacs for PowerPC: how to rewrite __block code in standard C?
MacPorts
noreply at macports.org
Wed Mar 30 06:27:03 UTC 2022
#64909: libaacs for PowerPC: how to rewrite __block code in standard C?
-------------------------------------------+---------------------
Reporter: barracuda156 | Owner: (none)
Type: request | Status: new
Priority: Normal | Milestone:
Component: ports | Version: 2.7.2
Keywords: powerpc, leopard, snowleopard | Port: libaacs
-------------------------------------------+---------------------
Could anyone advise me if this can be rewritten in standard C? gcc does
not process this __block code correctly:
{{{
void device_close(MMCDEV **pp)
{
__block int rc = 0;
if (pp && *pp) {
MMCDEV *mmc = *pp;
/* When the exclusive access to the drive is released,
* the OS will see the device like a "new" device and
* try to mount it. Therefore we can't just mount the
* disk we previously got immediately here as it would
* fail with kDAReturnBadArgument as the disk is not
* available yet.
* Trying to mount the disk after it appears in peek
* does not work either as the disk is not yet ready
* or in the process of being mounted by the OS so
* that would return an kDAReturnBusy error.
* The only way that seems to reliably work is to use
* a mount approval callback. When the OS tries to
* mount the disk, the mount approval callback is
* called and we can reject mounting and then proceed
* to mount the disk ourselves.
* Claiming exclusive access using DADiskClaim in order
* to prevent the OS form mounting the disk does not work
* either!
*/
if (mmc->taskInterface) {
(*mmc->taskInterface)->ReleaseExclusiveAccess(mmc->taskInterface);
(*mmc->taskInterface)->Release(mmc->taskInterface);
mmc->taskInterface = NULL;
}
if (mmc->mmcInterface) {
(*mmc->mmcInterface)->Release(mmc->mmcInterface);
mmc->mmcInterface = NULL;
}
if (mmc->plugInInterface) {
IODestroyPlugInInterface(mmc->plugInInterface);
}
if (!mmc->sync_sem) {
/* open failed before iokit_da_init() */
X_FREE(*pp);
return;
}
/* Wait for disc to re-appear for 20 seconds.
* This timeout was figured out by experimentation with
* a USB BD drive which sometimes can take really long to
* be in a mountable state again.
* For internal drives this is probably much faster
* so the long timeout shouldn't do much harm for thse
* cases.
*/
dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 20 *
1E+9);
dispatch_semaphore_wait(mmc->sync_sem, timeout);
/* It is crucial that this is done on the event handling queue
* else callbacks could be received while this code runs.
*/
dispatch_sync(mmc->background_queue, ^{
if (disk_appeared != mmc->disk_state) {
BD_DEBUG(DBG_MMC | DBG_CRIT, "Timeout waiting for the disc
to appear again!\n");
iokit_da_destroy(mmc);
rc = -1;
return;
}
rc = 0;
});
if (rc == 0) {
/* Disk appeared successfully, mount it.
* Return value is ignored as logging of success or
* error takes place in the callback already and there
* is nothing we can do really if mounting fails.
*/
(void) iokit_mount(mmc);
iokit_da_destroy(mmc);
}
X_FREE(*pp);
}
}
}}}
This is from `src/file/mmc_device_darwin.c`.
--
Ticket URL: <https://trac.macports.org/ticket/64909>
MacPorts <https://www.macports.org/>
Ports system for macOS
More information about the macports-tickets
mailing list