1// Copyright 2006-2008 the V8 project authors. All rights reserved.
2//
3// Tests of the TokenLock class from lock.h
4
5#include <pthread.h>
6#include <stdlib.h>
7#include <unistd.h>  // for usleep()
8
9#include "v8.h"
10
11#include "platform.h"
12#include "cctest.h"
13
14using namespace ::v8::internal;
15
16
17static void yield() {
18  UNIMPLEMENTED();
19}
20
21static const int kLockCounterLimit = 50;
22static int busy_lock_counter = 0;
23
24
25static void LoopIncrement(Mutex* mutex, int rem) {
26  while (true) {
27    int count = 0;
28    int last_count = -1;
29    do {
30      CHECK_EQ(0, mutex->Lock());
31      count = busy_lock_counter;
32      CHECK_EQ(0, mutex->Unlock());
33      yield();
34    } while (count % 2 == rem && count < kLockCounterLimit);
35    if (count >= kLockCounterLimit) break;
36    CHECK_EQ(0, mutex->Lock());
37    CHECK_EQ(count, busy_lock_counter);
38    CHECK(last_count == -1 || count == last_count + 1);
39    busy_lock_counter++;
40    last_count = count;
41    CHECK_EQ(0, mutex->Unlock());
42    yield();
43  }
44}
45
46
47static void* RunTestBusyLock(void* arg) {
48  LoopIncrement(static_cast<Mutex*>(arg), 0);
49  return 0;
50}
51
52
53// Runs two threads that repeatedly acquire the lock and conditionally
54// increment a variable.
55TEST(BusyLock) {
56  pthread_t other;
57  Mutex* mutex = OS::CreateMutex();
58  int thread_created = pthread_create(&other,
59                                      NULL,
60                                      &RunTestBusyLock,
61                                      mutex);
62  CHECK_EQ(0, thread_created);
63  LoopIncrement(mutex, 1);
64  pthread_join(other, NULL);
65  delete mutex;
66}
67
68
69TEST(VirtualMemory) {
70  VirtualMemory* vm = new VirtualMemory(1 * MB);
71  CHECK(vm->IsReserved());
72  void* block_addr = vm->address();
73  size_t block_size = 4 * KB;
74  CHECK(vm->Commit(block_addr, block_size, false));
75  // Check whether we can write to memory.
76  int* addr = static_cast<int*>(block_addr);
77  addr[KB-1] = 2;
78  CHECK(vm->Uncommit(block_addr, block_size));
79  delete vm;
80}
81