Esempio n. 1
0
void webserver_loop() {
    dmd_log(LOG_INFO, "in function %s, starting webserver main loop.\n",
            __func__);

    int serverfd = newSocket();
    webserver_serverAddr = newAddress();
    bindAddress(serverfd, webserver_serverAddr);
    listenAddress(serverfd);

    struct epoll_event events[MAX_EPOLL_EVENT];
    int epollfd = newEpollSocket();

    dmd_log(LOG_DEBUG, "in function %s, begin to work\n", __func__);
    addSockfd(epollfd, serverfd);
    while (1) {
        int ret = epoll_wait(epollfd, events, MAX_EPOLL_EVENT, -1);
        dmd_log(LOG_DEBUG, "in function %s, after epoll wait\n", __func__);
        if (ret < 0) {
            dmd_log(LOG_ERR, "in function %s, epoll failure\n", __func__);
        } else {
            handleEvent(epollfd, serverfd, events, ret);
        }
    }  // while

    closeSocket(serverfd);
    releaseAddress(webserver_serverAddr);
}
/**----------------------------------------------------
 * @brief dataSet 型の解放関数
 * @note    address、data に関しては free をする。
 *              type は DATATYPE_INVALID にて初期化。
 *              num は INT_MAX にて初期化を行います。
 * @param[out]  dataSet_    データを解放したいもの
 *---------------------------------------------------*/
void releaseReciprocateData(ReciprocateData* reciprocateData_)
{
	releaseAddress(reciprocateData_);
	free(reciprocateData_->data);
	reciprocateData_->type = DATATYPE_INVALID;
	reciprocateData_->num = INT_MAX;
}
Esempio n. 3
0
/* virtual */ SysStatus
FRPA::startPutPage(uval physAddr, uval objOffset, IORestartRequests *rr)
{
    uval size, addr;
    SysStatus rc;

    if (objOffset >= filelen) {
	// the page may be dirty, but it's not part of the file
	// anymore so we don't do anything
#ifdef DEBUGGING_PAST_ENDFILE
	tassertMsg(0, "FIXME: ignoring page past eof: objOffset=%ld, "
		   "filelen=%ld\n", objOffset, filelen);
#endif /* #ifdef DEBUGGING_PAST_ENDFILE */
	// tell the fcm this IO is complete
	DREF(fcmRef)->ioComplete(objOffset, 0);
	return 0;
    }
    size = PAGE_SIZE;
    if (size > (filelen-objOffset)) {
	size = filelen-objOffset;
    }

    FetchAndAddSignedVolatile(&outstanding, 1);

    // FIXME, pass in blocking info here...
    rc = convertAddressWriteTo(physAddr, addr, rr);
    tassertMsg(_SUCCESS(rc), "rc 0x%lx\n", rc);

    if (kptref) {
	if (rr == NULL) { // not restarting requests
	    rc = DREF(kptref)->startWrite(fileToken, addr, objOffset, size);
	    tassertMsg(_SUCCESS(rc), "woops\n");
	} else {
	    rc = DREF(kptref)->tryStartWrite(fileToken, addr, objOffset,
					     size, rr);
	    if (_FAILURE(rc)) {
		passertMsg((_SCLSCD(rc) == FR::WOULDBLOCK), "woops\n");
		// release the page
		releaseAddress(addr);
		
		// decrement outstanding count
		FetchAndAddSignedVolatile(&outstanding, -1);
	    }
	}
    } else {
	rc = stubFile->_startWrite(addr, objOffset, size);

	uval interval = 20000;
	while (_FAILURE(rc) && (_SGENCD(rc) == EBUSY) &&
	       (interval < 200000000000UL)) {
	    Scheduler::DelayUntil(interval, TimerEvent::relative);
	    rc = stubFile->_startWrite(addr, objOffset, size);
	    interval = interval * 10;
	}
	passertMsg(_SUCCESS(rc), "timed out trying to send to file system\n");
    }
	
    return rc;
}