Reviewed By: akotulski Differential Revision: D4994125 fbshipit-source-id: 34ce0a8master
parent
6097c05d88
commit
1a141eddca
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017 - present Facebook, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the BSD style license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
*/
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
Boolean MyProcessFileData(char* buffer, ssize_t actual);
|
||||||
|
|
||||||
|
dispatch_source_t ProcessContentsOfFile(const char* filename) {
|
||||||
|
// Prepare the file for reading.
|
||||||
|
int fd = open("hi.txt", O_WRONLY | O_CREAT | O_TRUNC, 0600);
|
||||||
|
if (fd == -1)
|
||||||
|
return NULL;
|
||||||
|
fcntl(fd, F_SETFL, O_NONBLOCK); // Avoid blocking the read operation
|
||||||
|
|
||||||
|
dispatch_queue_t queue =
|
||||||
|
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
|
||||||
|
dispatch_source_t readSource =
|
||||||
|
dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, fd, 0, queue);
|
||||||
|
if (!readSource) {
|
||||||
|
close(fd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Install the event handler
|
||||||
|
dispatch_source_set_event_handler(readSource, ^{
|
||||||
|
size_t estimated = dispatch_source_get_data(readSource) + 1;
|
||||||
|
// Read the data into a text buffer.
|
||||||
|
char* buffer = (char*)malloc(estimated);
|
||||||
|
if (buffer) {
|
||||||
|
ssize_t actual = read(fd, buffer, (estimated));
|
||||||
|
Boolean done = MyProcessFileData(buffer, actual); // Process the data.
|
||||||
|
|
||||||
|
// Release the buffer when done.
|
||||||
|
// free(buffer); // Don't release the buffer, report memory leak.
|
||||||
|
|
||||||
|
// If there is no more data, cancel the source.
|
||||||
|
if (done)
|
||||||
|
dispatch_source_cancel(readSource);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Install the cancellation handler
|
||||||
|
dispatch_source_set_cancel_handler(readSource, ^{
|
||||||
|
close(fd);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Start reading the file.
|
||||||
|
dispatch_resume(readSource);
|
||||||
|
return readSource;
|
||||||
|
}
|
Loading…
Reference in new issue