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"); }
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; }
/* * 块写函数,这个函数是对设备文件来说的,并不是普通文件 * 写入操作并不是直接将数据写入设备,而是写入内存高速缓冲 * 各参数意义如下: * 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; }