Skip to content
Snippets Groups Projects
Select Git revision
  • 491035ce1ceec310f98347654ea17cafa6ccb520
  • master default protected
  • android-7.1.2_r28_klist
  • oreo-mr1-iot-release
  • sdk-release
  • pie-cts-dev
  • pie-cts-release
  • pie-vts-release
  • nougat-iot-release
  • pie-gsi
  • pie-platform-release
  • pie-r2-release
  • pie-r2-s1-release
  • pie-release
  • pie-dev
  • oreo-m4-s4-release
  • o-mr1-iot-preview-8
  • oreo-m2-s2-release
  • oreo-m2-s1-release
  • oreo-m6-s2-release
  • oreo-m6-s3-release
  • android-o-mr1-iot-release-1.0.4
  • android-9.0.0_r8
  • android-9.0.0_r7
  • android-9.0.0_r6
  • android-9.0.0_r5
  • android-8.1.0_r46
  • android-8.1.0_r45
  • android-n-iot-release-smart-display-r2
  • android-vts-8.1_r5
  • android-cts-8.1_r8
  • android-cts-8.0_r12
  • android-cts-7.1_r20
  • android-cts-7.0_r24
  • android-cts-6.0_r31
  • android-o-mr1-iot-release-1.0.3
  • android-cts-9.0_r1
  • android-8.1.0_r43
  • android-8.1.0_r42
  • android-n-iot-release-smart-display
  • android-p-preview-5
41 results

backtrace.cpp

