Пример #1
0
void brelse(buffer *buff) {

    debug(BUFFER_DL, "brelse(buff:%p) {\n", buff);

    // wait for semaphore to start
    while (!semWait(semid)) {
        // skip signal interruptions
        if (errno != EINTR) {
            perror("brelse, semWait");
            debug(2 + BUFFER_DL, "ERROR en brelse, semWait.");
            exit(1);
        }
    }

    // enqueue buffer at end of free list
    setfree(buff);

    // unlock buffer
    BS_CLR(buff->status, BS_LOCKED);

    // wakeup all procs waiting for any buffer to become free
    brelease(NULL);

    // wakeup all procs waiting for this buffer to become free
    brelease(buff);

    // free the semaphore
    if (!semSignal(semid)) {
        perror("brelse, semSignal");
        debug(2 + BUFFER_DL, "ERROR en brelse, semSignal.");
        exit(1);
    }

    debug(BUFFER_DL, "}\n");
}
Пример #2
0
const char *translate(const char *format, const void *userdata,
    const char *vars, variant args[])
{
    unsigned int i = 0;
    const char *ic = vars;
    char symbol[32];
    char *oc = symbol;
    opstack *stack = NULL;
    const char *rv;

    brelease();
    free_variables();

    assert(format);
    assert(*ic == 0 || isalnum(*ic));
    while (*ic) {
        *oc++ = *ic++;
        if (!isalnum(*ic)) {
            variant x = args[i++];
            *oc = '\0';
            oc = symbol;
            add_variable(strcpy(balloc(strlen(symbol) + 1), symbol), x);
            while (*ic && !isalnum(*ic))
                ++ic;
        }
    }

    if (format[0] == '"') {
        rv = parse(&stack, format, userdata);
    }
    else {
        rv = parse_string(&stack, format, userdata);
    }
    if (rv != NULL) {
        if (rv[0]) {
            log_error("residual data after parsing: %s\n", rv);
        }
        rv = (const char *)opop(&stack).v;
        free(stack->begin);
        free(stack);
    }
    return rv;
}
Пример #3
0
/*
*   块写函数,这个函数是对设备文件来说的,并不是普通文件
*   写入操作并不是直接将数据写入设备,而是写入内存高速缓冲
*   各参数意义如下:
*       dev-完整的设备号
*       pos-设备文件中的数据偏移位置,这个偏移位置对应相同的磁盘位置
*       buffer-要读入的数据缓冲区
*       count-要写入的字节个数
*   函数返回写入成功的字节数
*/
public int block_write(int dev,int *pos,char *buffer,int count)
{
    /*数据偏移对应到磁盘上的盘块号*/
    int block = *pos >> BLOCK_SIZE_BITS;
    /*偏移位置*/
    int offset = *pos & (BLOCK_SIZE - 1);
    /*在一块中可写入字节数*/
    int chars;
    /*写入的字节数*/
    int write = 0;
    /*由于实际上先向内存缓冲中写入,所以要有一个缓冲区指针*/
    struct_mem_buffer *mbuffer;
    /*指向当前写入位置*/
    char *p;
    
    /*现在开始写数据,方法是:
    *   顺序写入
    *   处理开始和结束时的不成块数据
    */
    
    /*条件:只要还有要写的数据*/
    while(count > 0)
    {
        /*算出在当前块要写入的字节数*/
        chars = BLOCK_SIZE - offset;
        /*如果在一块上要写入的字节数比总的字节数小,则要写入的字节数为总字节数
        *这种情况包括开始的不足一块数据和结束时的不足一块数据
        */
        if(chars > count)
        {
            chars = count;
        }
        /*获取指定设备和块号的缓冲块*/
        if(!(mbuffer = bread(dev,block)))
        {
            return write;
        }
        /*变量p指向要写入的位置*/
        p = offset + mbuffer->data;
        /*重置offset,因为在接下来的数据写入过程中,offset只是块的起始*/
        block ++;
        offset = 0;
        
        /*先更新变量的值,再写入*/
        *pos += chars;
        write += chars;
        count -= chars;
        
        /*开始写数据*/
        while(chars -- > 0)
        {
            *(p ++) = *(buffer ++);
        }
        
        mbuffer->dirty = TRUE;
        brelease(mbuffer);
    }
    
    /*返回写入字节的个数*/
    return write;
}