void deadlineListener_on_offered_deadline_missed(
    void* listener_data,
    DDS_DataWriter* writer,
    const struct DDS_OfferedDeadlineMissedStatus *status)
{
    deadline_contentfilter dummy;
    DDS_ReturnCode_t retcode = deadline_contentfilterDataWriter_get_key_value(
        deadline_contentfilterDataWriter_narrow(writer), &dummy, &status->last_instance_handle);
    if (retcode != DDS_RETCODE_OK) {
        printf("get_key_value error %d\n", retcode);
        return;
    }
        
    printf("Offered deadline missed on instance code = %d\n", dummy.code);
}
static int publisher_main(int domainId, int sample_count)
{
    DDS_DomainParticipant *participant = NULL;
    DDS_Publisher *publisher = NULL;
    DDS_Topic *topic = NULL;
    DDS_DataWriter *writer = NULL;
    deadline_contentfilterDataWriter *deadline_contentfilter_writer = NULL;
    DDS_ReturnCode_t retcode;
    const char *type_name = NULL;
    int count = 0;  
    struct DDS_Duration_t deadline_period = {1, 500000000}; /* 1.5sec */
    struct DDS_Duration_t send_period = {1,0};
    deadline_contentfilter *instance0 = NULL;
    deadline_contentfilter *instance1 = NULL;
    DDS_InstanceHandle_t handle0 = DDS_HANDLE_NIL;
    DDS_InstanceHandle_t handle1 = DDS_HANDLE_NIL;
    /*struct DDS_DataWriterQos datawriter_qos = DDS_DataWriterQos_INITIALIZER;*/

    /* To customize participant QoS, use 
       the configuration file USER_QOS_PROFILES.xml */
    participant = DDS_DomainParticipantFactory_create_participant(
        DDS_TheParticipantFactory, domainId, &DDS_PARTICIPANT_QOS_DEFAULT,
        NULL /* listener */, DDS_STATUS_MASK_NONE);
    if (participant == NULL) {
        printf("create_participant error\n");
        publisher_shutdown(participant);
        return -1;
    }

    /* To customize publisher QoS, use 
       the configuration file USER_QOS_PROFILES.xml */
    publisher = DDS_DomainParticipant_create_publisher(
        participant, &DDS_PUBLISHER_QOS_DEFAULT, NULL /* listener */,
        DDS_STATUS_MASK_NONE);
    if (publisher == NULL) {
        printf("create_publisher error\n");
        publisher_shutdown(participant);
        return -1;
    }

    /* Register type before creating topic */
    type_name = deadline_contentfilterTypeSupport_get_type_name();
    retcode = deadline_contentfilterTypeSupport_register_type(
        participant, type_name);
    if (retcode != DDS_RETCODE_OK) {
        printf("register_type error %d\n", retcode);
        publisher_shutdown(participant);
        return -1;
    }

    /* To customize topic QoS, use 
       the configuration file USER_QOS_PROFILES.xml */
    topic = DDS_DomainParticipant_create_topic(
        participant, "Example deadline_contentfilter",
        type_name, &DDS_TOPIC_QOS_DEFAULT, NULL /* listener */,
        DDS_STATUS_MASK_NONE);
    if (topic == NULL) {
        printf("create_topic error\n");
        publisher_shutdown(participant);
        return -1;
    }



    /* To customize data writer QoS, use 
       the configuration file USER_QOS_PROFILES.xml */
    writer = DDS_Publisher_create_datawriter(
        publisher, topic,
        &DDS_DATAWRITER_QOS_DEFAULT, NULL /* listener */, DDS_STATUS_MASK_NONE);
    if (writer == NULL) {
        printf("create_datawriter error\n");
        publisher_shutdown(participant);
        return -1;
    }

    /* If you want to change the DataWriter's QoS programmatically rather than
     * using the XML file, you will need to add the following lines to your
     * code and comment out the create_datawriter call above.
     *
     * In this case, we set the deadline period to 1.5 seconds to trigger
     * a deadline if the DataWriter does not update often enough.
     */
    
    /* Start changes for Deadline */
/*    writer_listener.on_offered_deadline_missed =
        deadlineListener_on_offered_deadline_missed;

    retcode = DDS_Publisher_get_default_datawriter_qos(publisher,
                    &datawriter_qos);
    if (retcode != DDS_RETCODE_OK) {
        printf("get_default_datawriter_qos error\n");
        return -1;
    }

*/    /* Set deadline QoS */
/*    datawriter_qos.deadline.period = deadline_period;

    writer = DDS_Publisher_create_datawriter(
        publisher, topic,
        &datawriter_qos, &writer_listener, DDS_OFFERED_DEADLINE_MISSED_STATUS);
    if (writer == NULL) {
        printf("create_datawriter error\n");
        publisher_shutdown(participant);
        return -1;
    }
*/
    /* End changes for Deadline */

   
    deadline_contentfilter_writer =
            deadline_contentfilterDataWriter_narrow(writer);
    if (deadline_contentfilter_writer == NULL) {
        printf("DataWriter narrow error\n");
        publisher_shutdown(participant);
        return -1;
    }

    /* Start changes for Deadline */
    
    /* Create data sample for writing */
    instance0 =
            deadline_contentfilterTypeSupport_create_data_ex(DDS_BOOLEAN_TRUE);
    instance1 =
            deadline_contentfilterTypeSupport_create_data_ex(DDS_BOOLEAN_TRUE);
    if (instance0 == NULL || instance1 == NULL) {
        printf("deadlineTypeSupport_create_data error\n");
        publisher_shutdown(participant);
        return -1;
    }

    /* Set keys -- we specify 'code' as the key field in the .idl */
    instance0->code = 0;
    instance1->code = 1;

    /* For data type that has key, if the same instance is going to be
       written multiple times, initialize the key here
       and register the keyed instance prior to writing */

    handle0 = deadline_contentfilterDataWriter_register_instance(
            deadline_contentfilter_writer, instance0);
    handle1 = deadline_contentfilterDataWriter_register_instance(
            deadline_contentfilter_writer, instance1);

    instance0->x = instance0->y = instance1->x = instance1->y = 0;

    /* Main loop */
    for (count=0; (sample_count == 0) || (count < sample_count); ++count) {
        NDDS_Utility_sleep(&send_period);

        instance0->x++;
        instance0->y++;
        instance1->x++;
        instance1->y++;

        printf("Writing instance0, x = %d, y = %d\n", instance0->x,
                instance0->y);
        retcode = deadline_contentfilterDataWriter_write(
            deadline_contentfilter_writer, instance0, &handle0);
        if (retcode != DDS_RETCODE_OK) {
            printf("write error %d\n", retcode);
        }

        if (count < 15) {
            printf("Writing instance1, x = %d, y = %d\n", instance1->x,
                    instance1->y);
            retcode = deadline_contentfilterDataWriter_write(
                deadline_contentfilter_writer, instance1, &handle1);
            if (retcode != DDS_RETCODE_OK) {
                printf("write error %d\n", retcode);
            }
        } else if (count == 15) {
            printf("Stopping writes to instance1\n");
        }
    }

    retcode = deadline_contentfilterDataWriter_unregister_instance(
        deadline_contentfilter_writer, instance0, &handle0);
    if (retcode != DDS_RETCODE_OK) {
        printf("unregister instance error %d\n", retcode);
    }
    retcode = deadline_contentfilterDataWriter_unregister_instance(
        deadline_contentfilter_writer, instance1, &handle1);
    if (retcode != DDS_RETCODE_OK) {
        printf("unregister instance error %d\n", retcode);
    }

    /* Delete data sample */
    retcode = deadline_contentfilterTypeSupport_delete_data_ex(instance0,
            DDS_BOOLEAN_TRUE);
    if (retcode != DDS_RETCODE_OK) {
        printf("deadline_contentfilterTypeSupport_delete_data_ex error %d\n",
                retcode);
    }
    retcode = deadline_contentfilterTypeSupport_delete_data_ex(instance1,
            DDS_BOOLEAN_TRUE);
    if (retcode != DDS_RETCODE_OK) {
        printf("deadline_contentfilterTypeSupport_delete_data_ex error %d\n",
                retcode);
    }

    /* End changes for Deadline */
    /* Cleanup and delete delete all entities */         
    return publisher_shutdown(participant);
}