Пример #1
0
void InterruptHandler::Run()
{
	StartTrace(InterruptHandler.Run);

	// the just wait for the signal to happen
	Trace("Thread: " << Thread::MyId());
	Trace("Pid: " << (long)coast::system::getpid());
	Trace("Server [" << (fServer ? (const char *)(fServer->fName) : "no-name") << "]");

	if ( fServer ) {
		fServer->WritePIDFile(coast::system::getpid());
	}

	sigset_t set;
	int isignal;
	// setup the signal set that catches control-c
	sigemptyset(&set);
	sigaddset(&set, SIGINT);
	sigaddset(&set, SIGTERM);
	sigaddset(&set, SIGHUP);

handlesignal:
	SetWorking();
	Trace("calling sigwait");
	sigwait(&set, &isignal);
	SetReady();

	Trace("got signal: " << (long)isignal);
	if (fServer) {
		String sigName;
		sigName << (long)isignal;
		if ( isignal == SIGHUP ) {
			SYSINFO("caught SIGHUP, resetting server");
			int retVal = fServer->GlobalReinit();
			if ( retVal == 0 ) {
				// everything ok, wait on next signal
				goto handlesignal;
			}
			sigName = "SIGHUP";
			// shutdown if any mishap happens
			SYSERROR("GlobalReinit failed, shutting down...");
		} else if ( isignal == SIGINT ) {
			sigName = "SIGINT";
		} else if ( isignal == SIGTERM ) {
			sigName = "SIGTERM";
		} else {
			SYSINFO("caught unknown signal " << sigName << " ...ignoring!");
			goto handlesignal;
		}
		SYSINFO("caught " << sigName << " shutting down server");
		// prepare the server for shutdown
		// by causing him to leave the accept-loop
		fServer->PrepareShutdown();
	}
	// the job is done, just die...
}
void LeaderFollowerPool::RequestTermination() {
	SYSINFO("requesting Termination");
	StartTrace(LeaderFollowerPool.RequestTermination);
	{
		LockUnlockEntry me(fLFMutex);
		fPoolState = Thread::eTerminationRequested;
		fCurrentLeader = cBlockPromotion;
		fFollowersCondition.BroadCast();
	}
	SYSINFO("Termination request done");
}
Пример #3
0
void InputInit(void)
{
	int i;

	ZEROMEMORY(gInput, sizeof(sInput) * INPUT_WORK_NUM);

	gInput[INP_SYS].exec = TRUE;

	for(i = 0; i < INPUT_WORK_NUM; ++i)
	{
		gInput[i].m_x = MOUSE_MIN_POSITION;
		gInput[i].m_y = MOUSE_MIN_POSITION;
		gInput[i].x = MOUSE_MIN_POSITION;
		gInput[i].y = MOUSE_MIN_POSITION;
	}

	record = NULL;

	glutMouseFunc(mouseBtnCallback);
	glutMotionFunc(mousePosCallback);
	glutPassiveMotionFunc(mousePosCallback);

	glutKeyboardFunc(keyPushCallback);
	glutKeyboardUpFunc(keyPullCallback);
	glutSpecialFunc(keyExPushCallback);
	glutSpecialUpFunc(keyExPullCallback);

	SYSINFO(".... input initialize");
}
Пример #4
0
void _exit(int status) {
  kprintf("%s",std::string(LINEWIDTH, '=').c_str());
  kprint("\n");
  SYSINFO("service exited with status %i", status);
  default_exit();
  __builtin_unreachable();
}
Пример #5
0
//==============================================================
void MemInit(void)
//--------------------------------------------------------------
// メモリ管理の初期化
//--------------------------------------------------------------
// in:	なし
//--------------------------------------------------------------
// out:	なし
//==============================================================
{
    void *ptr;
    size_t size;
    int i;

    ZEROMEMORY(&gMem, sizeof(sMemInfo));		// 管理領域を初期化

    //----------------------------
    // ヒープ領域を作成して初期化
    //----------------------------
    ptr = OsCreateMemory(MEM_SIZE);

    // 空きエリアを全てグローバル領域として確保
    //------------------------------------------
    bsMemoryInit(&gMem.global_mem_hdr, ptr, MEM_SIZE, TRUE);

    //--------------------
    // MEM_APP 以外を確保
    //--------------------
    for(i = MEM_SYS; i < MEM_APP; ++i)
    {
        ptr = bsMalloc(&gMem.global_mem_hdr, memSizeTbl[i], NULL);
        ASSERT(ptr);
        bsMemoryInit(&gMem.mem_hdr[i], ptr, memSizeTbl[i], FALSE);
        gMem.mem_hdr[i].area = i;
    }

    //------------------------------------------------------
    // グローバル領域の残りをアプリケーション領域として確保
    //------------------------------------------------------
    size = bsMemoryGetFree(&gMem.global_mem_hdr);

    ptr = bsMalloc(&gMem.global_mem_hdr, size, NULL);
    ASSERT(ptr);
    bsMemoryInit(&gMem.mem_hdr[MEM_APP], ptr, size, FALSE);
    gMem.mem_hdr[MEM_APP].area = MEM_APP;

#ifdef DEBUG
    //--------------------
    // 開発時の領域の確保
    //--------------------
    ptr = OsCreateMemory(MEM_DEV_SIZE);
    bsMemoryInit(&gMem.mem_hdr[MEM_DEV], ptr, MEM_DEV_SIZE, TRUE);
    gMem.mem_hdr[MEM_DEV].area = MEM_DEV;
#endif

    SYSINFO(".... memory initialize");
}
Пример #6
0
// GlobalInit: installs ressources shared among all instances
int Application::GlobalInit(int argc, const char *argv[], const ROAnything config)
{
	StartTrace(Application.GlobalInit);
	int ret = DoGlobalInit(argc, argv, config);
	if ( ret == 0 ) {
		SYSINFO("Global init: succeeded");
	} else {
		SYSERROR("Global init: failed");
	}
	return (ret);
}
// DllMain() is the entry-point function for this DLL.
BOOL WINAPI DllMain(HANDLE hinstDLL,  // DLL module handle
					DWORD fdwReason,                    // reason called
					LPVOID lpvReserved)                 // reserved
{
	switch (fdwReason) {

			// The DLL is loading due to process
			// initialization or a call to LoadLibrary.
		case DLL_PROCESS_ATTACH:
			Init();
			if (THRKEYCREATE(fgThreadPtrKey, 0)) {
				SystemLog::Error("TlsAlloc of fgThreadPtrKey failed");
			}
			break;

			// The attached process creates a new thread.
		case DLL_THREAD_ATTACH:
			SystemLog::Info(String("mtfoundation: DLL_THREAD_ATTACH for [") << Thread::MyId() << "]");
			break;

			// The thread of the attached process terminates.
		case DLL_THREAD_DETACH: {
			Thread *pThr = (Thread *)TlsGetValue(fgThreadPtrKey);
			SystemLog::Info(String("DLL_THREAD_DETACH for [") << Thread::MyId() << "] &Thread:"  << (long)pThr );
			if ( pThr ) {
				// there seems to be a valid ThreadPtr, eg. it is a mtfoundation Thread
				RemoveThreadDetach(pThr);
				pThr->SetState(Thread::eTerminated);
			} else {
				SYSINFO("Thread* was NULL for [" << Thread::MyId() << "] ErrorMessage: [" << SystemLog::LastSysError() << "]");
			}
			break;
		}

		// The DLL unloading due to process termination or call to FreeLibrary.
		case DLL_PROCESS_DETACH:
			TerminateKilledThreads();
			THRKEYDELETE(fgThreadPtrKey);
			Finis();
			break;

		default:
			break;
	}

	return true;
	UNREFERENCED_PARAMETER(hinstDLL);
	UNREFERENCED_PARAMETER(lpvReserved);
}
Пример #8
0
void InputFin(void)
{
	glutMouseFunc(NULL);
	glutMotionFunc(NULL);
	glutPassiveMotionFunc(NULL);

	glutKeyboardFunc(NULL);
	glutKeyboardUpFunc(NULL);
	glutSpecialFunc(NULL);
	glutSpecialUpFunc(NULL);

	FreeWork(record);

	SYSINFO(".... input finish");
}
Пример #9
0
//==============================================================
void MemFin(void)
//--------------------------------------------------------------
// メモリ管理の終了
//--------------------------------------------------------------
// in:	なし
//--------------------------------------------------------------
// out:	なし
//==============================================================
{
    OsDestroyMemory(gMem.global_mem_hdr.top);
#ifdef DEBUG
    OsDestroyMemory(gMem.mem_hdr[MEM_DEV].top);
#endif

    SYSINFO(".... memory finish");
}
Пример #10
0
static int lxc_monitord_fifo_create(struct lxc_monitor *mon)
{
	struct flock lk;
	char fifo_path[PATH_MAX];
	int ret;

	ret = lxc_monitor_fifo_name(mon->lxcpath, fifo_path, sizeof(fifo_path), 1);
	if (ret < 0)
		return ret;

	ret = mknod(fifo_path, S_IFIFO | S_IRUSR | S_IWUSR, 0);
	if (ret < 0 && errno != EEXIST) {
		SYSINFO("Failed to mknod monitor fifo %s", fifo_path);
		return -1;
	}

	mon->fifofd = open(fifo_path, O_RDWR);
	if (mon->fifofd < 0) {
		SYSERROR("Failed to open monitor fifo %s", fifo_path);
		unlink(fifo_path);
		return -1;
	}

	lk.l_type = F_WRLCK;
	lk.l_whence = SEEK_SET;
	lk.l_start = 0;
	lk.l_len = 0;

	if (fcntl(mon->fifofd, F_SETLK, &lk) != 0) {
		/* another lxc-monitord is already running, don't start up */
		SYSDEBUG("lxc-monitord already running on lxcpath %s", mon->lxcpath);
		close(mon->fifofd);
		return -1;
	}

	return 0;
}
Пример #11
0
//==============================================================
static int objTask(sTaskBody *body, int msg, int lParam, int rParam)
//--------------------------------------------------------------
// タスク処理
//--------------------------------------------------------------
// in:	body           = ハンドル
//		msg            = メッセージ
//		lParam, rParam = 汎用パラメータ
//--------------------------------------------------------------
// out:	実行結果
//==============================================================
{
	int res = 0;

	switch(msg)
	{
		case MSG_CREATE:
		{
			param_hash = HashCreate("obj");
			obj_link = ObjLinkCreate(sizeof(sOBJ), OBJ_NUM, MEM_SYS, FALSE);

			SYSINFO(".... object initialize");
		}
		break;

		case MSG_KILL:
		{
			ObjDeleteParamAll();

			HashKill(param_hash);
			ObjLinkDestroy(obj_link);

			SYSINFO(".... object finish");
		}
		break;

		case MSG_PREPROC:
		{
			{
				sOBJ *obj;

				obj = ObjGetNext(NULL, OBJ_TYPE_ALL, NULL);
				while(obj)
				{
					obj->create = FALSE;
					obj = ObjGetNext(obj, OBJ_TYPE_ALL, NULL);
				}
			}
			ObjPostMsgAll(OBJ_TYPE_ALL, msg, FALSE, 0, 0);
		}
		break;

		case MSG_STEP:
		{
			ObjPostMsgAll(OBJ_TYPE_ALL, msg, FALSE, 0, 0);
			{
				sOBJ *obj;

				obj = ObjGetNext(NULL, OBJ_TYPE_ALL, NULL);
				while(obj)
				{
					sOBJ *next;

					next = ObjGetNext(obj, OBJ_TYPE_ALL, NULL);
					if(obj->kill_req)	objDelete(obj);
					obj = next;
				}
			}
		}
		break;

		case MSG_UPDATE:
		{
			ObjPostMsgAll(OBJ_TYPE_ALL, msg, FALSE, 0, 0);
		}
		break;

		case MSG_DRAW:
		{
			ObjPostMsgAll(OBJ_TYPE_ALL, msg, FALSE, 0, 0);
		}
		break;

		default:
		{
			ObjPostMsgAll(OBJ_TYPE_ALL, msg, FALSE, lParam, rParam);
		}
		break;
	}

	return res;
}