Example #1
0
void* upm_ims_init_str(const char* protocol, const char* params)
{
    fprintf(stderr,
            "String initialization - not implemented, using i2c bus 0, addr: 0x20: %s\n", __FILENAME__);
    return ims_init(0, 0x20);
}
Example #2
0
//---------------------------------------------------------------------
// itm_startup
//---------------------------------------------------------------------
int itm_startup(void)
{
	long retval, i;

	if (itm_mode) return 0;

	// 异步I/O驱动初始化
	retval = apr_poll_install(APDEVICE_AUTO);
	if (retval) {
		itm_log(ITML_BASE, "service starting failed: poll device error %d", retval);
		return -10 + retval;
	}

	// 内存节点管理器初始化
	imp_init(&itm_fds, sizeof(struct ITMD), NULL);
	imp_init(&itm_mem, itm_psize, NULL);

	// 初始化内存增长限制
	itm_mem.grow_limit = 4096;

	// 套接字初始化
	retval = itm_socket_create();
	if (retval) {
		itm_log(ITML_BASE, "service starting failed: listen error code=%d errno=%d", 
			retval, apr_errno());
		return -20 + retval;
	}
	retval = apr_poll_init(&itm_polld, 0x20000);
	if (retval) {
		itm_socket_release();
		itm_log(ITML_BASE, "service starting failed: poll init error %d", retval);
		return -30 + retval;
	}
	retval = apr_poll_add(itm_polld, itm_outer_sock4, APOLL_IN, &itmd_outer4);
	if (retval) {
		itm_socket_release();
		apr_poll_destroy(itm_polld);
		itm_polld = NULL;
		itm_log(ITML_BASE, "service starting failed: poll event error %d", retval);
		return -40 + retval;
	}
	retval = apr_poll_add(itm_polld, itm_inner_sock4, APOLL_IN, &itmd_inner4);
	if (retval) {
		itm_socket_release();
		apr_poll_destroy(itm_polld);
		itm_polld = NULL;
		itm_log(ITML_BASE, "service starting failed: poll event error %d", retval);
		return -50 + retval;
	}
	retval = apr_poll_add(itm_polld, itm_dgram_sock4, 0, &itmd_dgram4);
	if (retval) {
		itm_socket_release();
		apr_poll_destroy(itm_polld);
		itm_polld = NULL;
		itm_log(ITML_BASE, "service starting failed: poll event error %d", retval);
		return -60 + retval;
	}
	
	itm_mask(&itmd_dgram4, APOLL_IN, 0);

#ifdef AF_INET
	if (itm_outer_sock6 >= 0) {
		retval = apr_poll_add(itm_polld, itm_outer_sock6, APOLL_IN, &itmd_outer6);
		if (retval) {
			itm_socket_release();
			apr_poll_destroy(itm_polld);
			itm_polld = NULL;
			itm_log(ITML_BASE, "service starting failed: poll event error %d", retval);
			return -70 + retval;
		}
	}

	if (itm_inner_sock6 >= 0) {
		retval = apr_poll_add(itm_polld, itm_inner_sock6, APOLL_IN, &itmd_inner6);
		if (retval) {
			itm_socket_release();
			apr_poll_destroy(itm_polld);
			itm_polld = NULL;
			itm_log(ITML_BASE, "service starting failed: poll event error %d", retval);
			return -80 + retval;
		}
	}

	if (itm_dgram_sock6 >= 0) {
		retval = apr_poll_add(itm_polld, itm_dgram_sock6, 0, &itmd_dgram6);
		if (retval) {
			itm_socket_release();
			apr_poll_destroy(itm_polld);
			itm_polld = NULL;
			itm_log(ITML_BASE, "service starting failed: poll event error %d", retval);
			return -90 + retval;
		}

		itm_mask(&itmd_dgram6, APOLL_IN, 0);
	}
#endif

	idt_init(&itm_timeu, itm_outer_time, NULL);
	idt_init(&itm_timec, itm_inner_time, NULL);

	iv_init(&itm_hostv, NULL);
	iv_init(&itm_datav, NULL);
	if (itm_datamax < 0x100000) itm_datamax = 0x100000;
	itm_dsize(itm_datamax + 0x10000);
	itm_wchannel(32000, NULL);

	ims_init(&itm_dgramdat4, &itm_mem);
	ims_init(&itm_dgramdat6, &itm_mem);

	itm_state = 0;
	itm_outer_cnt = 0;
	itm_inner_cnt = 0;

	itm_wtime = 0;
	itm_stime = (int)time(NULL);
	itm_time_start = apr_timex() / 1000;
	itm_time_current = itm_time_start;
	itm_time_slap = itm_time_start + ITMD_TIME_CYCLE;

	itm_notice_slap = 0;
	itm_notice_cycle = -1;
	itm_notice_count = 0;

	itm_version = 0;
	itm_docsize = 0;
	itm_document[0] = 0;

	imp_init(&itm_msg_mem, 4096, NULL);
	ims_init(&itm_msg_n0, &itm_msg_mem);
	ims_init(&itm_msg_n1, &itm_msg_mem);
	apr_mutex_init(&itm_msg_lock);
	itm_msg_cnt0 = 0;
	itm_msg_cnt1 = 0;

	itm_wsize = 0;
	
	switch (itm_headmod)
	{
	case ITMH_WORDLSB:
	case ITMH_WORDMSB:
	case ITMH_EWORDLSB:
	case ITMH_EWORDMSB:
		itm_headlen = 12;
		itm_hdrsize = 2;
		break;
	case ITMH_DWORDLSB:
	case ITMH_DWORDMSB:
	case ITMH_EDWORDLSB:
	case ITMH_EDWORDMSB:
	case ITMH_DWORDMASK:
		itm_headlen = 14;
		itm_hdrsize = 4;
		break;
	case ITMH_BYTELSB:
	case ITMH_BYTEMSB:
	case ITMH_EBYTELSB:
	case ITMH_EBYTEMSB:
		itm_headlen = 11;
		itm_hdrsize = 1;
		break;
	case ITMH_RAWDATA:
		itm_headlen = 14;
		itm_hdrsize = 4;
		break;
	case ITMH_LINESPLIT:
		itm_headlen = 14;
		itm_hdrsize = 4;
		break;
	default:
		itm_headmod = ITMH_WORDLSB;
		itm_headlen = 12;
		itm_hdrsize = 2;
		break;
	}
	
	if (itm_headmod < ITMH_EWORDLSB) {
		itm_headint = itm_headmod;
		itm_headinc = 0;
		itm_headmsk = 0;
	}	
	else if (itm_headmod < ITMH_DWORDMASK) {
		itm_headint = itm_headmod - 6;
		itm_headinc = itm_hdrsize;
		itm_headmsk = 0;
	}
	else if (itm_headmod == ITMH_DWORDMASK) {
		itm_headint = ITMH_DWORDLSB;
		itm_headinc = 0;
		itm_headmsk = 1;
	}
	else if (itm_headmod == ITMH_RAWDATA) {
		itm_headint = ITMH_DWORDLSB;
		itm_headinc = 0;
		itm_headmsk = 0;
	}
	else if (itm_headmod == ITMH_LINESPLIT) {
		itm_headint = ITMH_DWORDLSB;
		itm_headinc = 0;
		itm_headmsk = 0;
	}
	else {
		itm_headint = ITMH_DWORDLSB;
		itm_headinc = 0;
		itm_headmsk = 0;
	}

	for (i = 0; i < 512; i++) {
		itm_book[i] = NULL;
		itm_booklen[i] = 0;
		iv_init(&itm_bookv[i], NULL);
	}

	itm_mode = 1;

	itm_stat_send = 0;
	itm_stat_recv = 0;
	itm_stat_discard = 0;

	if (itm_limit < itm_inner_blimit * 2) {
		itm_limit = itm_inner_blimit * 2;
	}

	if (itm_dhcp_base < 100) itm_dhcp_base = 100;
	if (itm_dhcp_high < itm_dhcp_base) itm_dhcp_high = itm_dhcp_base;

	itm_log(ITML_BASE, "Transmod %x.%d%d (%s, %s) started ....", 
		ITMV_VERSION >> 8, (ITMV_VERSION & 0xf0) >> 4, ITMV_VERSION & 0x0f, __DATE__, __TIME__);

	return 0;
}