| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "mojo/system/local_data_pipe.h" | 5 #include "mojo/system/local_data_pipe.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 EXPECT_EQ(MOJO_RESULT_OK, | 199 EXPECT_EQ(MOJO_RESULT_OK, |
| 200 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 200 DataPipe::ValidateCreateOptions(&options, &validated_options)); |
| 201 | 201 |
| 202 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 202 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 203 Waiter waiter; | 203 Waiter waiter; |
| 204 uint32_t context = 0; | 204 uint32_t context = 0; |
| 205 | 205 |
| 206 // Never readable. | 206 // Never readable. |
| 207 waiter.Init(); | 207 waiter.Init(); |
| 208 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 208 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 209 dp->ProducerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 12)); | 209 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12)); |
| 210 | 210 |
| 211 // Already writable. | 211 // Already writable. |
| 212 waiter.Init(); | 212 waiter.Init(); |
| 213 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 213 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 214 dp->ProducerAddWaiter(&waiter, MOJO_WAIT_FLAG_WRITABLE, 34)); | 214 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 34)); |
| 215 | 215 |
| 216 // Write two elements. | 216 // Write two elements. |
| 217 int32_t elements[2] = { 123, 456 }; | 217 int32_t elements[2] = { 123, 456 }; |
| 218 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 218 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
| 219 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(elements, &num_bytes, true)); | 219 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(elements, &num_bytes, true)); |
| 220 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); | 220 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); |
| 221 | 221 |
| 222 // Adding a waiter should now succeed. | 222 // Adding a waiter should now succeed. |
| 223 waiter.Init(); | 223 waiter.Init(); |
| 224 EXPECT_EQ(MOJO_RESULT_OK, | 224 EXPECT_EQ(MOJO_RESULT_OK, |
| 225 dp->ProducerAddWaiter(&waiter, MOJO_WAIT_FLAG_WRITABLE, 56)); | 225 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56)); |
| 226 // And it shouldn't be writable yet. | 226 // And it shouldn't be writable yet. |
| 227 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, NULL)); | 227 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, NULL)); |
| 228 dp->ProducerRemoveWaiter(&waiter); | 228 dp->ProducerRemoveWaiter(&waiter); |
| 229 | 229 |
| 230 // Do it again. | 230 // Do it again. |
| 231 waiter.Init(); | 231 waiter.Init(); |
| 232 EXPECT_EQ(MOJO_RESULT_OK, | 232 EXPECT_EQ(MOJO_RESULT_OK, |
| 233 dp->ProducerAddWaiter(&waiter, MOJO_WAIT_FLAG_WRITABLE, 78)); | 233 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 78)); |
| 234 | 234 |
| 235 // Read one element. | 235 // Read one element. |
| 236 elements[0] = -1; | 236 elements[0] = -1; |
| 237 elements[1] = -1; | 237 elements[1] = -1; |
| 238 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 238 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 239 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(elements, &num_bytes, true)); | 239 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(elements, &num_bytes, true)); |
| 240 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 240 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 241 EXPECT_EQ(123, elements[0]); | 241 EXPECT_EQ(123, elements[0]); |
| 242 EXPECT_EQ(-1, elements[1]); | 242 EXPECT_EQ(-1, elements[1]); |
| 243 | 243 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 255 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 255 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 256 | 256 |
| 257 static_cast<int32_t*>(buffer)[0] = 789; | 257 static_cast<int32_t*>(buffer)[0] = 789; |
| 258 EXPECT_EQ(MOJO_RESULT_OK, | 258 EXPECT_EQ(MOJO_RESULT_OK, |
| 259 dp->ProducerEndWriteData( | 259 dp->ProducerEndWriteData( |
| 260 static_cast<uint32_t>(1u * sizeof(elements[0])))); | 260 static_cast<uint32_t>(1u * sizeof(elements[0])))); |
| 261 | 261 |
| 262 // Add a waiter. | 262 // Add a waiter. |
| 263 waiter.Init(); | 263 waiter.Init(); |
| 264 EXPECT_EQ(MOJO_RESULT_OK, | 264 EXPECT_EQ(MOJO_RESULT_OK, |
| 265 dp->ProducerAddWaiter(&waiter, MOJO_WAIT_FLAG_WRITABLE, 90)); | 265 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 90)); |
| 266 | 266 |
| 267 // Read one element, using a two-phase read. | 267 // Read one element, using a two-phase read. |
| 268 const void* read_buffer = NULL; | 268 const void* read_buffer = NULL; |
| 269 num_bytes = 0u; | 269 num_bytes = 0u; |
| 270 EXPECT_EQ(MOJO_RESULT_OK, | 270 EXPECT_EQ(MOJO_RESULT_OK, |
| 271 dp->ConsumerBeginReadData(&read_buffer, &num_bytes, false)); | 271 dp->ConsumerBeginReadData(&read_buffer, &num_bytes, false)); |
| 272 EXPECT_TRUE(read_buffer != NULL); | 272 EXPECT_TRUE(read_buffer != NULL); |
| 273 // Since we only read one element (after having written three in all), the | 273 // Since we only read one element (after having written three in all), the |
| 274 // two-phase read should only allow us to read one. This checks an | 274 // two-phase read should only allow us to read one. This checks an |
| 275 // implementation detail! | 275 // implementation detail! |
| (...skipping 10 matching lines...) Expand all Loading... |
| 286 | 286 |
| 287 // Write one element. | 287 // Write one element. |
| 288 elements[0] = 123; | 288 elements[0] = 123; |
| 289 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 289 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 290 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(elements, &num_bytes, false)); | 290 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(elements, &num_bytes, false)); |
| 291 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 291 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 292 | 292 |
| 293 // Add a waiter. | 293 // Add a waiter. |
| 294 waiter.Init(); | 294 waiter.Init(); |
| 295 EXPECT_EQ(MOJO_RESULT_OK, | 295 EXPECT_EQ(MOJO_RESULT_OK, |
| 296 dp->ProducerAddWaiter(&waiter, MOJO_WAIT_FLAG_WRITABLE, 12)); | 296 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12)); |
| 297 | 297 |
| 298 // Close the consumer. | 298 // Close the consumer. |
| 299 dp->ConsumerClose(); | 299 dp->ConsumerClose(); |
| 300 | 300 |
| 301 // It should now be never-writable. | 301 // It should now be never-writable. |
| 302 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context)); | 302 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context)); |
| 303 EXPECT_EQ(12u, context); | 303 EXPECT_EQ(12u, context); |
| 304 dp->ProducerRemoveWaiter(&waiter); | 304 dp->ProducerRemoveWaiter(&waiter); |
| 305 | 305 |
| 306 dp->ProducerClose(); | 306 dp->ProducerClose(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 318 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 318 DataPipe::ValidateCreateOptions(&options, &validated_options)); |
| 319 | 319 |
| 320 { | 320 { |
| 321 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 321 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 322 Waiter waiter; | 322 Waiter waiter; |
| 323 uint32_t context = 0; | 323 uint32_t context = 0; |
| 324 | 324 |
| 325 // Never writable. | 325 // Never writable. |
| 326 waiter.Init(); | 326 waiter.Init(); |
| 327 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 327 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 328 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_WRITABLE, 12)); | 328 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12)); |
| 329 | 329 |
| 330 // Not yet readable. | 330 // Not yet readable. |
| 331 waiter.Init(); | 331 waiter.Init(); |
| 332 EXPECT_EQ(MOJO_RESULT_OK, | 332 EXPECT_EQ(MOJO_RESULT_OK, |
| 333 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 34)); | 333 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34)); |
| 334 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, NULL)); | 334 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, NULL)); |
| 335 dp->ConsumerRemoveWaiter(&waiter); | 335 dp->ConsumerRemoveWaiter(&waiter); |
| 336 | 336 |
| 337 // Write two elements. | 337 // Write two elements. |
| 338 int32_t elements[2] = { 123, 456 }; | 338 int32_t elements[2] = { 123, 456 }; |
| 339 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 339 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
| 340 EXPECT_EQ(MOJO_RESULT_OK, | 340 EXPECT_EQ(MOJO_RESULT_OK, |
| 341 dp->ProducerWriteData(elements, &num_bytes, true)); | 341 dp->ProducerWriteData(elements, &num_bytes, true)); |
| 342 | 342 |
| 343 // Should already be readable. | 343 // Should already be readable. |
| 344 waiter.Init(); | 344 waiter.Init(); |
| 345 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 345 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 346 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 56)); | 346 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56)); |
| 347 | 347 |
| 348 // Discard one element. | 348 // Discard one element. |
| 349 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 349 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 350 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerDiscardData(&num_bytes, true)); | 350 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerDiscardData(&num_bytes, true)); |
| 351 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 351 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 352 | 352 |
| 353 // Should still be readable. | 353 // Should still be readable. |
| 354 waiter.Init(); | 354 waiter.Init(); |
| 355 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 355 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 356 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 78)); | 356 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78)); |
| 357 | 357 |
| 358 // Read one element. | 358 // Read one element. |
| 359 elements[0] = -1; | 359 elements[0] = -1; |
| 360 elements[1] = -1; | 360 elements[1] = -1; |
| 361 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 361 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 362 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(elements, &num_bytes, true)); | 362 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(elements, &num_bytes, true)); |
| 363 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 363 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 364 EXPECT_EQ(456, elements[0]); | 364 EXPECT_EQ(456, elements[0]); |
| 365 EXPECT_EQ(-1, elements[1]); | 365 EXPECT_EQ(-1, elements[1]); |
| 366 | 366 |
| 367 // Adding a waiter should now succeed. | 367 // Adding a waiter should now succeed. |
| 368 waiter.Init(); | 368 waiter.Init(); |
| 369 EXPECT_EQ(MOJO_RESULT_OK, | 369 EXPECT_EQ(MOJO_RESULT_OK, |
| 370 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 90)); | 370 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 90)); |
| 371 | 371 |
| 372 // Write one element. | 372 // Write one element. |
| 373 elements[0] = 789; | 373 elements[0] = 789; |
| 374 elements[1] = -1; | 374 elements[1] = -1; |
| 375 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 375 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 376 EXPECT_EQ(MOJO_RESULT_OK, | 376 EXPECT_EQ(MOJO_RESULT_OK, |
| 377 dp->ProducerWriteData(elements, &num_bytes, true)); | 377 dp->ProducerWriteData(elements, &num_bytes, true)); |
| 378 | 378 |
| 379 // Waiting should now succeed. | 379 // Waiting should now succeed. |
| 380 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); | 380 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); |
| 381 EXPECT_EQ(90u, context); | 381 EXPECT_EQ(90u, context); |
| 382 dp->ConsumerRemoveWaiter(&waiter); | 382 dp->ConsumerRemoveWaiter(&waiter); |
| 383 | 383 |
| 384 // Close the producer. | 384 // Close the producer. |
| 385 dp->ProducerClose(); | 385 dp->ProducerClose(); |
| 386 | 386 |
| 387 // Should still be readable. | 387 // Should still be readable. |
| 388 waiter.Init(); | 388 waiter.Init(); |
| 389 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 389 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 390 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 12)); | 390 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12)); |
| 391 | 391 |
| 392 // Read one element. | 392 // Read one element. |
| 393 elements[0] = -1; | 393 elements[0] = -1; |
| 394 elements[1] = -1; | 394 elements[1] = -1; |
| 395 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 395 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 396 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(elements, &num_bytes, true)); | 396 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(elements, &num_bytes, true)); |
| 397 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 397 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 398 EXPECT_EQ(789, elements[0]); | 398 EXPECT_EQ(789, elements[0]); |
| 399 EXPECT_EQ(-1, elements[1]); | 399 EXPECT_EQ(-1, elements[1]); |
| 400 | 400 |
| 401 // Should be never-readable. | 401 // Should be never-readable. |
| 402 waiter.Init(); | 402 waiter.Init(); |
| 403 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 403 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 404 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 34)); | 404 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34)); |
| 405 | 405 |
| 406 dp->ConsumerClose(); | 406 dp->ConsumerClose(); |
| 407 } | 407 } |
| 408 | 408 |
| 409 // Test with two-phase APIs and closing the producer with an active consumer | 409 // Test with two-phase APIs and closing the producer with an active consumer |
| 410 // waiter. | 410 // waiter. |
| 411 { | 411 { |
| 412 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 412 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 413 Waiter waiter; | 413 Waiter waiter; |
| 414 uint32_t context = 0; | 414 uint32_t context = 0; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 425 elements = static_cast<int32_t*>(buffer); | 425 elements = static_cast<int32_t*>(buffer); |
| 426 elements[0] = 123; | 426 elements[0] = 123; |
| 427 elements[1] = 456; | 427 elements[1] = 456; |
| 428 EXPECT_EQ(MOJO_RESULT_OK, | 428 EXPECT_EQ(MOJO_RESULT_OK, |
| 429 dp->ProducerEndWriteData( | 429 dp->ProducerEndWriteData( |
| 430 static_cast<uint32_t>(2u * sizeof(elements[0])))); | 430 static_cast<uint32_t>(2u * sizeof(elements[0])))); |
| 431 | 431 |
| 432 // Should already be readable. | 432 // Should already be readable. |
| 433 waiter.Init(); | 433 waiter.Init(); |
| 434 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 434 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 435 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 12)); | 435 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12)); |
| 436 | 436 |
| 437 // Read one element. | 437 // Read one element. |
| 438 // Request two in all-or-none mode, but only read one. | 438 // Request two in all-or-none mode, but only read one. |
| 439 const void* read_buffer = NULL; | 439 const void* read_buffer = NULL; |
| 440 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 440 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
| 441 EXPECT_EQ(MOJO_RESULT_OK, | 441 EXPECT_EQ(MOJO_RESULT_OK, |
| 442 dp->ConsumerBeginReadData(&read_buffer, &num_bytes, true)); | 442 dp->ConsumerBeginReadData(&read_buffer, &num_bytes, true)); |
| 443 EXPECT_TRUE(read_buffer != NULL); | 443 EXPECT_TRUE(read_buffer != NULL); |
| 444 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); | 444 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); |
| 445 const int32_t* read_elements = static_cast<const int32_t*>(read_buffer); | 445 const int32_t* read_elements = static_cast<const int32_t*>(read_buffer); |
| 446 EXPECT_EQ(123, read_elements[0]); | 446 EXPECT_EQ(123, read_elements[0]); |
| 447 EXPECT_EQ(MOJO_RESULT_OK, | 447 EXPECT_EQ(MOJO_RESULT_OK, |
| 448 dp->ConsumerEndReadData( | 448 dp->ConsumerEndReadData( |
| 449 static_cast<uint32_t>(1u * sizeof(elements[0])))); | 449 static_cast<uint32_t>(1u * sizeof(elements[0])))); |
| 450 | 450 |
| 451 // Should still be readable. | 451 // Should still be readable. |
| 452 waiter.Init(); | 452 waiter.Init(); |
| 453 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 453 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 454 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 34)); | 454 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34)); |
| 455 | 455 |
| 456 // Read one element. | 456 // Read one element. |
| 457 // Request three, but not in all-or-none mode. | 457 // Request three, but not in all-or-none mode. |
| 458 read_buffer = NULL; | 458 read_buffer = NULL; |
| 459 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); | 459 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); |
| 460 EXPECT_EQ(MOJO_RESULT_OK, | 460 EXPECT_EQ(MOJO_RESULT_OK, |
| 461 dp->ConsumerBeginReadData(&read_buffer, &num_bytes, false)); | 461 dp->ConsumerBeginReadData(&read_buffer, &num_bytes, false)); |
| 462 EXPECT_TRUE(read_buffer != NULL); | 462 EXPECT_TRUE(read_buffer != NULL); |
| 463 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 463 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 464 read_elements = static_cast<const int32_t*>(read_buffer); | 464 read_elements = static_cast<const int32_t*>(read_buffer); |
| 465 EXPECT_EQ(456, read_elements[0]); | 465 EXPECT_EQ(456, read_elements[0]); |
| 466 EXPECT_EQ(MOJO_RESULT_OK, | 466 EXPECT_EQ(MOJO_RESULT_OK, |
| 467 dp->ConsumerEndReadData( | 467 dp->ConsumerEndReadData( |
| 468 static_cast<uint32_t>(1u * sizeof(elements[0])))); | 468 static_cast<uint32_t>(1u * sizeof(elements[0])))); |
| 469 | 469 |
| 470 // Adding a waiter should now succeed. | 470 // Adding a waiter should now succeed. |
| 471 waiter.Init(); | 471 waiter.Init(); |
| 472 EXPECT_EQ(MOJO_RESULT_OK, | 472 EXPECT_EQ(MOJO_RESULT_OK, |
| 473 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 56)); | 473 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56)); |
| 474 | 474 |
| 475 // Close the producer. | 475 // Close the producer. |
| 476 dp->ProducerClose(); | 476 dp->ProducerClose(); |
| 477 | 477 |
| 478 // Should be never-readable. | 478 // Should be never-readable. |
| 479 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context)); | 479 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context)); |
| 480 EXPECT_EQ(56u, context); | 480 EXPECT_EQ(56u, context); |
| 481 dp->ConsumerRemoveWaiter(&waiter); | 481 dp->ConsumerRemoveWaiter(&waiter); |
| 482 | 482 |
| 483 dp->ConsumerClose(); | 483 dp->ConsumerClose(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 495 MojoCreateDataPipeOptions validated_options = { 0 }; | 495 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 496 EXPECT_EQ(MOJO_RESULT_OK, | 496 EXPECT_EQ(MOJO_RESULT_OK, |
| 497 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 497 DataPipe::ValidateCreateOptions(&options, &validated_options)); |
| 498 | 498 |
| 499 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 499 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 500 Waiter waiter; | 500 Waiter waiter; |
| 501 | 501 |
| 502 // It should be writable. | 502 // It should be writable. |
| 503 waiter.Init(); | 503 waiter.Init(); |
| 504 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 504 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 505 dp->ProducerAddWaiter(&waiter, MOJO_WAIT_FLAG_WRITABLE, 0)); | 505 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
| 506 | 506 |
| 507 uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); | 507 uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); |
| 508 void* write_ptr = NULL; | 508 void* write_ptr = NULL; |
| 509 EXPECT_EQ(MOJO_RESULT_OK, | 509 EXPECT_EQ(MOJO_RESULT_OK, |
| 510 dp->ProducerBeginWriteData(&write_ptr, &num_bytes, false)); | 510 dp->ProducerBeginWriteData(&write_ptr, &num_bytes, false)); |
| 511 EXPECT_TRUE(write_ptr != NULL); | 511 EXPECT_TRUE(write_ptr != NULL); |
| 512 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); | 512 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); |
| 513 | 513 |
| 514 // At this point, it shouldn't be writable. | 514 // At this point, it shouldn't be writable. |
| 515 waiter.Init(); | 515 waiter.Init(); |
| 516 EXPECT_EQ(MOJO_RESULT_OK, | 516 EXPECT_EQ(MOJO_RESULT_OK, |
| 517 dp->ProducerAddWaiter(&waiter, MOJO_WAIT_FLAG_WRITABLE, 1)); | 517 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 1)); |
| 518 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, NULL)); | 518 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, NULL)); |
| 519 dp->ProducerRemoveWaiter(&waiter); | 519 dp->ProducerRemoveWaiter(&waiter); |
| 520 | 520 |
| 521 // It shouldn't be readable yet either. | 521 // It shouldn't be readable yet either. |
| 522 waiter.Init(); | 522 waiter.Init(); |
| 523 EXPECT_EQ(MOJO_RESULT_OK, | 523 EXPECT_EQ(MOJO_RESULT_OK, |
| 524 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 2)); | 524 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 2)); |
| 525 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, NULL)); | 525 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, NULL)); |
| 526 dp->ConsumerRemoveWaiter(&waiter); | 526 dp->ConsumerRemoveWaiter(&waiter); |
| 527 | 527 |
| 528 static_cast<int32_t*>(write_ptr)[0] = 123; | 528 static_cast<int32_t*>(write_ptr)[0] = 123; |
| 529 EXPECT_EQ(MOJO_RESULT_OK, | 529 EXPECT_EQ(MOJO_RESULT_OK, |
| 530 dp->ProducerEndWriteData( | 530 dp->ProducerEndWriteData( |
| 531 static_cast<uint32_t>(1u * sizeof(int32_t)))); | 531 static_cast<uint32_t>(1u * sizeof(int32_t)))); |
| 532 | 532 |
| 533 // It should be writable again. | 533 // It should be writable again. |
| 534 waiter.Init(); | 534 waiter.Init(); |
| 535 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 535 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 536 dp->ProducerAddWaiter(&waiter, MOJO_WAIT_FLAG_WRITABLE, 3)); | 536 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3)); |
| 537 | 537 |
| 538 // And readable. | 538 // And readable. |
| 539 waiter.Init(); | 539 waiter.Init(); |
| 540 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 540 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 541 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 4)); | 541 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 4)); |
| 542 | 542 |
| 543 // Start another two-phase write and check that it's readable even in the | 543 // Start another two-phase write and check that it's readable even in the |
| 544 // middle of it. | 544 // middle of it. |
| 545 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); | 545 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); |
| 546 write_ptr = NULL; | 546 write_ptr = NULL; |
| 547 EXPECT_EQ(MOJO_RESULT_OK, | 547 EXPECT_EQ(MOJO_RESULT_OK, |
| 548 dp->ProducerBeginWriteData(&write_ptr, &num_bytes, false)); | 548 dp->ProducerBeginWriteData(&write_ptr, &num_bytes, false)); |
| 549 EXPECT_TRUE(write_ptr != NULL); | 549 EXPECT_TRUE(write_ptr != NULL); |
| 550 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); | 550 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); |
| 551 | 551 |
| 552 // It should be readable. | 552 // It should be readable. |
| 553 waiter.Init(); | 553 waiter.Init(); |
| 554 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 554 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 555 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 5)); | 555 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5)); |
| 556 | 556 |
| 557 // End the two-phase write without writing anything. | 557 // End the two-phase write without writing anything. |
| 558 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(0u)); | 558 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(0u)); |
| 559 | 559 |
| 560 // Start a two-phase read. | 560 // Start a two-phase read. |
| 561 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); | 561 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); |
| 562 const void* read_ptr = NULL; | 562 const void* read_ptr = NULL; |
| 563 EXPECT_EQ(MOJO_RESULT_OK, | 563 EXPECT_EQ(MOJO_RESULT_OK, |
| 564 dp->ConsumerBeginReadData(&read_ptr, &num_bytes, false)); | 564 dp->ConsumerBeginReadData(&read_ptr, &num_bytes, false)); |
| 565 EXPECT_TRUE(read_ptr != NULL); | 565 EXPECT_TRUE(read_ptr != NULL); |
| 566 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes); | 566 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes); |
| 567 | 567 |
| 568 // At this point, it should still be writable. | 568 // At this point, it should still be writable. |
| 569 waiter.Init(); | 569 waiter.Init(); |
| 570 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 570 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 571 dp->ProducerAddWaiter(&waiter, MOJO_WAIT_FLAG_WRITABLE, 6)); | 571 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6)); |
| 572 | 572 |
| 573 // But not readable. | 573 // But not readable. |
| 574 waiter.Init(); | 574 waiter.Init(); |
| 575 EXPECT_EQ(MOJO_RESULT_OK, | 575 EXPECT_EQ(MOJO_RESULT_OK, |
| 576 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 7)); | 576 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 7)); |
| 577 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, NULL)); | 577 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, NULL)); |
| 578 dp->ConsumerRemoveWaiter(&waiter); | 578 dp->ConsumerRemoveWaiter(&waiter); |
| 579 | 579 |
| 580 // End the two-phase read without reading anything. | 580 // End the two-phase read without reading anything. |
| 581 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(0u)); | 581 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(0u)); |
| 582 | 582 |
| 583 // It should be readable again. | 583 // It should be readable again. |
| 584 waiter.Init(); | 584 waiter.Init(); |
| 585 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 585 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 586 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 8)); | 586 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 8)); |
| 587 | 587 |
| 588 dp->ProducerClose(); | 588 dp->ProducerClose(); |
| 589 dp->ConsumerClose(); | 589 dp->ConsumerClose(); |
| 590 } | 590 } |
| 591 | 591 |
| 592 // Test that a "may discard" data pipe is writable even when it's full. | 592 // Test that a "may discard" data pipe is writable even when it's full. |
| 593 TEST(LocalDataPipeTest, BasicMayDiscardWaiting) { | 593 TEST(LocalDataPipeTest, BasicMayDiscardWaiting) { |
| 594 const MojoCreateDataPipeOptions options = { | 594 const MojoCreateDataPipeOptions options = { |
| 595 kSizeOfOptions, // |struct_size|. | 595 kSizeOfOptions, // |struct_size|. |
| 596 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. | 596 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. |
| 597 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 597 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 598 1 * sizeof(int32_t) // |capacity_num_bytes|. | 598 1 * sizeof(int32_t) // |capacity_num_bytes|. |
| 599 }; | 599 }; |
| 600 MojoCreateDataPipeOptions validated_options = { 0 }; | 600 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 601 EXPECT_EQ(MOJO_RESULT_OK, | 601 EXPECT_EQ(MOJO_RESULT_OK, |
| 602 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 602 DataPipe::ValidateCreateOptions(&options, &validated_options)); |
| 603 | 603 |
| 604 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 604 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 605 Waiter waiter; | 605 Waiter waiter; |
| 606 | 606 |
| 607 // Writable. | 607 // Writable. |
| 608 waiter.Init(); | 608 waiter.Init(); |
| 609 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 609 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 610 dp->ProducerAddWaiter(&waiter, MOJO_WAIT_FLAG_WRITABLE, 0)); | 610 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
| 611 | 611 |
| 612 // Not readable. | 612 // Not readable. |
| 613 waiter.Init(); | 613 waiter.Init(); |
| 614 EXPECT_EQ(MOJO_RESULT_OK, | 614 EXPECT_EQ(MOJO_RESULT_OK, |
| 615 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 1)); | 615 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 1)); |
| 616 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, NULL)); | 616 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, NULL)); |
| 617 dp->ConsumerRemoveWaiter(&waiter); | 617 dp->ConsumerRemoveWaiter(&waiter); |
| 618 | 618 |
| 619 uint32_t num_bytes = static_cast<uint32_t>(sizeof(int32_t)); | 619 uint32_t num_bytes = static_cast<uint32_t>(sizeof(int32_t)); |
| 620 int32_t element = 123; | 620 int32_t element = 123; |
| 621 EXPECT_EQ(MOJO_RESULT_OK, | 621 EXPECT_EQ(MOJO_RESULT_OK, |
| 622 dp->ProducerWriteData(&element, &num_bytes, false)); | 622 dp->ProducerWriteData(&element, &num_bytes, false)); |
| 623 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); | 623 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); |
| 624 | 624 |
| 625 // Still writable (even though it's full). | 625 // Still writable (even though it's full). |
| 626 waiter.Init(); | 626 waiter.Init(); |
| 627 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 627 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 628 dp->ProducerAddWaiter(&waiter, MOJO_WAIT_FLAG_WRITABLE, 2)); | 628 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 2)); |
| 629 | 629 |
| 630 // Now readable. | 630 // Now readable. |
| 631 waiter.Init(); | 631 waiter.Init(); |
| 632 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 632 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 633 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 3)); | 633 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 3)); |
| 634 | 634 |
| 635 // Overwrite that element. | 635 // Overwrite that element. |
| 636 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); | 636 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); |
| 637 element = 456; | 637 element = 456; |
| 638 EXPECT_EQ(MOJO_RESULT_OK, | 638 EXPECT_EQ(MOJO_RESULT_OK, |
| 639 dp->ProducerWriteData(&element, &num_bytes, false)); | 639 dp->ProducerWriteData(&element, &num_bytes, false)); |
| 640 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); | 640 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); |
| 641 | 641 |
| 642 // Still writable. | 642 // Still writable. |
| 643 waiter.Init(); | 643 waiter.Init(); |
| 644 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 644 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 645 dp->ProducerAddWaiter(&waiter, MOJO_WAIT_FLAG_WRITABLE, 4)); | 645 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 4)); |
| 646 | 646 |
| 647 // And still readable. | 647 // And still readable. |
| 648 waiter.Init(); | 648 waiter.Init(); |
| 649 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 649 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 650 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 5)); | 650 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5)); |
| 651 | 651 |
| 652 // Read that element. | 652 // Read that element. |
| 653 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); | 653 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); |
| 654 element = 0; | 654 element = 0; |
| 655 EXPECT_EQ(MOJO_RESULT_OK, | 655 EXPECT_EQ(MOJO_RESULT_OK, |
| 656 dp->ConsumerReadData(&element, &num_bytes, false)); | 656 dp->ConsumerReadData(&element, &num_bytes, false)); |
| 657 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); | 657 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); |
| 658 EXPECT_EQ(456, element); | 658 EXPECT_EQ(456, element); |
| 659 | 659 |
| 660 // Still writable. | 660 // Still writable. |
| 661 waiter.Init(); | 661 waiter.Init(); |
| 662 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 662 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 663 dp->ProducerAddWaiter(&waiter, MOJO_WAIT_FLAG_WRITABLE, 6)); | 663 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6)); |
| 664 | 664 |
| 665 // No longer readable. | 665 // No longer readable. |
| 666 waiter.Init(); | 666 waiter.Init(); |
| 667 EXPECT_EQ(MOJO_RESULT_OK, | 667 EXPECT_EQ(MOJO_RESULT_OK, |
| 668 dp->ConsumerAddWaiter(&waiter, MOJO_WAIT_FLAG_READABLE, 7)); | 668 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 7)); |
| 669 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, NULL)); | 669 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, NULL)); |
| 670 dp->ConsumerRemoveWaiter(&waiter); | 670 dp->ConsumerRemoveWaiter(&waiter); |
| 671 | 671 |
| 672 dp->ProducerClose(); | 672 dp->ProducerClose(); |
| 673 dp->ConsumerClose(); | 673 dp->ConsumerClose(); |
| 674 } | 674 } |
| 675 | 675 |
| 676 void Seq(int32_t start, size_t count, int32_t* out) { | 676 void Seq(int32_t start, size_t count, int32_t* out) { |
| 677 for (size_t i = 0; i < count; i++) | 677 for (size_t i = 0; i < count; i++) |
| 678 out[i] = start + static_cast<int32_t>(i); | 678 out[i] = start + static_cast<int32_t>(i); |
| (...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1635 // End reading. | 1635 // End reading. |
| 1636 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u)); | 1636 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u)); |
| 1637 | 1637 |
| 1638 dp->ProducerClose(); | 1638 dp->ProducerClose(); |
| 1639 dp->ConsumerClose(); | 1639 dp->ConsumerClose(); |
| 1640 } | 1640 } |
| 1641 | 1641 |
| 1642 } // namespace | 1642 } // namespace |
| 1643 } // namespace system | 1643 } // namespace system |
| 1644 } // namespace mojo | 1644 } // namespace mojo |
| OLD | NEW |