Exemple #1
0
/**
 * Add non-existing key into the multimap.
 *
 * @tmap multimap.
 * @key key
 * @newcell prepared inserted value.
 *
 * @return 0 in success,
 *	   -ENOMEM if no memory.
 *	   -EEXIST if key already exists.
 */
static int multimap_add_newkey(
    struct multimap *tmap, u64 key,
    struct tree_cell *newcell, gfp_t gfp_mask)
{
    int ret;
    struct tree_cell_head *newhead;

    /* Allocate and initialize new tree cell head. */
    newhead = alloc_cell_head(tmap->mmgr, gfp_mask);
    if (!newhead) {
        LOGe("memory allocation failed.\n");
        return -ENOMEM;
    }
    newhead->key = key;
    INIT_HLIST_HEAD(&newhead->head);
    hlist_add_head(&newcell->list, &newhead->head);
    ASSERT(!hlist_empty(&newhead->head));

    /* Add to the map. */
    ret = map_add((struct map *)tmap, key, (unsigned long)newhead, gfp_mask);
    if (ret != 0) {
        free_cell_head(tmap->mmgr, newhead);
        LOGe("map_add failed.\n");
        ASSERT(ret != -EINVAL);
    }
    return ret;
}
Exemple #2
0
/**
 * Set oldest_lsid.
 *
 * @wdev walb dev.
 * @ctl ioctl data.
 * RETURN:
 *   0 in success, or -EFAULT.
 */
static int ioctl_wdev_set_oldest_lsid(struct walb_dev *wdev, struct walb_ctl *ctl)
{
	u64 lsid, oldest_lsid, written_lsid;

	LOGn("WALB_IOCTL_SET_OLDEST_LSID_SET\n");

	lsid = ctl->val_u64;

	spin_lock(&wdev->lsid_lock);
	written_lsid = wdev->lsids.written;
	oldest_lsid = wdev->lsids.oldest;
	spin_unlock(&wdev->lsid_lock);

	if (!(lsid == written_lsid ||
			(oldest_lsid <= lsid && lsid < written_lsid &&
				walb_check_lsid_valid(wdev, lsid)))) {
		LOGe("lsid %"PRIu64" is not valid.\n", lsid);
		LOGe("You shoud specify valid logpack header lsid"
			" (oldest_lsid (%"PRIu64") <= lsid <= written_lsid (%"PRIu64").\n",
			oldest_lsid, written_lsid);
		return -EFAULT;
	}

	spin_lock(&wdev->lsid_lock);
	wdev->lsids.oldest = lsid;
	spin_unlock(&wdev->lsid_lock);

	if (!walb_sync_super_block(wdev)) {
		LOGe("sync super block failed.\n");
		return -EFAULT;
	}
	return 0;
}
Exemple #3
0
bool Quests::loadFromXml()
{
	xmlDocPtr doc = xmlParseFile(getFilePath(FileType::XML, "quests.xml").c_str());
	if(!doc)
	{
		LOGe("[Quests::loadFromXml] Cannot load quests file: " << getLastXMLError());
		return false;
	}

	xmlNodePtr p, root = xmlDocGetRootElement(doc);
	if(xmlStrcmp(root->name,(const xmlChar*)"quests"))
	{
		LOGe("[Quests::loadFromXml] Malformed quests file.");
		xmlFreeDoc(doc);
		return false;
	}

	p = root->children;
	while(p)
	{
		parseQuestNode(p, false);
		p = p->next;
	}

	xmlFreeDoc(doc);
	return true;
}
Exemple #4
0
/**
 * Read logpack header sector from log device.
 *
 * @fd log device fd opened.
 * @super_sectp super sector.
 * @lsid logpack lsid to read.
 * @logh_sect buffer to store logpack header data.
 *   This allocated size must be sector size.
 * @salt log checksum salt.
 *
 * RETURN:
 *   ture in success, or false.
 */
