예제 #1
0
파일: pm.c 프로젝트: Nakrez/zOS
void pm_setup(void)
{
    cr0_set(cr0_get() | CR0_PM);

    cs_set(KERNEL_CS);
    ds_set(KERNEL_DS);
    es_set(KERNEL_DS);
    fs_set(KERNEL_DS);
    gs_set(KERNEL_DS);
    ss_set(KERNEL_DS);

    console_message(T_OK, "Kernel now running in protected-mode");
}
예제 #2
0
int main()
{
	int rc = 0;

	struct tspec {
		pthread_t t;
		void *(*start) (void *);
	} thr[3] = {{0, &t1_start}, {0, &t2_start}, {0, &t3_start}};

	const size_t N_THREADS = sizeof(thr)/sizeof(thr[0]);
	size_t i = 0;
	void *ret = NULL;

	do {
		rc = ds_init();
		if (rc) break;

		rc = ds_set("MAIN_DONE", false, __func__);

		for (i = 0; i < N_THREADS; ++i) {
			(void) fprintf(stderr, "%s: starting t%ld\n", __func__, (long)i+1);
			rc = pthread_create(&thr[i].t, NULL, thr[i].start, NULL);
			if (rc) break;
		}

		const unsigned int nap = 10;
		(void) fprintf(stderr, "%s: taking a nap for %d seconds\n",
			__func__, nap);
		(void) sleep(nap);
		(void) fprintf(stderr, "%s: woke up\n", __func__);

		rc = ds_signal("MAIN_DONE", __func__);
		if (rc) break;
	} while(0);

	for(i = 0; i < N_THREADS; ++i) {
		if (thr[i].t) {
			(void) fprintf(stderr, "%s: joining t%ld .. ",
				__func__, (long)i+1);
			rc = pthread_join(thr[i].t, &ret);
			(void) fprintf(stderr, "%s\n", rc ? "FAILED" : "done");
		}
	}

	ds_destroy();

	(void) fprintf(stderr, "%s exiting [%d]\n", __func__, rc);
	return rc;
}
예제 #3
0
static void*
t2_start(void *ptr)
{
	long rc = 0;

	(void) fprintf(stderr, "== %s IN [%p]\n", __func__, ptr);
	do {
		rc = ds_set("BENNY", true, __func__);
		if (rc) break;

		rc = ds_wait("MAIN_DONE", __func__);
	} while(0);

	(void) fprintf(stderr, "== %s OUT [%ld]\n", __func__, rc);
	return (void*)rc;
}
예제 #4
0
파일: server.c 프로젝트: jmckaskill/adbus
/** Adds a new remote to the server
 *  \relates adbus_Server
 *
 *  \note This should be called after the remote has successfully
 *  authenticated.
 */
adbus_Remote* adbus_serv_connect(
        adbus_Server*           s,
        adbus_SendMsgCallback   send,
        void*                   data)
{
    adbus_Remote* r = NEW(adbus_Remote);
    r->server       = s;
    r->send         = send;
    r->data         = data;
    r->msg          = adbus_buf_new();
    r->dispatch     = adbus_buf_new();

    if (s->busRemote == NULL) {
        ds_set(&r->unique, "org.freedesktop.DBus");
    } else {
        ds_set_f(&r->unique, ":1.%u", s->nextRemote++);
    }

    dl_insert_after(Remote, &s->remotes, r, &r->hl);

    return r;
}
예제 #5
0
static void*
t3_start(void *ptr)
{
	long rc = 0;

	(void) fprintf(stderr, "== %s IN [%p]\n", __func__, ptr);
	do {
		rc = ds_set("RABBA", false, __func__);
		if (rc) break;

		(void) sleep(2);
		rc = ds_signal("ANNY", __func__);
		if (rc) break;

		(void) sleep(2);
		rc = ds_signal("BENNY", __func__);
		if (rc) break;

		rc = ds_wait("MAIN_DONE", __func__);
	} while(0);

	(void) fprintf(stderr, "== %s OUT [%ld]\n", __func__, rc);
	return (void*)rc;
}