otp_src_22.0.tar.gz


elang otp_src_22.0.tar.gzotp_src_22.0.tar.gzotp_src_22.0.tar.gzotp_src_22.0.tar.gz
资源截图
代码片段和文件信息
/*
 * %CopyrightBegin%
 *
 * Copyright Ericsson AB 1996-2018. All Rights Reserved.
 *
 * Licensed under the Apache License Version 2.0 (the “License“);
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing software
 * distributed under the License is distributed on an “AS IS“ BASIS
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * %CopyrightEnd%
 */

#ifdef HAVE_CONFIG_H
#  include “config.h“
#endif

#include “sys.h“
#include “erl_sys_driver.h“
#include “erl_vm.h“
#include “global.h“
#include “hash.h“
#include “atom.h“


#define ATOM_SIZE  3000

IndexTable erts_atom_table; /* The index table */

static erts_rwmtx_t atom_table_lock;

#define atom_read_lock() erts_rwmtx_rlock(&atom_table_lock)
#define atom_read_unlock() erts_rwmtx_runlock(&atom_table_lock)
#define atom_write_lock() erts_rwmtx_rwlock(&atom_table_lock)
#define atom_write_unlock() erts_rwmtx_rwunlock(&atom_table_lock)

#if 0
#define ERTS_ATOM_PUT_OPS_STAT
#endif
#ifdef ERTS_ATOM_PUT_OPS_STAT
static erts_atomic_t atom_put_ops;
#endif

/* Functions for allocating space for the ext of atoms. We do not
 * use malloc for each atom to prevent excessive memory fragmentation
 */

typedef struct _atom_text {
    struct _atom_text* next;
    unsigned char text[ATOM_TEXT_SIZE];
} AtomText;

static AtomText* text_list; /* List of text buffers */
static byte *atom_text_pos;
static byte *atom_text_end;
static Uint reserved_atom_space; /* Total amount of atom text space */
static Uint atom_space; /* Amount of atom text space used */

/*
 * Print info about atom tables
 */
void atom_info(fmtfn_t to void *to_arg)
{
    int lock = !ERTS_IS_CRASH_DUMPING;
    if (lock)
atom_read_lock();
    index_info(to to_arg &erts_atom_table);
#ifdef ERTS_ATOM_PUT_OPS_STAT
    erts_print(to to_arg “atom_put_ops: %ld

       erts_atomic_read_nob(&atom_put_ops));
#endif

    if (lock)
atom_read_unlock();
}

/*
 * Allocate an atom text segment.
 */
static void
more_atom_space(void)
{
    AtomText* ptr;

    ptr = (AtomText*) erts_alloc(ERTS_ALC_T_ATOM_TXT sizeof(AtomText));

    ptr->next = text_list;
    text_list = ptr;

    atom_text_pos = ptr->text;
    atom_text_end = atom_text_pos + ATOM_TEXT_SIZE;
    reserved_atom_space += sizeof(AtomText);

    VERBOSE(DEBUG_SYSTEM(“Allocated %d atom space
“ATOM_TEXT_SIZE));
}

/*
 * Allocate string space within an atom text segment.
 */

static byte*
atom_text_alloc(int bytes)
{
    byte *res;

    ASSERT(bytes <= MAX_ATOM_SZ_LIMIT);
    if (atom_text_pos + bytes >= atom_text_end) {
more_atom_space();
    }
    res = atom_text_pos;
    atom_text_pos += bytes;
    atom_space    += bytes;
    return res;
}

/*
 * Calculate atom hash value (using the hash

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)