bool read_logpack_header_from_wldev(
	int fd, const struct walb_super_sector* super_sectp,
	u64 lsid, u32 salt, struct sector_data *logh_sect)
{
	/* calc offset in the ring buffer */
	u64 ring_buffer_offset = get_ring_buffer_offset_2(super_sectp);
	u64 ring_buffer_size = super_sectp->ring_buffer_size;
	u64 off = ring_buffer_offset + lsid % ring_buffer_size;
	struct walb_logpack_header *logh = get_logpack_header(logh_sect);

	/* read sector */
	if (!sector_read(fd, off, logh_sect)) {
		LOGe("read logpack header (lsid %"PRIu64") failed.\n", lsid);
		return false;
	}

	/* check lsid */
	if (lsid != logh->logpack_lsid) {
		LOGe("lsid (given %"PRIu64" read %"PRIu64") is invalid.\n",
			lsid, logh->logpack_lsid);
		return false;
	}
	if (!is_valid_logpack_header_with_checksum(
			logh, super_sectp->physical_bs, salt)) {
		LOGe("check logpack header failed.\n");
		return false;
	}
	return true;
}
Exemple #5
0
Dispatcher::~Dispatcher() {
	auto locked = _mutex.try_lock();
	if (!locked) {
		LOGe("Dispatcher deleted while in use.");
		assert(locked);

		_mutex.lock();
	}

	if (_state != State::STOPPED) {
		LOGe("Dispatcher deleted but not yet stopped. Forgot to call waitUntilStopped()?");
		assert(_state == State::STOPPED);

		if (std::this_thread::get_id() != _thread.get_id()) {
			if (_state == State::STARTED) {
				stop();
			}

			waitUntilStopped();
		}
		else {
			LOGe("Cannot delete the dispatcher from within the dispatcher thread.");
		}
	}

	_mutex.unlock();
}
Exemple #6
0
/**
 * Invalidate lsid inside ring buffer.
 */
bool invalidate_lsid(struct walb_dev *wdev, u64 lsid)
{
	struct sector_data *zero_sector;
	struct walb_super_sector *super;
	u64 off;
	bool ret;

	ASSERT(lsid != INVALID_LSID);

	zero_sector = sector_alloc(
		wdev->physical_bs, GFP_KERNEL | __GFP_ZERO);
	if (!zero_sector) {
		LOGe("sector allocation failed.\n");
		return false;
	}

	spin_lock(&wdev->lsuper0_lock);
	super = get_super_sector(wdev->lsuper0);
	off = get_offset_of_lsid_2(super, lsid);
	spin_unlock(&wdev->lsuper0_lock);

	ret = sector_io(WRITE, wdev->ldev, off, zero_sector);
	if (!ret) {
		LOGe("sector write failed.\n");
		iocore_set_readonly(wdev);
	}
	sector_free(zero_sector);
	return ret;
}
Exemple #7
0
/**
 * Read super sector.
 *
 * Currently 2nd super sector is not read.
 *
 * RETURN:
 *  true in success, or false.
 */
bool read_super_sector(int fd, struct sector_data *sect)
{
	u64 off0;

	if (!is_valid_sector_data(sect)) {
		LOGe("Sector data is not valid.\n");
		return false;
	}
	ASSERT(sect->size <= PAGE_SIZE);

	off0 = get_super_sector0_offset(sect->size);
	if (!sector_read(fd, off0, sect)) {
		LOGe("Read sector failed.\n");
		return false;
	}
	if (checksum(sect->data, sect->size, 0) != 0) {
		LOGe("Checksum invalid.\n");
		return false;
	}
	if (!is_valid_super_sector(sect)) {
		LOGe("Super sector invalid.\n");
		return false;
	}
	return true;
}
Exemple #8
0
/**
 * Read a logpack data from a stream.
 *
 * @fd file descriptor (opened, seeked)
 * @logh corresponding logpack header.
 * @salt checksum salt.
 * @sect_ary sector data array to be store data.
 *
 * RETURN:
 *   true in success, or false.
 */
bool read_logpack_data(
	int fd,
	const struct walb_logpack_header* logh, u32 salt,
	struct sector_data_array *sect_ary)
{
	unsigned int pbs;
	u32 total_pb;
	int i;
	int n_req;

	ASSERT(fd >= 0);
	ASSERT(logh);
	n_req = logh->n_records;
	ASSERT_SECTOR_DATA_ARRAY(sect_ary);
	pbs = sect_ary->sector_size;
	ASSERT_PBS(pbs);

	if (logh->total_io_size > sect_ary->size) {
		LOGe("sect_ary size is not enough.\n");
		return false;
	}

