提交 b4069b63 编写于 作者: S serb

8169966: Larger AWT menus

Reviewed-by: azvegint, prr, rhalade, mschoene
上级 432e2cb5
......@@ -61,29 +61,36 @@ INLINE void AwtCmdIDList::BuildFreeList(UINT first_index)
m_first_free = first_index; // head of the free list
}
jboolean AwtCmdIDList::isFreeIDAvailable() {
CriticalSection::Lock l(m_lock);
if (m_first_free == -1) { // out of free ids
if (m_capacity == ARRAY_MAXIMUM_SIZE) {
return JNI_FALSE;
}
}
return JNI_TRUE;
}
// Assign an id to the object. Recycle the first free entry from the
// head of the free list or allocate more memory for a new free list.
UINT AwtCmdIDList::Add(AwtObject* obj)
{
CriticalSection::Lock l(m_lock);
if (!isFreeIDAvailable()) {
throw std::bad_alloc(); // fatal error
}
if (m_first_free == -1) { // out of free ids
if (m_capacity == ARRAY_MAXIMUM_SIZE) {
// Really bad - out of ids. Since we hardly can have *so*
// many items simultaneously in existence, we have an id
// leak somewhere.
DASSERT(FALSE);
return 0;
}
else { // snarf a bigger arena
UINT old_capacity = m_capacity; // will be the first free entry
m_capacity += ARRAY_SIZE_INCREMENT;
if (m_capacity > ARRAY_MAXIMUM_SIZE)
m_capacity = ARRAY_MAXIMUM_SIZE;
m_array = (CmdIDEntry *)SAFE_SIZE_ARRAY_REALLOC(safe_Realloc, m_array,
m_capacity, sizeof(CmdIDEntry*));
BuildFreeList(old_capacity);
}
// snarf a bigger arena
UINT old_capacity = m_capacity; // will be the first free entry
m_capacity += ARRAY_SIZE_INCREMENT;
if (m_capacity > ARRAY_MAXIMUM_SIZE)
m_capacity = ARRAY_MAXIMUM_SIZE;
m_array = (CmdIDEntry *)SAFE_SIZE_ARRAY_REALLOC(safe_Realloc, m_array,
m_capacity, sizeof(CmdIDEntry*));
BuildFreeList(old_capacity);
}
DASSERT(m_first_free != -1);
......
/*
* Copyright (c) 1996, 1999, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -38,6 +38,7 @@ public:
UINT Add(AwtObject* obj);
AwtObject* Lookup(UINT id);
void Remove(UINT id);
jboolean isFreeIDAvailable();
CriticalSection m_lock;
......
/*
* Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -217,6 +217,10 @@ AwtMenuItem* AwtMenuItem::Create(jobject peer, jobject menuPeer)
if (env->EnsureLocalCapacity(1) < 0) {
return NULL;
}
if (!AwtToolkit::GetInstance().isFreeIDAvailable()) {
return NULL;
}
JNI_CHECK_NULL_RETURN_NULL(menuPeer, "peer");
/* target is a java.awt.MenuItem */
......
/*
* Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -1583,6 +1583,11 @@ void AwtToolkit::SyncCall(void (*ftn)(void)) {
}
}
jboolean AwtToolkit::isFreeIDAvailable()
{
return m_cmdIDs->isFreeIDAvailable();
}
UINT AwtToolkit::CreateCmdID(AwtObject* object)
{
return m_cmdIDs->Add(object);
......
/*
* Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -317,6 +317,8 @@ public:
BOOL PreProcessMouseMsg(class AwtComponent* p, MSG& msg);
BOOL PreProcessKeyMsg(class AwtComponent* p, MSG& msg);
/* Checks that an free ID exists. */
jboolean isFreeIDAvailable();
/* Create an ID which maps to an AwtObject pointer, such as a menu. */
UINT CreateCmdID(AwtObject* object);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册