1 #include <barrelfish/barrelfish.h>
2 #include <octopus/octopus.h>
6 errval_t trigger_existing_and_watch(const char* query,
7 trigger_handler_fn event_handler, void* state,
8 octopus_trigger_id_t* tid)
13 char* record = NULL; // freed by cpu_change_event
15 octopus_trigger_t t = oct_mktrigger(0, octopus_BINDING_EVENT,
16 TRIGGER_ALWAYS, event_handler, state);
18 // Get current cores registered in system
19 struct octopus_thc_client_binding_t* rpc = oct_get_thc_client();
20 errval_t err = rpc->call_seq.get_names(rpc, query,
21 t, &output, tid, &error_code);
22 if (err_is_fail(err)) {
29 err = oct_parse_names(output, &names, &len);
30 if (err_is_fail(err)) {
34 for (size_t i=0; i < len; i++) {
35 KALUGA_DEBUG("get record for name:%s\n", names[i]);
36 err = oct_get(&record, names[i]);
38 switch (err_no(err)) {
40 event_handler(DIST_ON_SET, record, state);
43 case OCT_ERR_NO_RECORD:
44 assert(record == NULL);
48 DEBUG_ERR(err, "Unable to retrieve core record for %s", names[i]);
49 assert(record == NULL);
54 case OCT_ERR_NO_RECORD:
55 err = SYS_ERR_OK; // Overwrite (trigger is set)
59 // Do nothing (wait for trigger)
64 oct_free_names(names, len);