	total_pb = 0;
	for (i = 0; i < n_req; i++) {
		unsigned int idx_pb, log_lb, log_pb;
		u32 csum;
		const struct walb_log_record *rec = &logh->record[i];

		if (test_bit_u32(LOG_RECORD_DISCARD, &rec->flags)) {
			continue;
		}
		idx_pb = rec->lsid_local - 1;
		log_lb = rec->io_size;
		log_pb = capacity_pb(pbs, log_lb);
		/* Read data of the log record. */
		if (!sector_array_read(fd, sect_ary, idx_pb, log_pb)) {
			LOGe("read log data failed.\n");
			return false;
		}

		if (test_bit_u32(LOG_RECORD_PADDING, &rec->flags)) {
			total_pb += log_pb;
			continue;
		}
		/* Confirm checksum. */
		csum = sector_array_checksum(
			sect_ary,
			idx_pb * pbs,
			log_lb * LOGICAL_BLOCK_SIZE, salt);
		if (csum != rec->checksum) {
			LOGe("log record[%d] checksum is invalid. %08x %08x\n",
				i, csum, rec->checksum);
			return false;
		}
		total_pb += log_pb;
	}
	ASSERT(total_pb == logh->total_io_size);
	return true;
}
Exemple #9
0
/**
 * Get two lsid values as a range from a walb ctl buffer.
 * RETURN:
 *   true in success, or false.
 */
bool get_lsid_range_from_ctl(
	u64 *lsid0, u64 *lsid1, const struct walb_ctl *ctl)
{
	if (sizeof(u64) * 2 > ctl->u2k.buf_size) {
		LOGe("Buffer is too small for u64 * 2.\n");
		return false;
	}
	*lsid0 = ((const u64 *)ctl->u2k.kbuf)[0];
	*lsid1 = ((const u64 *)ctl->u2k.kbuf)[1];
	if (!is_lsid_range_valid(*lsid0, *lsid1)) {
		LOGe("Specify valid lsid range.\n");
		return false;
	}
	return true;
}
Exemple #10
0
/**
 * Set device name.
 *
 * @wdev walb device.
 * @minor minor id. This will be used for default name.
 * @name Name to set.
 *   If null or empty string is given and
 *   the preset name is empty,
 *   default name will be set using minor id.
 *
 * @return 0 in success, or -1.
 */