Blame
    • Christopher Ferris's avatar
      84ddb34a
      Fix debuggerd issues. · 84ddb34a
      Christopher Ferris authored
      - Fix a problem where a tid exits before the attach completes, and it
        causes debuggerd to self terminate.
      - Fix a problem where sibling tid dumps do not properly wait for the tid
        to get signalled.
      
      Bug: 17800180
      Bug: 12567315
      Change-Id: Ic3cd619cc2c72402f9a45f14abeed4721b50d64d
      84ddb34a
      History
      Fix debuggerd issues.
      Christopher Ferris authored
      - Fix a problem where a tid exits before the attach completes, and it
        causes debuggerd to self terminate.
      - Fix a problem where sibling tid dumps do not properly wait for the tid
        to get signalled.
      
      Bug: 17800180
      Bug: 12567315
      Change-Id: Ic3cd619cc2c72402f9a45f14abeed4721b50d64d
    config_utils.c 6.79 KiB
    /*
     * Copyright (C) 2007 The Android Open Source Project
     *
     * 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.
     */
    
    #include <string.h>
    #include <ctype.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <unistd.h>
    
    #include <cutils/config_utils.h>
    #include <cutils/misc.h>
    
    cnode* config_node(const char *name, const char *value)
    {
        cnode *node;
    
        node = calloc(sizeof(cnode), 1);
        if(node) {
            node->name = name ? name : "";
            node->value = value ? value : "";
        }
    
        return node;
    }
    
    cnode* config_find(cnode *root, const char *name)
    {
        cnode *node, *match = NULL;
    
        /* we walk the whole list, as we need to return the last (newest) entry */
        for(node = root->first_child; node; node = node->next)
            if(!strcmp(node->name, name))
                match = node;
    
        return match;
    }
    
    static cnode* _config_create(cnode *root, const char *name)
    {
        cnode *node;
    
        node = config_node(name, NULL);
    
        if(root->last_child)
            root->last_child->next = node;
        else
            root->first_child = node;
    
        root->last_child = node;
    
        return node;
    }
    
    int config_bool(cnode *root, const char *name, int _default)
    {
        cnode *node;
            
        node = config_find(root, name);
        if(!node)
            return _default;
    
        switch(node->value[0]) {
        case 'y':
        case 'Y':
        case '1':
            return 1;
        default:
            return 0;
        }
    }
    
    const char* config_str(cnode *root, const char *name, const char *_default)
    {
        cnode *node;
    
        node = config_find(root, name);
        if(!node)
            return _default;
        return node->value;
    }
    
    void config_set(cnode *root, const char *name, const char *value)
    {
        cnode *node;
    
        node = config_find(root, name);
        if(node)
            node->value = value;
        else {
            node = _config_create(root, name);
            node->value = value;
        }
    }
    
    #define T_EOF 0
    #define T_TEXT 1
    #define T_DOT 2
    #define T_OBRACE 3
    #define T_CBRACE 4
    
    typedef struct
    {
        char *data;
        char *text;
        int len;
        char next;
    } cstate;
    
    static int _lex(cstate *cs, int value)
    {
        char c;
        char *s;
        char *data;
    
        data = cs->data;
    
        if(cs->next != 0) {
            c = cs->next;
            cs->next = 0;
            goto got_c;
        }
    
    restart:
        for(;;) {
            c = *data++;
        got_c:
            if(isspace(c))
                continue;
    
            switch(c) {
            case 0:
                return T_EOF;
    
            case '#':
                for(;;) {
                    switch(*data) {
                    case 0:
                        cs->data = data;
                        return T_EOF;
                    case '\n':
                        cs->data = data + 1;
                        goto restart;
                    default:
                        data++;
                    }
                }
                break;
                
            case '.':
                cs->data = data;
                return T_DOT;
    
            case '{':
                cs->data = data;
                return T_OBRACE;
    
            case '}':
                cs->data = data;
                return T_CBRACE;
    
            default:
                s = data - 1;
    
                if(value) {
                    for(;;) {
                        if(*data == 0) {
                            cs->data = data;
                            break;
                        }
                        if(*data == '\n') {
                            cs->data = data + 1;
                            *data-- = 0;
                            break;
                        }
                        data++;
                    }
    
                        /* strip trailing whitespace */
                    while(data > s){
                        if(!isspace(*data)) break;
                        *data-- = 0;
                    }
    
                    goto got_text;                
                } else {
                    for(;;) {
                        if(isspace(*data)) {
                            *data = 0;
                            cs->data = data + 1;
                            goto got_text;
                        }
                        switch(*data) {
                        case 0:
                            cs->data = data;
                            goto got_text;
                        case '.':
                        case '{':
                        case '}':
                            cs->next = *data;
                            *data = 0;
                            cs->data = data + 1;
                            goto got_text;
                        default:
                            data++;
                        }
                    }
                }
            }
        }
    
    got_text:
        cs->text = s;
        return T_TEXT;
    }
    
    #if 0
    char *TOKENNAMES[] = { "EOF", "TEXT", "DOT", "OBRACE", "CBRACE" };
    
    static int lex(cstate *cs, int value)
    {
        int tok = _lex(cs, value);
        printf("TOKEN(%d) %s %s\n", value, TOKENNAMES[tok],
               tok == T_TEXT ? cs->text : "");
        return tok;
    }
    #else
    #define lex(cs,v) _lex(cs,v)
    #endif
    
    static int parse_expr(cstate *cs, cnode *node);
    
    static int parse_block(cstate *cs, cnode *node)
    {
        for(;;){
            switch(lex(cs, 0)){
            case T_TEXT:
                if(parse_expr(cs, node)) return -1;
                continue;
    
            case T_CBRACE:
                return 0;
    
            default:
                return -1;
            }
        }
    }
    
    static int parse_expr(cstate *cs, cnode *root)
    {
        cnode *node;
    
            /* last token was T_TEXT */
        node = config_find(root, cs->text);
        if(!node || *node->value)
            node = _config_create(root, cs->text);
    
        for(;;) {
            switch(lex(cs, 1)) {
            case T_DOT:
                if(lex(cs, 0) != T_TEXT)
                    return -1;
                node = _config_create(node, cs->text);
                continue;
    
            case T_TEXT:
                node->value = cs->text;
                return 0;
    
            case T_OBRACE:
                return parse_block(cs, node);
    
            default:
                return -1;
            }
        }
    }
    
    void config_load(cnode *root, char *data)
    {
        if(data != 0) {
            cstate cs;
            cs.data = data;
            cs.next = 0;
    
            for(;;) {
                switch(lex(&cs, 0)) {
                case T_TEXT:
                    if(parse_expr(&cs, root))
                        return;
                    break;
                default:
                    return;
                }
            }
        }
    }
    
    void config_load_file(cnode *root, const char *fn)
    {
        char *data;
        data = load_file(fn, 0);
        config_load(root, data);
    }
    
    void config_free(cnode *root)
    {
        cnode *cur = root->first_child;
    
        while (cur) {
            cnode *prev = cur;
            config_free(cur);
            cur = cur->next;
            free(prev);
        }
    }