blob: 2c69a6fffbb2e26e940a0e31561a41fcc85c2c00 [file] [log] [blame]
/*
* Copyright (c) 2009-2011 Apple Inc. All rights reserved.
*
* @APPLE_APACHE_LICENSE_HEADER_START@
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* @APPLE_APACHE_LICENSE_HEADER_END@
*/
#include <stdio.h>
#include <stdlib.h>
#include <dispatch/dispatch.h>
#ifdef __APPLE__
#include <TargetConditionals.h>
#endif
#include <bsdtests.h>
#include "dispatch_test.h"
#ifndef DISPATCHTEST_DATA
#if DISPATCH_API_VERSION >= 20100226 && DISPATCH_API_VERSION != 20101110
#define DISPATCHTEST_DATA 1
#endif
#endif
dispatch_group_t g;
#if DISPATCHTEST_DATA
static void
test_concat(void)
{
dispatch_group_enter(g);
dispatch_async(dispatch_get_main_queue(), ^{
char* buffer1 = "This is buffer1 ";
size_t size1 = 17;
char* buffer2 = "This is buffer2 ";
size_t size2 = 17;
__block bool buffer2_destroyed = false;
dispatch_data_t data1 = dispatch_data_create(buffer1, size1, NULL, NULL);
dispatch_data_t data2 = dispatch_data_create(buffer2, size2,
dispatch_get_main_queue(), ^{
buffer2_destroyed = true;
});
dispatch_data_t concat = dispatch_data_create_concat(data1, data2);
dispatch_release(data1);
dispatch_release(data2);
test_long("Data size of concatenated dispatch data",
(long)dispatch_data_get_size(concat), 34);
const void* contig;
size_t contig_size;
dispatch_data_t contig_data =
dispatch_data_create_map(concat, &contig, &contig_size);
dispatch_release(concat);
dispatch_release(contig_data);
test_long("Contiguous memory size", (long)contig_size, 34);
dispatch_async(dispatch_get_main_queue(), ^{
test_long("buffer2 destroyed", buffer2_destroyed, true);
dispatch_group_leave(g);
});
});
}
static void
test_cleanup(void) // <rdar://problem/9843440>
{
static char buffer4[16];
dispatch_group_enter(g);
dispatch_async(dispatch_get_main_queue(), ^{
void *buffer3 = malloc(1024);
dispatch_data_t data3 = dispatch_data_create(buffer3, 0,
dispatch_get_main_queue(), DISPATCH_DATA_DESTRUCTOR_FREE);
__block bool buffer4_destroyed = false;
dispatch_data_t data4 = dispatch_data_create(buffer4, 16,
dispatch_get_main_queue(), ^{
buffer4_destroyed = true;
});
dispatch_release(data3);
dispatch_release(data4);
dispatch_async(dispatch_get_main_queue(), ^{
test_long("buffer4 destroyed", buffer4_destroyed, true);
dispatch_group_leave(g);
});
});
}
#endif
int
main(void)
{
dispatch_test_start("Dispatch Data");
g = dispatch_group_create();
#if DISPATCHTEST_DATA
test_concat();
test_cleanup();
#endif
dispatch_group_notify(g, dispatch_get_main_queue(), ^{
dispatch_release(g);
test_stop();
});
dispatch_main();
}