int walb_set_name(struct walb_dev *wdev,
			unsigned int minor, const char *name)
{
	int name_len;
	char *dev_name;

	ASSERT(wdev);
	ASSERT(wdev->lsuper0);

	dev_name = get_super_sector(wdev->lsuper0)->name;

	if (name && *name) {
		memset(dev_name, 0, DISK_NAME_LEN);
		snprintf(dev_name, DISK_NAME_LEN, "%s", name);
	} else if (*dev_name == 0) {
		memset(dev_name, 0, DISK_NAME_LEN);
		snprintf(dev_name, DISK_NAME_LEN, "%u", minor / 2);
	}
	LOGd("minor %u dev_name: %s\n", minor, dev_name);

	name_len = strlen(dev_name);
	ASSERT(name_len < DISK_NAME_LEN);
	if (name_len > WALB_DEV_NAME_MAX_LEN) {
		LOGe("Device name is too long: %s.\n", name);
		return -1;
	}
	return 0;
}
Exemple #11
0
static int __init test_init(void)
{
	LOGe("BUILD_DATE %s\n", BUILD_DATE);

	test_sizlist();
	return -1;
}
Exemple #12
0
bool Outfits::parseOutfitNode(xmlNodePtr p)
{
	if(xmlStrcmp(p->name, (const xmlChar*)"outfit"))
		return false;

	int32_t intValue;
	if(!readXMLInteger(p, "id", intValue))
	{
		LOGe("[Outfits::parseOutfitNode] Missing outfit id, skipping");
		return false;
	}

	Outfit newOutfit;
	newOutfit.outfitId = intValue;

	std::string name, strValue;
	if(readXMLString(p, "default", strValue))
		newOutfit.isDefault = booleanString(strValue);

	if(!readXMLString(p, "name", strValue))
	{
		std::stringstream ss;
		ss << "Outfit #" << newOutfit.outfitId;
		ss >> name;
	}
Exemple #13
0
/**
 * Create a logpack.
 *
 * @logh_sectdp pointer to sector data pointer
 *   for logpack header (will be set).
 * @logd_sect_aryp pointer to sector data array pointer
 *   for logpack data (will be set).
 * @pbs physical block size [byte].
 * @bufsize buffer size for log data [byte].
 *
 * RETURN:
 *    allocated logpack in success, or NULL.
 */
struct logpack *alloc_logpack(
	unsigned int pbs, unsigned int n_sectors)
{
	struct logpack *pack;

	ASSERT(is_valid_pbs(pbs));
	ASSERT(0 < n_sectors);

	pack = (struct logpack *)malloc(sizeof(*pack));
	if (!pack) { goto error1; }
	memset(pack, 0, sizeof(*pack));

	/* Buffer for logpack header. */
	pack->sectd = sector_alloc(pbs);
	if (!pack->sectd) { goto error1; }
	pack->header = get_logpack_header(pack->sectd);

	/* Buffer for logpack data. */
	pack->sectd_ary = sector_array_alloc(pbs, n_sectors);
	if (!pack->sectd_ary) { goto error1; }
	return pack;

error1:
	LOGe("Memory allocation failure.\n");
	free_logpack(pack);
	return NULL;
}
Exemple #14
0
/**
 * Resize disk.
 *
 * @gd disk.
 * @new_size new size [logical block].
 *
 * RETURN:
 *   true in success, or false.
 */
bool resize_disk(struct gendisk *gd, u64 new_size)
{
	struct block_device *bdev;
	u64 old_size;

	ASSERT(gd);

	old_size = get_capacity(gd);
	if (old_size == new_size) {
		return true;
	}
	set_capacity(gd, new_size);

	bdev = bdget_disk(gd, 0);
	if (!bdev) {
		LOGe("bdget_disk failed.\n");
		return false;
	}
	mutex_lock(&bdev->bd_mutex);
	if (old_size > new_size) {
		LOGn("Shrink disk should discard block cache.\n");
		check_disk_size_change(gd, bdev);
		/* This should be implemented in check_disk_size_change(). */
		bdev->bd_invalidated = 0;
	} else {
		i_size_write(bdev->bd_inode,
			(loff_t)new_size * LOGICAL_BLOCK_SIZE);
	}
	mutex_unlock(&bdev->bd_mutex);
	bdput(bdev);
	return true;
}
Exemple #15
0
void Connection::closeConnection() {
	LOGt("Connection::closeConnection()");

	boost::recursive_mutex::scoped_lock lock(m_connectionLock);

	if(m_connectionState != CONNECTION_STATE_REQUEST_CLOSE)
	{
		LOGe("[Connection::closeConnection] m_connectionState = " << m_connectionState);
		return;
	}

	if(m_protocol)
	{
		m_protocol->setConnection(Connection_ptr());
		m_protocol->releaseProtocol();
		m_protocol = nullptr;
	}

	m_connectionState = CONNECTION_STATE_CLOSING;
	if(!m_pendingWrite || m_writeError)
	{
		closeSocket();
		releaseConnection();
		m_connectionState = CONNECTION_STATE_CLOSED;
	}
}
Exemple #16
0
ERR_CODE State::writeToStorage(uint8_t type, uint8_t* payload, uint8_t length, bool persistent) {
	switch(type) {
	// uint32_t variables
	case STATE_RESET_COUNTER: {
		if (length == 2) {
			uint32_t value = ((uint32_t*) payload)[0];
			if (value == 0) {
				return set(type, payload, length);
			}
		} else {
			LOGe(FMT_WRONG_PAYLOAD_LENGTH, length);
			return ERR_WRONG_PAYLOAD_LENGTH;
		}
		break;
	}
	// variables with write disabled
	case STATE_SWITCH_STATE:
	case STATE_TEMPERATURE:
	case STATE_FACTORY_RESET:
	default:
		LOGw(FMT_STATE_NOT_FOUND, type);
	}

	return ERR_WRITE_DISABLED;
}
Exemple #17
0
static int __init test_init(void)
{
	dev_t dev;
	int err = 0;
	struct block_device *bdev;

	LOGe("BUILD_DATE %s\n", BUILD_DATE);

	if (path_) {
		bdev = blkdev_get_by_path(
			path_, FMODE_READ|FMODE_WRITE|FMODE_EXCL, lock_);
		if (IS_ERR(bdev)) {
			err = PTR_ERR(bdev);
			goto error0;
		}
		blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);
	}

	if (major_ != UINT_MAX && minor_ != UINT_MAX) {
		dev = MKDEV(major_, minor_);
		bdev = blkdev_get_by_dev(
			dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, lock_);
		if (IS_ERR(bdev)) {
			err = PTR_ERR(bdev);
			goto error0;
		}
		blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);
	}
	LOGn("succeeded.\n");
	return -1;

