static status_t FreeHook(void *dev) { TRACE("FreeHook\n"); ACQUIRE_BEN(gPd->kernel); if (gPd->isOpen < 2) { UnmapDevice(); FreeShared(); } gPd->isOpen--; RELEASE_BEN(gPd->kernel); TRACE("FreeHook ends\n"); return B_OK; }
static status_t device_free(void* dev) { DeviceInfo& di = *((DeviceInfo*)dev); SharedInfo& si = *(di.sharedInfo); pci_info& pciInfo = di.pciInfo; TRACE("enter device_free()\n"); gLock.Acquire(); // lock driver // If opened multiple times, merely decrement the open count and exit. if (di.openCount <= 1) { DisableVBI(); // disable & clear any pending interrupts if (si.bInterruptAssigned) { remove_io_interrupt_handler(pciInfo.u.h0.interrupt_line, InterruptHandler, &di); } // Delete the semaphores, ignoring any errors because the owning team // may have died. if (si.vertBlankSem >= 0) delete_sem(si.vertBlankSem); si.vertBlankSem = -1; UnmapDevice(di); // free regs and frame buffer areas delete_area(di.sharedArea); di.sharedArea = -1; di.sharedInfo = NULL; } if (di.openCount > 0) di.openCount--; // mark device available gLock.Release(); // unlock driver TRACE("exit device_free() openCount: %ld\n", di.openCount); return B_OK; }