Example #1
0
File: asl_fd.c Project: aosm/syslog
static void
read_from_source(void *_source)
{
    dispatch_source_t source = (dispatch_source_t)_source;
    int descriptor = dispatch_source_get_handle(source);
    if (_read_redirect(descriptor, 0) == EOF)  dispatch_source_cancel(source);
}
Example #2
0
 static void cancelHandler(void* source)
 {
     EventSource* eventSource = static_cast<EventSource*>(source);
     
     mach_port_t machPort = dispatch_source_get_handle(eventSource->m_dispatchSource);
     
     switch (eventSource->m_eventType) {
     case MachPortDataAvailable:
         // Release our receive right.
         mach_port_mod_refs(mach_task_self(), machPort, MACH_PORT_RIGHT_RECEIVE, -1);
         break;
     case MachPortDeadNameNotification:
         // Release our send right.
         mach_port_deallocate(mach_task_self(), machPort);
         break;
     }
 }
Example #3
0
static void cancel_source(void *_source) {
    dispatch_source_t source = (dispatch_source_t)_source;
    int descriptor = dispatch_source_get_handle(source);
    asl_redirect_t *aslr = &redirect_descriptors[descriptor];

    /* Flush the buffer */
    _read_redirect(descriptor, 1);

    close(descriptor);

    asl_client_release(aslr->asl);
    asl_msg_release(aslr->msg);
    free(aslr->buf);

    memset(aslr, 0, sizeof(*aslr));
    dispatch_release(source);
    dispatch_group_leave(read_source_group);
}
Example #4
0
chime_object_t* file_on_read(chime_object_t* instance, chime_object_t* context, chime_object_t* function)
{
#ifdef PLATFORM_MAC_OS_X
    int               descriptor;
    dispatch_queue_t  queue;
    dispatch_source_t source;
    //chime_object_t*   data_object;
    
    queue       = execution_context_get_dispatch_queue(context);
    descriptor  = file_get_file_descriptor(instance, READWRITE_DESCRIPTOR);
    //data_object = 
    
    source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, descriptor, 0, queue);
    file_set_dispatch_source(instance, FILE_READ_DISPATCH_SOURCE, source);
    
    chime_object_retain(function);
    dispatch_source_set_event_handler(source, ^{
        int             fd;
        size_t          estimated_size;
        ssize_t         actual_size;
        char*           buffer;
        chime_object_t* tagged_data;
        
        fd             = dispatch_source_get_handle(source);
        estimated_size = dispatch_source_get_data(source) + 1;
        
        if (estimated_size <= 1)
        {
            // fprintf(stderr, "** read zero, cancelling read source\n");
            dispatch_source_cancel(source);
            return;
        }
        
        //fprintf(stderr, "** estimated: %ld\n", estimated);
        
        buffer = (char*)malloc(estimated_size);
        assert(buffer);
        
        actual_size = read(fd, buffer, estimated_size);
        tagged_data = chime_tag_encode_raw_block(buffer);
        
        chime_closure_invoke_2((chime_closure_t*)function, tagged_data, chime_integer_encode(actual_size));
    });