error0:
	LOGn("failed %d.\n", err);
	return -1;
}
Exemple #18
0
void TargetCallback::onTargetCombat(const CreatureP& creature, const CreatureP& target) const
{
	//"onTargetCombat"(cid, target)
	if(m_interface->reserveEnv())
	{
		ScriptEnviroment* env = m_interface->getEnv();
		if(!env->setCallbackId(m_scriptId, m_interface))
			return;

		uint32_t cid = 0;
		if(creature)
			cid = env->addThing(creature);

		m_interface->pushFunction(m_scriptId);
		lua_State* L = m_interface->getState();

		lua_pushnumber(L, cid);
		lua_pushnumber(L, env->addThing(target));

		int32_t size = lua_gettop(L);
		if(lua_pcall(L, 2, 0 /*nReturnValues*/, 0) != 0)
			LuaScriptInterface::error(nullptr, std::string(LuaScriptInterface::popString(L)));

		if((lua_gettop(L) + 2 /*nParams*/ + 1) != size)
			LuaScriptInterface::error(__FUNCTION__, "Stack size changed!");

		env->resetCallback();
		m_interface->releaseEnv();
	}
	else
	{
		LOGe("[TargetCallback::onTargetCombat] Call stack overflow.");
		return;
	}
}
Exemple #19
0
void Dispatcher::waitUntilStopped() {
	_mutex.lock();

	if (_state == State::STARTED) {
		LOGe("Cannot wait for dispatcher to stop because stopping wasn't requested.");
		assert(_state != State::STARTED);

		_mutex.unlock();
		return;
	}

	if (_thread.get_id() == std::this_thread::get_id()) {
		auto tasks = std::move(_tasks);
		_mutex.unlock();

		runTasks(tasks);
	}
	else {
		if (_thread.joinable()) {
			// TODO: race condition possible here?
			_mutex.unlock();
			_thread.join();
		}
		else {
			_mutex.unlock();
		}
	}
}
Exemple #20
0
/**
 * Helper function for tasks.
 *
 * @data any data.
 * @nr flag bit number.
 * @flags_p pointer to flags data.
 * @wq workqueue.
 * @task task.
 *
 * RETURN:
 *   pack_work if really enqueued, or NULL.
 */
struct pack_work* enqueue_task_if_necessary(
	void *data, int nr, unsigned long *flags_p,
	struct workqueue_struct *wq, void (*task)(struct work_struct *))
{
	struct pack_work *pwork = NULL;
	int ret;

	ASSERT(task);
	ASSERT(wq);

retry:
	if (!test_and_set_bit(nr, flags_p)) {
		pwork = create_pack_work(data, GFP_NOIO);
		if (!pwork) {
			LOGn("memory allocation failed.\n");
			clear_bit(nr, flags_p);
			schedule();
			goto retry;
		}
		LOG_("enqueue task for %d\n", nr);
		INIT_WORK(&pwork->work, task);
		ret = queue_work(wq, &pwork->work);
		if (!ret) {
			LOGe("work is already on the queue.\n");
		}
	}
	return pwork;
}
Exemple #21
0
void Storage::setUint32(uint32_t value, uint32_t& target) {
	if (value == INT_MAX) {
		LOGe("value %d too big, can only write max %d", value, INT_MAX-1);
	} else {
		target = value;
	}
}
Exemple #22
0
/**
 * Redo logpack.
 *
 * @fd file descriptor of data device (opened).
 * @logpack logpack header to be redo.
 * @buf logpack data.
 *   (data size: logh->total_io_size * physical_bs)
 *
 * RETURN:
 *  true in success, or false.
 */
