1
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* ***** BEGIN LICENSE BLOCK *****
3
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
5
* The contents of this file are subject to the Mozilla Public License Version
6
* 1.1 (the "License"); you may not use this file except in compliance with
7
* the License. You may obtain a copy of the License at
8
* http://www.mozilla.org/MPL/
10
* Software distributed under the License is distributed on an "AS IS" basis,
11
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12
* for the specific language governing rights and limitations under the
15
* The Original Code is the Netscape Portable Runtime (NSPR).
17
* The Initial Developer of the Original Code is
18
* Netscape Communications Corporation.
19
* Portions created by the Initial Developer are Copyright (C) 1998-2000
20
* the Initial Developer. All Rights Reserved.
24
* Alternatively, the contents of this file may be used under the terms of
25
* either the GNU General Public License Version 2 or later (the "GPL"), or
26
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27
* in which case the provisions of the GPL or the LGPL are applicable instead
28
* of those above. If you wish to allow use of your version of this file only
29
* under the terms of either the GPL or the LGPL, and not to allow others to
30
* use your version of this file under the terms of the MPL, indicate your
31
* decision by deleting the provisions above and replace them with the notice
32
* and other provisions required by the GPL or the LGPL. If you do not delete
33
* the provisions above, a recipient may use your version of this file under
34
* the terms of any one of the MPL, the GPL or the LGPL.
36
* ***** END LICENSE BLOCK ***** */
2
/* This Source Code Form is subject to the terms of the Mozilla Public
3
* License, v. 2.0. If a copy of the MPL was not distributed with this
4
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
644
621
/* this initial code runs unsafe */
646
623
PR_ASSERT(NULL == names);
625
* In the initial round, both identity_cache.ident and
626
* identity_cache.length are 0, so (identity_cache.ident + 1) is greater
627
* than length. In later rounds, identity_cache.ident is always less
628
* than length, so (identity_cache.ident + 1) can be equal to but cannot
629
* be greater than length.
647
631
length = identity_cache.length;
648
if (length < (identity_cache.ident + 1))
632
if ((identity_cache.ident + 1) >= length)
650
634
length += ID_CACHE_INCREMENT;
651
635
names = (char**)PR_CALLOC(length * sizeof(char*));
660
644
/* now we get serious about thread safety */
661
645
PR_Lock(identity_cache.ml);
662
PR_ASSERT(identity_cache.ident <= identity_cache.length);
646
PR_ASSERT(identity_cache.length == 0 ||
647
identity_cache.ident < identity_cache.length);
663
648
identity = identity_cache.ident + 1;
664
if (identity > identity_cache.length) /* there's no room */
649
if (identity >= identity_cache.length) /* there's no room */
666
651
/* we have to do something - hopefully it's already done */
667
if ((NULL != names) && (length >= identity))
652
if ((NULL != names) && (identity < length))
669
654
/* what we did is still okay */
688
672
identity_cache.name[identity] = name;
690
674
identity_cache.ident = identity;
691
PR_ASSERT(identity_cache.ident <= identity_cache.length);
675
PR_ASSERT(identity_cache.ident < identity_cache.length);
692
676
PR_Unlock(identity_cache.ml);
694
678
if (NULL != old) PR_DELETE(old);