void op3d::Engine::initVulkan() { instance.create(); callback.setup(instance); surface.create(instance, window); physicalDevice.create(instance, surface); device.create(physicalDevice, surface, graphicsQueue, presentQueue); swapChain.create(device, surface, physicalDevice, window); swapChain.createImageViews(device, swapChainImageViews); createRenderPass(); createDescriptorSetLayout(); createGraphicsPipeline(); commandBufferManager.createCommandPool(physicalDevice, surface); createDepthResources(); createFramebuffers(); createTextureImage(); createTextureImageView(); createTextureSampler(); createVertexBuffer(); createIndexBuffer(); createUniformBuffer(); descriptorPool.createPool(); descriptorSet.createSet(uniformBuffer, textureImageView, textureSampler, descriptorSetLayout, descriptorPool, device); createCommandBuffers(); createSemaphores(); }
status_t device_open(const char *name, uint32 flags, void **cookie) { struct sis_info *info; area_id area; int id; // verify device access (we only allow one user at a time) { char *thisName; int32 mask; // search for device name for (id = 0; (thisName = gDeviceNames[id]) != NULL; id++) { if (!strcmp(name, thisName)) break; } if (!thisName) return EINVAL; // check if device is already open mask = 1L << id; if (atomic_or(&gDeviceOpenMask, mask) & mask) return B_BUSY; } // allocate internal device structure if ((area = create_area(DEVICE_NAME " private data", cookie, B_ANY_KERNEL_ADDRESS, ROUND_TO_PAGE_SIZE(sizeof(struct sis_info)), B_FULL_LOCK, B_READ_AREA | B_WRITE_AREA)) < B_OK) { gDeviceOpenMask &= ~(1L << id); return B_NO_MEMORY; } info = (struct sis_info *)*cookie; memset(info, 0, sizeof(struct sis_info)); info->cookieMagic = SiS_COOKIE_MAGIC; info->thisArea = area; info->id = id; info->pciInfo = pciInfo[id]; info->registers = (addr_t)pciInfo[id]->u.h0.base_registers[0]; if (sis900_getMACAddress(info)) dprintf(DEVICE_NAME ": MAC address %02x:%02x:%02x:%02x:%02x:%02x\n", info->address.ebyte[0], info->address.ebyte[1], info->address.ebyte[2], info->address.ebyte[3], info->address.ebyte[4], info->address.ebyte[5]); else dprintf(DEVICE_NAME ": could not get MAC address\n"); readSettings(info); if (createSemaphores(info) == B_OK) { status_t status = sis900_initPHYs(info); if (status == B_OK) { TRACE((DEVICE_NAME ": MII status = %d\n", mdio_read(info, MII_STATUS))); //sis900_configFIFOs(info); sis900_reset(info); // install & enable interrupts install_io_interrupt_handler(info->pciInfo->u.h0.interrupt_line, sis900_interrupt, info, 0); sis900_enableInterrupts(info); sis900_setRxFilter(info); sis900_createRings(info); // enable receiver's state machine write32(info->registers + SiS900_MAC_COMMAND, SiS900_MAC_CMD_Rx_ENABLE); // check link mode & add timer (once every second) sis900_checkMode(info); add_timer(&info->timer, sis900_timer, 1000000LL, B_PERIODIC_TIMER); return B_OK; } dprintf(DEVICE_NAME ": could not initialize MII PHY: %s\n", strerror(status)); deleteSemaphores(info); } else dprintf(DEVICE_NAME ": could not create semaphores.\n"); gDeviceOpenMask &= ~(1L << id); delete_area(area); return B_ERROR; }
int main(void) { // create shared memory buffer with rw perms int shmid = shmget(1000, 1, IPC_CREAT | PERMS); if(shmid < 0) { fprintf(stderr, "Unable to create shared buffer.\n"); exit(EXIT_FAILURE); } // allocate buffer if((buffer = (int*)shmat(shmid, (char*)0, 0)) == (int*)-1) { fprintf(stderr, "Unable to allocate.\n"); exit(EXIT_FAILURE); } // use smget to get semaphores with read write permissions getSemaphores(); // initialize semaphores createSemaphores(); // create child processes int pid_tob = fork(); if(pid_tob < 0) { perror("pid_tob"); exit(EXIT_FAILURE); } if(pid_tob == 0) { while(1) { // in smoker with tobacco P(stob); // wait for signal P(smutex); // wait to modify buffer smoker_t(); // roll up cigarette V(sage); // signal agent V(smutex); // signal that buffer can now be modified again } }else { int pid_pap = fork(); if(pid_pap < 0) { perror("pid_pap"); exit(EXIT_FAILURE); } if(pid_pap == 0) { while(1) { // in smoker with paper P(spap); P(smutex); smoker_p(); V(sage); V(smutex); } }else { int pid_mat = fork(); if(pid_mat < 0) { perror("pid_mat"); exit(EXIT_FAILURE); } if(pid_mat == 0) { while(1) { // in smoker with matches P(smat); P(smutex); smoker_m(); V(sage); V(smutex); } }else { // in agent int i; for(int i = 0; i < N; ++i) { P(smutex); // wait for signal to modify buffer agent(); // place items on table // signal the smoker with the remaining item int supply = *buffer; if(supply == TOBACCO) V(stob); else if(supply == PAPER) V(spap); else V(smat); V(smutex); // done modifying buffer P(sage); // now wait while a smoker process loop finishes putchar('\n'); } // infinite loop, so kill child processes on exit kill(pid_pap, SIGUSR1); kill(pid_tob, SIGUSR1); kill(pid_mat, SIGUSR1); exit(EXIT_SUCCESS); } } } }