static IrisArbiter* iris_coordination_arbiter_new (IrisReceiver *exclusive, IrisReceiver *concurrent, IrisReceiver *teardown) { IrisCoordinationArbiter *arbiter; g_return_val_if_fail (exclusive == NULL || IRIS_IS_RECEIVER (exclusive), NULL); g_return_val_if_fail (concurrent == NULL || IRIS_IS_RECEIVER (concurrent), NULL); g_return_val_if_fail (teardown == NULL || IRIS_IS_RECEIVER (teardown), NULL); g_return_val_if_fail (!exclusive || exclusive != concurrent, NULL); g_return_val_if_fail (!teardown || exclusive != teardown, NULL); g_return_val_if_fail (!concurrent || concurrent != teardown, NULL); g_return_val_if_fail (exclusive || concurrent || teardown, NULL); arbiter = g_object_new (IRIS_TYPE_COORDINATION_ARBITER, NULL); arbiter->priv->exclusive = exclusive ? g_object_ref (exclusive) : NULL; arbiter->priv->concurrent = concurrent ? g_object_ref (concurrent) : NULL; arbiter->priv->teardown = teardown ? g_object_ref (teardown) : NULL; ATTACH_ARBITER (exclusive, arbiter); ATTACH_ARBITER (concurrent, arbiter); ATTACH_ARBITER (teardown, arbiter); return IRIS_ARBITER (arbiter); }
static IrisArbiter* iris_coordination_arbiter_new (IrisReceiver *exclusive, IrisReceiver *concurrent, IrisReceiver *teardown) { IrisCoordinationArbiter *arbiter; g_return_val_if_fail (exclusive == NULL || IRIS_IS_RECEIVER (exclusive), NULL); g_return_val_if_fail (concurrent == NULL || IRIS_IS_RECEIVER (concurrent), NULL); g_return_val_if_fail (teardown == NULL || IRIS_IS_RECEIVER (teardown), NULL); g_return_val_if_fail (!exclusive || exclusive != concurrent, NULL); g_return_val_if_fail (!teardown || exclusive != teardown, NULL); g_return_val_if_fail (!concurrent || concurrent != teardown, NULL); g_return_val_if_fail (exclusive || concurrent || teardown, NULL); arbiter = g_object_new (IRIS_TYPE_COORDINATION_ARBITER, NULL); arbiter->priv->exclusive = exclusive ? g_object_ref (exclusive) : NULL; arbiter->priv->concurrent = concurrent ? g_object_ref (concurrent) : NULL; arbiter->priv->teardown = teardown ? g_object_ref (teardown) : NULL; ATTACH_ARBITER (exclusive, arbiter); ATTACH_ARBITER (concurrent, arbiter); ATTACH_ARBITER (teardown, arbiter); if (concurrent) arbiter->priv->flags = IRIS_COORD_CONCURRENT; else arbiter->priv->flags = IRIS_COORD_EXCLUSIVE; /* At least one receiver holds a reference on the arbiter so we can drop * the initial one. */ g_object_unref (arbiter); return IRIS_ARBITER (arbiter); }