/* Store one log message of give size */ int LogMessage(uint8_t level, char* buf, uint32_t size){ if(size < LOG_BUFFER_SIZE - sizeof(mTail)){ uint32_t buffpos; uint64_t new_cursor, old_cursor; mTail tail; tail.msgsize = size; tail.tick = __tick; PLC_GetTime(&tail.time); /* We cannot increment both msg index and string pointer in a single atomic operation but we can detect having been interrupted. So we can try with atomic compare and swap in a loop until operation succeeds non interrupted */ do{ old_cursor = LogCursor[level]; buffpos = (uint32_t)old_cursor; tail.msgidx = (old_cursor >> 32); new_cursor = ((uint64_t)(tail.msgidx + 1)<<32) | (uint64_t)((buffpos + size + sizeof(mTail)) & LOG_BUFFER_MASK); }while(AtomicCompareExchange64( (long long*)&LogCursor[level], (long long)old_cursor, (long long)new_cursor)!=(long long)old_cursor); copy_to_log(level, buffpos, buf, size); copy_to_log(level, (buffpos + size) & LOG_BUFFER_MASK, &tail, sizeof(mTail)); return 1; /* Success */ }else{
static int run_service_command(struct child_process *cld) { argv_array_push(&cld->args, "."); cld->git_cmd = 1; cld->err = -1; if (start_command(cld)) return -1; close(0); close(1); copy_to_log(cld->err); return finish_command(cld); }
static int run_service_command(const char **argv) { struct child_process cld = CHILD_PROCESS_INIT; cld.argv = argv; cld.git_cmd = 1; cld.err = -1; if (start_command(&cld)) return -1; close(0); close(1); copy_to_log(cld.err); return finish_command(&cld); }
static int run_service_command(const char **argv) { struct child_process cld; memset(&cld, 0, sizeof(cld)); cld.argv = argv; cld.git_cmd = 1; cld.err = -1; if (start_command(&cld)) return -1; close(0); close(1); copy_to_log(cld.err); return finish_command(&cld); }