mirror of
https://github.com/vlang/v.git
synced 2025-09-15 07:22:27 +03:00
101 lines
1.9 KiB
Markdown
101 lines
1.9 KiB
Markdown
# Vanilla
|
|
|
|
Vanilla is a raw V server.
|
|
|
|
## Description
|
|
|
|
This project is a simple server written in the V programming language.
|
|
It aims to provide a minimalistic and efficient server implementation.
|
|
|
|
## Features
|
|
|
|
- Lightweight and fast
|
|
- Minimal dependencies
|
|
- Easy to understand and extend
|
|
|
|
## Installation
|
|
|
|
To install Vanilla, you need to have the V compiler installed.
|
|
You can download it from the [official V website](https://vlang.io).
|
|
|
|
## Usage
|
|
|
|
To run the server, use the following command:
|
|
|
|
```sh
|
|
v -prod crun .
|
|
```
|
|
|
|
This will start the server, and you can access it at `http://localhost:3000`.
|
|
|
|
## Code Overview
|
|
|
|
### Main Server
|
|
|
|
The main server logic is implemented in [src/main.v](v/vanilla/src/main.v).
|
|
The server is initialized and started in the `main` function:
|
|
|
|
```v ignore
|
|
module main
|
|
|
|
const port = 3000
|
|
|
|
fn main() {
|
|
mut server := Server{
|
|
router: setup_router()
|
|
}
|
|
|
|
server.socket_fd = create_server_socket(port)
|
|
if server.socket_fd < 0 {
|
|
return
|
|
}
|
|
server.epoll_fd = C.epoll_create1(0)
|
|
if server.epoll_fd < 0 {
|
|
C.perror('epoll_create1 failed'.str)
|
|
C.close(server.socket_fd)
|
|
return
|
|
}
|
|
|
|
server.lock_flag.lock()
|
|
if add_fd_to_epoll(server.epoll_fd, server.socket_fd, u32(C.EPOLLIN)) == -1 {
|
|
C.close(server.socket_fd)
|
|
C.close(server.epoll_fd)
|
|
|
|
server.lock_flag.unlock()
|
|
return
|
|
}
|
|
|
|
server.lock_flag.unlock()
|
|
|
|
server.lock_flag.init()
|
|
for i := 0; i < 16; i++ {
|
|
server.threads[i] = spawn process_events(&server)
|
|
}
|
|
println('listening on http://localhost:${port}/')
|
|
event_loop(&server)
|
|
}
|
|
```
|
|
|
|
## Test
|
|
|
|
### CURL
|
|
|
|
```sh
|
|
curl -X GET --verbose http://localhost:3000/ &&
|
|
curl -X POST --verbose http://localhost:3000/user &&
|
|
curl -X GET --verbose http://localhost:3000/user/1
|
|
|
|
```
|
|
|
|
### WRK
|
|
|
|
```sh
|
|
wrk --connection 512 --threads 16 --duration 10s http://localhost:3000
|
|
```
|
|
|
|
### Valgrind
|
|
```sh
|
|
# Race condition check
|
|
v -prod -gc none .
|
|
valgrind --tool=helgrind ./vanilla_http_server
|
|
```
|