bool redo_logpack(
	int fd,
	const struct walb_logpack_header* logh,
	const struct sector_data_array *sect_ary)
{
	int i, n_req;

	ASSERT(logh);
	ASSERT_SECTOR_DATA_ARRAY(sect_ary);
	n_req = logh->n_records;

	for (i = 0; i < n_req; i++) {
		unsigned int idx_lb, n_lb;
		u64 off_lb;
		const struct walb_log_record *rec = &logh->record[i];

		if (test_bit_u32(LOG_RECORD_PADDING, &rec->flags)) {
			continue;
		}
		off_lb = rec->offset;
		idx_lb = addr_lb(sect_ary->sector_size, rec->lsid_local - 1);
		n_lb = rec->io_size;
		if (test_bit_u32(LOG_RECORD_DISCARD, &rec->flags)) {
			/* If the data device supports discard request,
			   you must issue discard requests. */
			/* now editing */
			continue;
		}
		if (!sector_array_pwrite_lb(fd, off_lb, sect_ary, idx_lb, n_lb)) {
			LOGe("write sectors failed.\n");
			return false;
		}
	}
	return true;
}
Exemple #23
0
/**
 * Resize walb device.
 *
 * @wdev walb dev.
 * @ctl ioctl data.
 * RETURN:
 *   0 in success, or -EFAULT.
 */
static int ioctl_wdev_resize(struct walb_dev *wdev, struct walb_ctl *ctl)
{
	u64 ddev_size;
	u64 new_size;
	u64 old_size;

	LOGn("WALB_IOCTL_RESIZE.\n");
	ASSERT(ctl->command == WALB_IOCTL_RESIZE);

	old_size = get_capacity(wdev->gd);
	new_size = ctl->val_u64;
	ddev_size = wdev->ddev->bd_part->nr_sects;

	if (new_size == 0) {
		new_size = ddev_size;
	}
	if (new_size < old_size) {
		LOGe("Shrink size from %"PRIu64" to %"PRIu64" is not supported.\n",
			old_size, new_size);
		return -EFAULT;
	}
	if (new_size > ddev_size) {
		LOGe("new_size %"PRIu64" > data device capacity %"PRIu64".\n",
			new_size, ddev_size);
		return -EFAULT;
	}
	if (new_size == old_size) {
		LOGn("No need to resize.\n");
		return 0;
	}

	spin_lock(&wdev->size_lock);
	wdev->size = new_size;
	wdev->ddev_size = ddev_size;
	spin_unlock(&wdev->size_lock);

	if (!resize_disk(wdev->gd, new_size)) {
		return -EFAULT;
	}

	/* Sync super block for super->device_size */
	if (!walb_sync_super_block(wdev)) {
		LOGe("superblock sync failed.\n");
		return -EFAULT;
	}
	return 0;
}
Exemple #24
0
void Storage::setString(std::string value, char* target) {
	if (value.length() < MAX_STRING_SIZE) {
		memset(target, 0, MAX_STRING_SIZE);
		memcpy(target, value.c_str(), value.length());
	} else {
		LOGe("string too long!!");
	}
}
Exemple #25
0
bool Tracker::isTracking() {
	if (!_stack) {
		LOGe(STR_ERR_FORGOT_TO_ASSIGN_STACK);
		return false;
	}

	return _tracking && _stack->isScanning();
}
Exemple #26
0
double hzd_ln_eX_plus1(double X){
  double sum,prod,denom,LOGRdxX,eX,Z,index;
  int i,maxCalc;

  if(X>LnLim.oneMinRdx && X<LnLim.maxOneSig)
    return LOGe(ePOW(X)+ONE);

  if(X>=LnLim.absMax || X>=(LnLim.two-LnLim.absMin))
    return X;

  if(X<=LnLim.absMin)
    return ZERO;

  if(X>LnLim.absMin && X<LnLim.oneMinRdx) {
    eX = ePOW(X);
    sum = eX;
    prod = eX;
    denom = ONE;
    LOGRdxX = X/LnLim.fpRdx;
    maxCalc = (int) ((LOGRdxX-DBL_MANT_DIG)/LOGRdxX);
    for(i=2; i<=maxCalc; i++) {
      denom = denom+ONE;
      prod = -prod*eX;
      sum = sum+(prod/denom);
    }
    return sum;
  }

  Z = ONE/(Machn.two*ePOW(X)+ONE);
  prod = Machn.two*Z;
  sum = X+prod;
  LOGRdxX = LOGe(Z)/LnLim.fpRdx;
  maxCalc = (int) ((LOGRdxX-DBL_MANT_DIG)/(LOGRdxX*2));
  if(maxCalc<2)
    return sum;
  Z = Z*Z;
  index = ONE;
  for(i=2; i<=maxCalc; i++) {
    prod = prod*Z;
    index = index+ONE;
    denom = (Machn.two*index)-ONE;
    sum = sum+(prod/denom);
  }
  return sum;
}
Exemple #27
0
/**
 * Check logpack of the given lsid exists.
 *
 * @lsid lsid to check.
 *
 * @return Non-zero if valid, or 0.
 */
