Example #1
0
File: gs.c Project: eligo/mul
void _processFlush() {
	int i = 0;
	struct so_t* so = NULL;
	lock_lock(mGs->mQLock);
	i = mGs->mQn;
	lock_unlock(mGs->mQLock);
	for (;i >0; i--) {
		lock_lock(mGs->mQLock);
		if (!mGs->mWHead)
			so = NULL;
		else {
			so = mGs->mWHead;
			mGs->mWHead = so->next;
			if (!mGs->mWHead) {
				assert(so == mGs->mWTail);
				assert(mGs->mQn == 1);
				mGs->mWTail = NULL;
			}
			--mGs->mQn;
		}
		lock_unlock(mGs->mQLock);
		if (!so)
			break;

		_lockW(so);
		so->mInq = 0;
		_flush(so);
		_unlockW(so);
	}
}
Example #2
0
int logger_write(klogger_t* logger, int level, const char* format, ...) {
    char buffer[64] = {0};
    static const char* logger_level_name[] = { 0, "VERB", "INFO", "WARN", "ERRO", "FATA" };
    va_list va_ptr_file;
    va_list va_ptr_console;
    verify(logger);
    verify(format);
    if (logger->level > level) {
        /* 日志等级不足 */
        return error_ok;
    }
    va_start(va_ptr_file, format);
    va_start(va_ptr_console, format);
    time_get_string(buffer, sizeof(buffer));
    if (logger->mode & logger_mode_file) {
        /* 写入日志文件 */
        lock_lock(logger->lock);
        fprintf(logger->fd, "[%s][%s]", logger_level_name[level], buffer);
        vfprintf(logger->fd, format, va_ptr_file);
        fprintf(logger->fd, "\n");
        if (logger->mode & logger_mode_flush) {
            /* 立即写入 */
            fflush(logger->fd);
        }
        lock_unlock(logger->lock);
    }
    if (logger->mode & logger_mode_console) {
        /* 写入stderr */
        lock_lock(logger->lock);
        if (level == logger_level_verbose) {
            set_console_blue();
        } else if (level == logger_level_information) {
            set_console_white();
        } else if (level == logger_level_warning) {
            set_console_green();
        } else if (level == logger_level_error) {
            set_console_red();
        } else if (level == logger_level_fatal) {
            set_console_yellow();
        }
        fprintf(stderr, "[%s][%s]", logger_level_name[level], buffer);
        vfprintf(stderr, format, va_ptr_console);
        fprintf(stderr, "\n");
        if (logger->mode & logger_mode_flush) {
            /* 立即写入 */
            fflush(stderr);
        }
        lock_unlock(logger->lock);
    }
    set_console_white();
    va_end(va_ptr_file);
    va_end(va_ptr_console);
    return error_ok;
}
Example #3
0
bool nic_free(Packet* packet) {
	NIC* nic = nic_find_by_packet(packet);
	if(nic == NULL)
		return false;

	uint8_t* bitmap = (void*)nic + nic->pool.bitmap;
	uint32_t count = nic->pool.count;
	void* pool = (void*)nic + nic->pool.pool;

	uint32_t idx = ((uintptr_t)packet - (uintptr_t)pool) / NIC_CHUNK_SIZE;
	if(idx >= count)
		return false;

	uint8_t req = bitmap[idx];
	if(idx + req > count)
		return false;

	for(uint32_t i = idx + req - 1; i > idx; i--) {
		bitmap[i] = 0;
	}
	bitmap[idx] = 0;	// if idx is zero, it for loop will never end

	lock_lock(&nic->pool.lock);
	nic->pool.used -= req;
	lock_unlock(&nic->pool.lock);

	return true;
}
Example #4
0
File: server.c Project: seL4/camkes
/* Handle a DHCPDISCOVER message. */
static uint32_t discover(uint64_t hwaddr, uint32_t *siaddr) {
    lock_lock();

    /* Figure out a suitable IP address to offer them */
    uint32_t offer;
    do {
        offer = (my_ip & ~0xff) | (uint32_t)next_offer_octet;
        next_offer_octet++;
    } while ((offer & 0xff) == 0 || offer == my_ip || 
             offer == routing_table[0] || offer == routing_table[1] ||
             offer == routing_table[2] || offer == routing_table[3]);

    lock_unlock();

    /* Pass them our IP address so they can pass it back to us when requested
     * IP assignment. This thing is in the DHCP spec to allow for multiple DHCP
     * servers on the same network.
     */
    *siaddr = my_ip;
    
    char pretty_ip[STRLEN_IP];
    ip_to_string(offer, pretty_ip);
    dprintf("%s: Sending DHCPOFFER of IP %s\n", get_instance_name(), pretty_ip);

    return offer;
}
Example #5
0
int main(void)
{
  const int cpu = procnum();

  lock_lock(&lock);
  printf("Hello from processor %d\n", procnum());
  lock_unlock(&lock);

  set_irq_handler(irq_handler);
  enable_hw_irq(0);
  irq_enable();

  soclib_io_set(
                base(TIMER),
                procnum()*TIMER_SPAN+TIMER_PERIOD,
                period[cpu]);
  soclib_io_set(
                base(TIMER),
		procnum()*TIMER_SPAN+TIMER_MODE,
                TIMER_RUNNING|TIMER_IRQ_ENABLED);

  while (1)
    pause();
  return 0;
}
Example #6
0
enum nss_status internal_function
__nss_cdb_endent(struct nss_cdb *dbp) {
  lock_lock(lock);
  if (isopen(dbp))
    __nss_cdb_doendent(dbp);
  lock_unlock(lock);
  return NSS_STATUS_SUCCESS;
}
Example #7
0
int fileno(FILE *stream)
{
  int fd;
  lock_lock(&(stream->lock));
  fd = stream->fd;
  lock_unlock(&(stream->lock));
  return fd;
}
Example #8
0
File: gt.c Project: eligo/mul
void gt_add(uint32_t from, uint32_t ticks, uint32_t session) {
	struct ud_t *ud = (struct ud_t*)MALLOC(sizeof(*ud));
	ud->from = from;
	ud->session = session;
	lock_lock(gT->mLock);
	timer_add(gT->mTimer, ticks, ud, _cb, 1);
	lock_unlock(gT->mLock);
}
Example #9
0
int ferror(FILE *stream)
{
  int res;
  lock_lock(&(stream->lock));
  res = ((stream->flags & FILE_FLAG_ERROR) != 0);
  lock_unlock(&(stream->lock));
  return res;
}
Example #10
0
int feof(FILE *stream)
{
  int res;
  lock_lock(&(stream->lock));
  res = ((stream->flags & FILE_FLAG_EOF) != 0);
  lock_unlock(&(stream->lock));
  return res;
}
Example #11
0
off_t ftello(FILE *stream)
{
  off_t offset;
  lock_lock(&(stream->lock));
  offset = unsafely_get_stream_offset(stream);
  lock_unlock(&(stream->lock));  
  return offset;
}
Example #12
0
uint32_t window_get_seq_counter(Window* window) {
	uint32_t seq_counter;
	lock_lock(&window->seq_counter_lock);
	seq_counter = ++window->seq_counter;
	lock_unlock(&window->seq_counter_lock);

	return seq_counter;
}
Example #13
0
int logger_write(logger_t* logger, logger_level_e level, const char* format, ...) {
    char buffer[64] = {0};
    int  bytes = 0;
    static const char* logger_level_name[] = { 0, "VERB", "INFO", "WARN", "ERRO", "FATA" };
    va_list arg_ptr;
    assert(logger);
    assert(format);
    if (logger->level > level) {
        /* 日志等级不足 */
        return error_ok;
    }
    va_start(arg_ptr, format);
    time_get_string(buffer, sizeof(buffer));
    if (logger->mode & logger_mode_file) {
        /* 写入日志文件 */
        lock_lock(logger->lock);
        fprintf(logger->fd, "[%s][%s]", logger_level_name[level], buffer);
        bytes = vfprintf(logger->fd, format, arg_ptr);
        if (bytes <= 0) {
            lock_unlock(logger->lock);
            return error_logger_write;
        }
        fprintf(logger->fd, "\n");
        if (logger->mode & logger_mode_flush) {
            /* 立即写入 */
            fflush(logger->fd);
        }
        lock_unlock(logger->lock);
    }
    if (logger->mode & logger_mode_console) {
        /* 写入stderr */
        lock_lock(logger->lock);
        fprintf(stderr, "[%s][%s]", logger_level_name[level], buffer);
        vfprintf(stderr, format, arg_ptr);
        fprintf(stderr, "\n");
        if (logger->mode & logger_mode_flush) {
            /* 立即写入 */
            fflush(stderr);
        }
        lock_unlock(logger->lock);
    }
    va_end(arg_ptr);  
    return error_ok;
}
Example #14
0
File: gq.c Project: eligo/mul
void gq_worker_end(struct mq_t *mq) {
	mq_lock(mq);
	assert(mq->mIsG);
	if (!mq_empty(mq)) {
		lock_lock(mGq->mLock);
		gq_push_mq_raw(mq);
		lock_unlock(mGq->mLock);
	} else
		mq->mIsG = 0;
	mq_unlock(mq);
}
Example #15
0
int fflush(FILE *stream)
{
  if(stream != NULL) {
    int res;
    lock_lock(&(stream->lock));
    res = __uportlibc_unsafely_flush_stream(stream);
    lock_unlock(&(stream->lock));
    return res;
  } else 
    return __uportlibc_for_each_stream(fflush);
}
Example #16
0
enum nss_status internal_function
__nss_cdb_setent(struct nss_cdb *dbp, int stayopen) {
  enum nss_status r;
  lock_lock(lock);
  if (isopen(dbp) || __nss_cdb_dosetent(dbp))
    r = NSS_STATUS_SUCCESS, dbp->keepopen |= stayopen;
  else
    r = NSS_STATUS_UNAVAIL;
  lock_unlock(lock);
  return r;
}
Example #17
0
enum nss_status internal_function
__nss_cdb_getent(struct nss_cdb *dbp,
                 void *result, char *buf, size_t bufl, int *errnop) {
  enum nss_status r;
  if (bufl < 30)
    return *errnop = ERANGE, NSS_STATUS_TRYAGAIN;
  lock_lock(lock);
  dbp->keepopen |= 1;
  r = __nss_cdb_dogetent(dbp, result, buf, bufl, errnop);
  lock_unlock(lock);
  return r;
}
Example #18
0
File: gq.c Project: eligo/mul
void gq_push_msg(struct mq_t *mq, struct msg_t *msg) {
	mq_lock(mq);
	mq_push_raw(mq, msg);
	if (!mq->mIsG) {
		assert(!mq->mNext);
		lock_lock(mGq->mLock);
		gq_push_mq_raw(mq);
		lock_unlock(mGq->mLock);
		mq->mIsG = 1;
	}
	mq_unlock(mq);
}
Example #19
0
File: gs.c Project: eligo/mul
void _pushWQ(struct so_t *so) {
	lock_lock(mGs->mQLock);
	if (!mGs->mWTail) {
		assert(!mGs->mWHead);
		mGs->mWHead = mGs->mWTail = so;
		mGs->mQn = 1;
	} else {
		mGs->mWTail->next = so;
		mGs->mQn = mGs->mQn + 1;
	}
	so->next = NULL;
	lock_unlock(mGs->mQLock);
}
Example #20
0
File: gq.c Project: eligo/mul
struct msg_t *mq_pop(struct mq_t *mq) {
	struct msg_t *msg = NULL;
	lock_lock(mq->mLock);
	msg = mq->mHead;
	if (msg) {
		mq->mHead = msg->next;
		if (!mq->mHead) {
			assert(mq->mTail == msg);
			mq->mTail = NULL;
		}
	}
	lock_unlock(mq->mLock);
	return msg;
}
Example #21
0
int fseeko(FILE *stream, off_t offset, int whence)
{
  int res;
  lock_lock(&(stream->lock));
  do {
    if(unsafely_set_stream_offset(stream, offset, whence) == -1) {
      res = -1;
      break;
    }
    memset(&(stream->mb_state), 0, sizeof(mbstate_t));
    res = 0;
  } while(0);
  lock_unlock(&(stream->lock));
  return res;
}
Example #22
0
int fsetpos(FILE *stream, const fpos_t *pos)
{
  int res;
  lock_lock(&(stream->lock));
  do {
    if(unsafely_set_stream_offset(stream, pos->offset, SEEK_SET) == -1) {
      res = -1;
      break;
    }
    stream->mb_state = pos->mb_state;
    res = 0;
  } while(0);
  lock_unlock(&(stream->lock));
  return res;
}
Example #23
0
File: gq.c Project: eligo/mul
struct mq_t *gq_pop() {
	struct mq_t *mq = NULL;
	lock_lock(mGq->mLock);
	mq = mGq->mHead;
	if (mq) {
		mGq->mHead = mq->mNext;
		if (!mGq->mHead) {
			assert(mGq->mTail == mq);
			mGq->mTail = NULL;
		}
		mq->mNext = NULL;
	}
	lock_unlock(mGq->mLock);
	return mq;
}
Example #24
0
int safe_warn(server *srv, const char *format, ...) {
	/* displays a warning */
	lock_lock (&srv->master->lock_log);
	
	va_list args;
	printf ("WARNING ");
	
	va_start (args, format);
	vprintf (format, args);
	va_end (args);
	
	printf ("\n");

	lock_unlock (&srv->master->lock_log);

	return 0;
}
Example #25
0
int main(void)
{
	const int cpu = procnum();
	int i;

	printf("Cpu %x booted\n", cpu);

	for (i=0; i<100; ++i) {
		lock_lock(&lock);
		printf("Hello from cpu %x\n", cpu);
		lock_unlock(&lock);
	}

	if (atomic_inc(&count) == 4)
		exit(0);
	while(1);
}
Example #26
0
enum nss_status internal_function
__nss_cdb_byname(struct nss_cdb *dbp, const char *name,
                 void *result, char *buf, size_t bufl, int *errnop) {
  enum nss_status r;
  if (*name == ':')
    return *errnop = ENOENT, NSS_STATUS_NOTFOUND;
  lock_lock(lock);
  if (!isopen(dbp) && !__nss_cdb_dosetent(dbp))
    *errnop = errno, r = NSS_STATUS_UNAVAIL;
  else {
    r = __nss_cdb_dobyname(dbp, name, strlen(name), result, buf, bufl, errnop);
    if (!dbp->keepopen)
      __nss_cdb_doendent(dbp);
  }
  lock_unlock(lock);
  return r;
}
Example #27
0
enum nss_status internal_function
__nss_cdb_byid(struct nss_cdb *dbp, unsigned long id,
               void *result, char *buf, size_t bufl, int *errnop) {
  enum nss_status r;
  if (bufl < 30)
    return *errnop = ERANGE, NSS_STATUS_TRYAGAIN;
  lock_lock(lock);
  if (!isopen(dbp) && !__nss_cdb_dosetent(dbp))
    *errnop = errno, r = NSS_STATUS_UNAVAIL;
  else {
    r = __nss_cdb_dobyid(dbp, id, result, buf, bufl, errnop);
    if (!dbp->keepopen)
      __nss_cdb_doendent(dbp);
  }
  lock_unlock(lock);
  return r;
}
Example #28
0
int putw(int w, FILE *stream)
{
  union word word_union;
  size_t i;
  int res;
  word_union.word = w;
  res = 0;
  lock_lock(&(stream->lock));
  for(i = 0; i < WORD_BIT / 8; i++) {
    if(putc_unlocked(word_union.bytes[i], stream) == EOF) {
      res = EOF;
      break;
    }
  }
  lock_unlock(&(stream->lock));
  return res;
}
Example #29
0
int fgetpos(FILE *stream, fpos_t *pos)
{
  int res;
  lock_lock(&(stream->lock));
  do {
    off_t offset = unsafely_get_stream_offset(stream);
    if(offset == -1) {
      res = -1;
      break;
    }
    pos->offset = offset;
    pos->mb_state = stream->mb_state;
    res = 0;
  } while(0);
  lock_unlock(&(stream->lock));
  return res;
}
Example #30
0
size_t fread(void *ptr, size_t elem_size, size_t elem_count, FILE *stream)
{
  char *buf = (char *) ptr;
  size_t count, read_byte_count;
  lock_lock(&(stream->lock));
  if(__uportlibc_unsafely_prepare_stream_to_read(stream, -1) == EOF) return 0;
  count = elem_size * elem_count;
  read_byte_count = 0;
  while(stream->pushed_c_count > 0 && count > 0) {
    stream->pushed_c_count--;
    *buf = stream->pushed_cs[stream->pushed_c_count];
    buf++;
    count--;
    read_byte_count++;
  }
  if(stream->buf_type != _IONBF) {
    while(stream->buf_data_cur != stream->buf_data_end && count > 0) {
      *buf = *(stream->buf_data_cur);
      buf++;
      stream->buf_data_cur++;
      count--;
      read_byte_count++;
    }
    if(stream->buf_data_cur == stream->buf_data_end) {
      stream->buf_data_cur = stream->buf;
      stream->buf_data_end = stream->buf;
    }
  }
  while(count > 0) {
    size_t tmp_count = (count < SSIZE_MAX ? count : SSIZE_MAX);
    ssize_t res = read(stream->fd, buf, tmp_count);
    if(res == 0) {
      stream->flags |= FILE_FLAG_EOF;
      break;
    }
    if(res == -1) {
      stream->flags |= FILE_FLAG_ERROR;
      break;
    }
    buf += res;
    count -= res;
    read_byte_count += res;
  }
  lock_unlock(&(stream->lock));
  return read_byte_count / elem_size;
}