1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2006-2008 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Tests of the TokenLock class from lock.h
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <stdlib.h>
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "v8.h"
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "platform.h"
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "cctest.h"
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockusing namespace ::v8::internal;
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Simple test of locking logic
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockTEST(Simple) {
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Mutex* mutex = OS::CreateMutex();
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0, mutex->Lock());  // acquire the lock with the right token
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0, mutex->Unlock());  // can unlock with the right token
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  delete mutex;
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockTEST(MultiLock) {
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Mutex* mutex = OS::CreateMutex();
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0, mutex->Lock());
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0, mutex->Unlock());
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  delete mutex;
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockTEST(ShallowLock) {
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Mutex* mutex = OS::CreateMutex();
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0, mutex->Lock());
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0, mutex->Unlock());
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0, mutex->Lock());
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0, mutex->Unlock());
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  delete mutex;
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockTEST(SemaphoreTimeout) {
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool ok;
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Semaphore* sem = OS::CreateSemaphore(0);
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Semaphore not signalled - timeout.
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ok = sem->Wait(0);
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(!ok);
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ok = sem->Wait(100);
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(!ok);
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ok = sem->Wait(1000);
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(!ok);
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Semaphore signalled - no timeout.
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  sem->Signal();
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ok = sem->Wait(0);
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  sem->Signal();
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ok = sem->Wait(100);
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  sem->Signal();
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ok = sem->Wait(1000);
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(ok);
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
64