int walb_check_lsid_valid(struct walb_dev *wdev, u64 lsid)
{
	struct sector_data *sect;
	struct walb_logpack_header *logh;
	u64 off;

	ASSERT(wdev);

	sect = sector_alloc(wdev->physical_bs, GFP_NOIO);
	if (!sect) {
		LOGe("walb_check_lsid_valid: alloc sector failed.\n");
		goto error0;
	}
	ASSERT(is_same_size_sector(sect, wdev->lsuper0));
	logh = get_logpack_header(sect);

	spin_lock(&wdev->lsuper0_lock);
	off = get_offset_of_lsid_2(get_super_sector(wdev->lsuper0), lsid);
	spin_unlock(&wdev->lsuper0_lock);
	if (!sector_io(READ, wdev->ldev, off, sect)) {
		LOGe("walb_check_lsid_valid: read sector failed.\n");
		goto error1;
	}

	/* Check valid logpack header. */
	if (!is_valid_logpack_header_with_checksum(
			logh, wdev->physical_bs, wdev->log_checksum_salt)) {
		goto error1;
	}

	/* Check lsid. */
	if (logh->logpack_lsid != lsid) {
		goto error1;
	}

	sector_free(sect);
	return 1;

error1:
	sector_free(sect);
error0:
	return 0;
}
Exemple #28
0
bool Event::loadScript(const std::string& script, bool file)
{
	if(!m_interface || m_scriptId != 0)
	{
		LOGe("[Event::loadScript] m_interface == nullptr, scriptId = " << m_scriptId);
		return false;
	}

	bool result = false;
	if(!file)
	{
		std::string buffer = script, function = "function " + getScriptEventName();
		trimString(buffer);
		if(buffer.find(function) == std::string::npos)
		{
			std::stringstream scriptstream;
			scriptstream << function << "(" << getScriptEventParams() << ")" << std::endl << buffer << std::endl << "end";
			buffer = scriptstream.str();
		}

		result = m_interface->loadBuffer(buffer);
	}
	else
		result = m_interface->loadFile(script);

	if(!result)
	{
		LOGe("[Event::loadScript] Cannot load script (" << script << "): " << m_interface->getLastError());
		return false;
	}

	int32_t id = m_interface->getEvent(getScriptEventName());
	if(id == -1)
	{
		LOGe("[Event::loadScript] Event " << getScriptEventName() << " not found (" << script << ")");
		return false;
	}

	m_scripted = EVENT_SCRIPT_TRUE;
	m_scriptId = id;
	return true;
}
Exemple #29
0
bool Event::loadBuffer(const std::string& buffer)
{
	if(!m_interface || m_scriptData != "")
	{
		LOGe("[Event::loadScriptFile] m_interface == nullptr, scriptData != \"\"");
		return false;
	}

	m_scripted = EVENT_SCRIPT_BUFFER;
	m_scriptData = buffer;
	return true;
}
Exemple #30
0
bool CallBack::loadCallBack(LuaScriptInterface* _interface, std::string name)
{
	if(!_interface)
	{
		LOGe("[CallBack::loadCallBack] m_interface == nullptr");
		return false;
	}

	m_interface = _interface;
	int32_t id = m_interface->getEvent(name);
	if(id == -1)
	{
		LOGe("[CallBack::loadCallBack] Event " << name << " not found.");
		return false;
	}

	m_callbackName = name;
	m_scriptId = id;
	m_loaded = true;
	return true;
}