static void *thread_producer(void *d) { (void)d; l4shmc_chunk_t p_one; l4shmc_signal_t s_one, s_done; l4shmc_area_t shmarea; l4_debugger_set_object_name(pthread_getl4cap(pthread_self()), "prod"); // attach this thread to the shm object CHK(l4shmc_attach("testshm", &shmarea)); // add a chunk CHK(l4shmc_add_chunk(&shmarea, "one", 1024, &p_one)); // add a signal CHK(l4shmc_add_signal(&shmarea, "prod", &s_one)); // connect chunk and signal CHK(l4shmc_connect_chunk_signal(&p_one, &s_one)); CHK(l4shmc_attach_signal_to(&shmarea, "done", pthread_getl4cap(pthread_self()), 10000, &s_done)); printf("PRODUCER: ready\n"); while (1) { while (l4shmc_chunk_try_to_take(&p_one)) printf("Uh, should not happen!\n"); //l4_thread_yield(); set_some_data(); memcpy(l4shmc_chunk_ptr(&p_one), some_data, sizeof(some_data)); CHK(l4shmc_chunk_ready_sig(&p_one, sizeof(some_data))); printf("PRODUCER: Sent data %s\n", some_data); CHK(l4shmc_wait_signal(&s_done)); l4_sleep(5000); } l4_sleep_forever(); return NULL; }
static void *thread_consume(void *d) { (void)d; l4shmc_area_t shmarea; l4shmc_chunk_t p_one; l4shmc_signal_t s_one, s_done; // attach to shared memory area CHK(l4shmc_attach("testshm", &shmarea)); // get chunk 'one' CHK(l4shmc_get_chunk(&shmarea, "one", &p_one)); // add a signal CHK(l4shmc_add_signal(&shmarea, "done", &s_done)); // attach signal to this thread CHK(l4shmc_attach_signal_to(&shmarea, "prod", pthread_l4_cap(pthread_self()), 10000, &s_one)); // connect chunk and signal CHK(l4shmc_connect_chunk_signal(&p_one, &s_one)); while (1) { CHK(l4shmc_wait_chunk(&p_one)); printf("CONSUMER: Received from chunk one: %s\n", (char *)l4shmc_chunk_ptr(&p_one)); memset(l4shmc_chunk_ptr(&p_one), 0, l4shmc_chunk_size(&p_one)); CHK(l4shmc_chunk_consumed(&p_one)); CHK(l4shmc_trigger(&s_done)); } return NULL; }