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"); }
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; }
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; }
/** 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; }
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; }