示例#1
0
static kcontext_t* new_hcontext(CTX ctx0)
{
	kcontext_t *ctx;
	static volatile size_t ctxid_counter = 0;
	if(ctx0 == NULL) {
		ctxid_counter = 0;
		ctx = (kcontext_t*)malloc(sizeof(kcontext_t));
		knh_bzero(ctx, sizeof(kcontext_t));
	}
	else {
		KNH_ASSERT_CTX0(ctx0);
		ctx = (kcontext_t*)KNH_MALLOC(ctx0, sizeof(kcontext_t));
		knh_bzero(ctx, sizeof(kcontext_t));
	}
	ctx->flag = 0;
	ctx->ctxid = ctxid_counter;
	ctxid_counter++;
//	ctx->freeObjectList = NULL;
//	ctx->freeMemoryList = NULL;
	ctx->parent = ctx;
	ctx->api2 = getapi2();
	{
		kuintptr_t i = 0, ch;
		kuint_t t = knh_rand();
		ch = t % 26;
		ctx->trace[i] = 'A' + ch;
		for(i = 1; i < 9; i++) {
			t = t / 36;
			if (t == 0) t = knh_rand();
			ch = t % 36;
			ctx->trace[i] = (ch < 10) ? '0' + ch : 'A' + (ch - 10);
		}
	}
	ctx->seq = 0;
	ctx->ctxobjNC = NULL;
	if(ctx0 == NULL) {
		const char *ptrace = knh_getenv(K_DEOS_TRACE);
		if(ptrace == NULL) {
			ptrace = "$(setenv " K_DEOS_TRACE ")";
		}
		KNH_NTRACE2(ctx, "konoha:newtrace", K_NOTICE, KNH_LDATA(
					LOG_s("parent", ptrace)
#if defined(K_USING_POSIX_)
					, LOG_u("ppid", getppid())
#endif /* !defined(K_USING_POSIX_) */
					));
	}
	else {
		KNH_NTRACE2(ctx, "konoha:newtrace", K_NOTICE, KNH_LDATA(LOG_s("parent", ctx0->trace), LOG_u("seq", ctx0->seq)));
	}
	return ctx;
}
示例#2
0
void knh_Bytes_unputc(knh_Bytes_t *ba, int c)
{
	if(BA_size(ba) >= c) {
		BA_size(ba) -= c;
		knh_bzero(ba->bu.ubuf + BA_size(ba), c);
	}
}
示例#3
0
void knh_Bytes_clear(knh_Bytes_t *ba, size_t pos)
{
	if(pos < BA_size(ba)) {
		knh_bzero(ba->bu.ubuf + pos, BA_size(ba) - pos);
		BA_size(ba) = pos;
	}
}
示例#4
0
void knh_Bytes_clear(knh_Bytes_t *ba, size_t pos)
{
	DBG_ASSERT(!knh_Bytes_isStatic(ba));
	if(pos < BA_size(ba)) {
		knh_bzero(ba->bu.ubuf + pos, BA_size(ba) - pos);
		BA_size(ba) = pos;
	}
}
示例#5
0
void knh_EventTBL_expand(CTX)
{
	size_t s = ctx->share->sizeEventTBL, max = ctx->share->capacityEventTBL * 2;
	knh_EventTBL_t *newt = (knh_EventTBL_t*)KCALLOC(SIZEOF_TEXPT(max));
	knh_bzero(newt, SIZEOF_TEXPT(max));
	knh_memcpy(newt, ctx->share->EventTBL, SIZEOF_TEXPT(s));
	((kshare_t*)ctx->share)->EventTBL = newt;
	((kshare_t*)ctx->share)->capacityEventTBL = max;
}
示例#6
0
文件: thread.c 项目: shidasan/konoha2
kmutex_t *knh_mutex_malloc(CTX)
{
	kmutex_t *m = (kmutex_t*)malloc(sizeof(kmutex_t));
	knh_bzero(m, sizeof(kmutex_t));
	if(knh_mutex_init(m) != 0) {
		KNH_NTRACE2(_ctx, "mutex_init", K_PERROR, KNH_LDATA(LOG_p("mutex", m)));
	}
	return m;
}
示例#7
0
文件: map.c 项目: shinpei/konoha-wand
static knh_map_t *hmap_init(CTX ctx, size_t init, const char *path, void *option)
{
	knh_hmap_t *hmap = (knh_hmap_t*)KNH_MALLOC(ctx, sizeof(knh_hmap_t));
	knh_bzero(hmap, sizeof(knh_hmap_t));
	if(init < K_HASH_INITSIZE) init = K_HASH_INITSIZE;
	hmap->hentry = (knh_hentry_t**)KNH_REALLOC(ctx, hmap->DBGNAME, NULL, 0, init, sizeof(knh_hentry_t*));
	hmap->hmax = init;
	hmap->size = 0;
	hmap->factor = KNH_HASH_FACTOR(hmap->hmax);
	return (knh_map_t*)hmap;
}
示例#8
0
void knh_Array_clear(CTX ctx, kArray *a, size_t n)
{
	if(!Array_isNDATA(a)) {
#ifdef K_USING_RCGC
		size_t i;
		for(i = n; i < a->size; i++) {
			KNH_FINALv(ctx, a->list[i]);
		}
#else
		knh_bzero(a->list + n, sizeof(void*) * (a->size - n));
#endif
	}
	a->size = n;
}
示例#9
0
static void knh_Bytes_expands(Ctx *ctx, knh_Bytes_t *ba, size_t newsize)
{
	if(ba->capacity == 0) {
		newsize = knh_good_size(newsize);
		ba->bu.ubuf = (knh_uchar_t*)KNH_MALLOC(ctx, newsize);
		ba->capacity = newsize;
	}
	else {
		knh_uchar_t *buf = ba->bu.ubuf;
		size_t capacity = ba->capacity;
		knh_uchar_t *newa = (knh_uchar_t*)KNH_MALLOC(ctx, newsize);
		knh_memcpy(newa, buf, capacity);
		knh_bzero(&newa[capacity], newsize - capacity);
		ba->bu.ubuf = newa;
		ba->capacity = newsize;
		KNH_FREE(ctx, buf, capacity);
		if(unlikely(ctx->bufa == ba)) {
			KNH_SYSLOG(ctx, LOG_INFO, "ExtendedContextBuffer", "*newsize=%ld, pointer=(%p => %p)", newsize, buf, newa);
			knh_Bytes_checkstack(ctx, buf, buf + ba->bu.len, newa);
		}
	}
}
示例#10
0
static kcontext_t* new_RootContext(void)
{
	kcontext_t *ctx = (kcontext_t*)new_hcontext(NULL);
	const knh_LoaderAPI_t *kapi = knh_getLoaderAPI();
	kshare_t *share = (kshare_t*)malloc(sizeof(kshare_t) + sizeof(kstatinfo_t) + sizeof(knh_ServiceSPI_t));
	ctx->share = share;
	knh_bzero(share, sizeof(kshare_t) + sizeof(kstatinfo_t) + sizeof(knh_ServiceSPI_t));
	share->syslock = knh_mutex_malloc(_ctx);
	ctx->stat = (kstatinfo_t*)((share+1));
	ctx->spi = (const knh_ServiceSPI_t*)(_ctx->stat + 1);
	initServiceSPI((knh_ServiceSPI_t*)ctx->spi);

	kmemshare_init(_ctx);
	share->ClassTBL = (kclass_t**)KMALLOC((CTX)ctx, sizeof(struct _kclass*)*(K_CLASSTABLE_INIT));
	knh_bzero(share->ClassTBL, sizeof(struct _kclass*)*(K_CLASSTABLE_INIT));
	share->sizeClassTBL = 0;
	share->capacityClassTBL  = K_CLASSTABLE_INIT;

	share->EventTBL = (knh_EventTBL_t*)KCALLOC(SIZEOF_TEXPT(K_EVENTTBL_INIT));
	knh_bzero((void*)share->EventTBL, SIZEOF_TEXPT(K_EVENTTBL_INIT));
	share->sizeEventTBL = 0;
	share->capacityEventTBL  = K_EVENTTBL_INIT;
	kshare_loadStructData(_ctx, kapi);

	KINITv(share->funcDictSet, new_DictSet0(_ctx, 0, 0, "funcDictSet"));
	KINITv(share->constPtrMap, new_PtrMap(_ctx, 0));
	KINITv(share->inferPtrMap, new_PtrMap(_ctx, 0));
	KINITv(share->xdataPtrMap, new_PtrMap(_ctx, 0));
	KINITv(share->constPools, new_Array0(_ctx, 0));
	knh_loadSystemTypeMapRule(_ctx);
	knh_ClassTBL_setConstPool(_ctx, ClassTBL(CLASS_Int));
	knh_ClassTBL_setConstPool(_ctx, ClassTBL(CLASS_Float));
#ifdef K_USING_STRINGPOOL
	knh_ClassTBL_setConstPool(_ctx, ClassTBL(CLASS_String));
#endif
	{
		kObject *p = (kObject*)new_hObject_(_ctx, ClassTBL(CLASS_Object));
		Object_setNullObject(p, 1);
		KINITv(share->constNull, p);
	}
	{
		kBoolean *o = new_H(Boolean);
		o->n.bvalue = 1;
		KINITv(share->constTrue, o);
		o = new_H(Boolean);
		o->n.bvalue = 0;
		KINITv(share->constFalse, o);
	}
	{
		static const kdim_t dimINIT = {};
		kArray *a = new_H(Array);
		(a)->size = 0;
		(a)->dim = &dimINIT;
		KINITv(share->emptyArray, a);
	}
	share->tString = (kString**)KCALLOC(SIZEOF_TSTRING);
	knh_bzero(share->tString, SIZEOF_TSTRING);
	knh_loadScriptSystemString(_ctx);
	KINITv(share->cwdPath, new_CurrentPath(_ctx));

	/* These are not shared, but needed to initialize System*/
	knh_stack_initexpand(_ctx, NULL, K_STACKSIZE);
	KINITv(share->packageDictMap, new_DictMap0(_ctx, 0, 1/*isCaseMap*/, "packageDictMap"));
	KINITv(share->secfileidtyDictMap, new_DictMap0(_ctx, 0, 1/*isCaseMap*/, "secfileidtyDictMap")); // added by Wakamori
	KINITv(share->classNameDictSet, new_DictSet0(_ctx, 128, 1/*isCaseMap*/, "classNameDictSet"));
	KINITv(share->eventDictSet, new_DictSet0(_ctx, 32, 1/*isCaseMap*/, "eventDictSet"));
	KINITv(share->streamDpiDictSet, new_DictSet0(_ctx, 0, 1/*isCaseMap*/, "streamDpiDictSet"));
	KINITv(share->mapDpiDictSet, new_DictSet0(_ctx, 0, 1/*isCaseMap*/, "mapDpiDictSet"));
	KINITv(share->convDpiDictSet, new_DictSet0(_ctx, 0, 1/*isCaseMap*/, "convDpiDictSet"));
	KINITv(share->rconvDpiDictSet, new_DictSet0(_ctx, 0, 1/*isCaseMap*/, "convDpiDictSet"));

	KINITv(share->enc,   new_T(knh_getSystemEncoding()));
	KINITv(share->in,    new_InputStreamStdIn(_ctx, share->enc));
	KINITv(share->out,   new_OutputStreamStdOut(_ctx, share->enc));
	KINITv(share->err,   new_OutputStreamStdErr(_ctx, share->enc));

	KINITv(share->props, new_DictMap0(_ctx, 20, 1/*isCaseMap*/, "System.props"));
	KINITv(share->symbolDictCaseSet, new_DictSet0(_ctx, K_TFIELD_SIZE + 10, 1/*isCaseMap*/, "System.symbolDictSet"));
	KINITv(share->symbolList, new_Array0(_ctx, K_TFIELD_SIZE + 10));
	KINITv(share->urnDictSet, new_DictSet0(_ctx, 0, 0/*isCaseMap*/, "System.urnDictSet"));
	KINITv(share->urns, new_Array0(_ctx, 1));
	KINITv(share->corelang, new_(Lang));
	knh_initSugarData(_ctx);
	KINITv(share->tokenDictSet, new_DictSet0(_ctx, (TT_MAX - STT_MAX), 0/*isCaseMap*/, "System.tokenDictSet"));
//	KINITv(share->URNAliasDictMap, new_DictMap0(_ctx, 0, 0/*isCaseMap*/, "System.URNAliasDictMap"));

	KINITv(share->rootks, new_(KonohaSpace));
	knh_loadScriptSystemData(_ctx, share->rootks, kapi);
	knh_System_initPath(_ctx);                 // require rootks
	KINITv(_ctx->script, new_(Script));     // require rootks
	KINITv(_ctx->gma, new_(GammaBuilder));         // require script
	knh_loadScriptSystemKonohaCode(_ctx);      // require gamma
	loadPolicy(_ctx); // added by Wakamori
	knh_loadScriptSystemMethod(_ctx, kapi);
	CommonContext_init(_ctx, ctx);
	knh_loadScriptTermData(_ctx);
	knh_loadScriptAliasTermData(_ctx);
	share->ctx0 = ctx;
	knh_GammaBuilder_init(_ctx);  // initalize gamma->gf, reported by uh
	knh_initBuiltInPackage(_ctx, knh_getLoaderAPI());

	/* CompilerAPI */
	KINITv(share->konoha_compiler, K_NULL);
	share->compilerAPI = NULL;

	share->contextCounter = 1;
	share->threadCounter = 1;
	share->stopCounter = 0;
	share->gcStopCounter = 0;
	KINITv(share->contextListNULL, new_Array0(_ctx, 4));
	kArray_add(ctx->share->contextListNULL, knh_toContext(_ctx));
#if defined(K_USING_THREAD)
	share->stop_cond = kthread_cond_init(_ctx);
	share->start_cond = kthread_cond_init(_ctx);
	share->close_cond = kthread_cond_init(_ctx);
#endif
	return ctx;
}
示例#11
0
文件: evidence.c 项目: utrhira/mpik
kbool_t knh_VirtualMachine_launch(CTX ctx, ksfp_t *sfp)
{
#ifdef K_USING_SIGNAL
#if defined(K_USING_MINGW_)
	knh_setsignal(ctx);
#else
	struct sigaction sa_orig[32];
	knh_bzero(sa_orig, sizeof(struct sigaction) * 32);
	knh_setsignal(ctx, sa_orig, 32);
#endif /* defined(K_USING_MINGW_) */
	kbool_t b = (knh_VirtualMachine_run(ctx, sfp, CODE_LAUNCH) == NULL);
	if(ctx->signal != 0) {
#if defined(K_USING_MINGW_)
		if(ctx->signal == SIGSEGV || ctx->signal == SIGILL) {
#else
		if(ctx->signal == SIGSEGV || ctx->signal == SIGBUS || ctx->signal == SIGILL) {
#endif /* defined(K_USING_MINGW_) */
			_Exit(EX_SOFTWARE);
		}
	}
#if defined(K_USING_MINGW_)
	knh_unsetsignal(ctx);
#else
	knh_unsetsignal(ctx, sa_orig, 32);
#endif /* defined(K_USING_MINGW_) */
	return b;
#else
	kbool_t b = (knh_VirtualMachine_run(ctx, sfp, CODE_LAUNCH) == NULL);
#endif
#if !defined(K_USING_MINGW_)
	if(ctx->signal == SIGKILL) {
		_Exit(EX_SOFTWARE);
	}
#endif /* !defined(K_USING_MINGW_) */
	return b;
}

/* ------------------------------------------------------------------------ */

#define OPT_EMPTY    0
#define OPT_NUMBER   1
#define OPT_STRING   2
#define OPT_(O)      O, (sizeof(O)-1)

typedef struct {
	const char *name;
	size_t len;
	int type;
	void (*setopt)(int, const char *);
} knh_optdata_t ;

static knh_optdata_t optdata[] = {
	{OPT_("-v"), OPT_NUMBER, opt_v},
	{OPT_("-a"), OPT_NUMBER, opt_a},
	{OPT_("-l"), OPT_STRING, opt_l},
	{OPT_("--enforce-security"), OPT_STRING, opt_enforce_security},
	{OPT_("--logcached"), OPT_STRING, opt_logcached},
	{OPT_("--verbose:gc"), OPT_EMPTY, opt_verbose_gc},
	{OPT_("--verbose:lang"), OPT_EMPTY, opt_verbose_lang},
	{OPT_("--verbose:pref"), OPT_EMPTY, opt_verbose_pref},
	{NULL, 0, OPT_EMPTY, NULL}, // END
};

static knh_optdata_t *knh_getoptdata(const char *name)
{
	knh_optdata_t *d = optdata;
	while(d->name != NULL) {
		if(knh_strncmp(d->name, name, d->len) == 0) {
			return d;
		}
		d++;
	}
	return NULL;
}