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); }
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; } }
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); }
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)); });