Rocksolid Light

Welcome to RetroBBS

mail  files  register  newsreader  groups  login

Message-ID:  

No directory.


devel / comp.programming.threads / Sum server [Swift]

SubjectAuthor
* Sum server [Swift]Branimir Maksimovic
`* Re: Sum server,improved slightly [Swift]Branimir Maksimovic
 `* Re: Sum server, mutch improved [Swift]Branimir Maksimovic
  `* Re: Sum server, finished [Swift]Branimir Maksimovic
   `* Re: Sum server, finished, bugs corrected, accept now nonblocking asBranimir Maksimovic
    `* Re: Sum server, finished, bugs corrected, accept now nonblocking asBranimir Maksimovic
     `* Re: Sum server, finished, better, without usleep [Swift]Branimir Maksimovic
      `- Re: Sum server, finished, better, without usleep [Swift]Branimir Maksimovic

1
Sum server [Swift]

<icn6J.5878$2m1.2082@fx26.iad>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=105&group=comp.programming.threads#105

  copy link   Newsgroups: comp.programming.threads
Path: i2pn2.org!i2pn.org!weretis.net!feeder6.news.weretis.net!news.misty.com!border2.nntp.dca1.giganews.com!nntp.giganews.com!peer03.iad!feed-me.highwinds-media.com!news.highwinds-media.com!fx26.iad.POSTED!not-for-mail
Newsgroups: comp.programming.threads
From: branimir.maksimovic@icloud.com (Branimir Maksimovic)
Subject: Sum server [Swift]
User-Agent: slrn/1.0.3 (Darwin)
Lines: 149
Message-ID: <icn6J.5878$2m1.2082@fx26.iad>
X-Complaints-To: abuse@usenet-news.net
NNTP-Posting-Date: Sun, 03 Oct 2021 19:07:58 UTC
Organization: usenet-news.net
Date: Sun, 03 Oct 2021 19:07:58 GMT
X-Received-Bytes: 4876
X-Original-Bytes: 4825
 by: Branimir Maksimovic - Sun, 3 Oct 2021 19:07 UTC

import Foundation

let s = Server();
s.start()
var semaphore = 4
class Server {
init() {
if (CommandLine.argc > 1) {
tmpSvcPort = Int(CommandLine.arguments[1]) ?? 0
if (tmpSvcPort > 0){ servicePort = String(tmpSvcPort) }
}
}
var ende = false
var tmpSvcPort: Int = 0
var servicePort = "1234"
class Worker:Thread{
weak var parent: Server! = nil
init(_ fd:Int32){
self.fd = fd
}
deinit {
semaphore += 1
close(fd)
}
override func main(){
let MTU = 65536
let buffer = UnsafeMutablePointer<CChar>.allocate(capacity:MTU)
defer {
buffer.deallocate()
}
var count = 1
while (count > 0) {
count -= 1
let readResult = read(fd, buffer, MTU)

if (readResult == 0) {
break; // end of file
} else if (readResult == -1) {
print("Error reading form client\(fd) - \(errno)")
break; // error
} else {
let strResult =
String(cString: buffer)
let numbers = strResult.components(separatedBy: " ")
var sum = 0
if numbers.count > 1 {
if numbers[0].lowercased() == "quit" {
parent.ende = true
continue
} else {
let num1 = Int(numbers[0]) ?? 0
let num2 = Int(numbers[1]) ?? 0
sum = num1 + num2
}
}
print("Received form client(\(fd)): \(strResult)")
let out = String(format:"suma %d\n",sum)
let _ = out.withCString {
write(fd, $0, out.count)
}
}
}
}
var fd: Int32
}
func start() {
print("Server starting...")

let socketFD = socket(AF_INET6, //Domain [AF_INET,AF_INET6, AF_UNIX]
SOCK_STREAM, //Type [SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET, SOCK_RAW]
IPPROTO_TCP //Protocol [IPPROTO_TCP, IPPROTO_SCTP, IPPROTO_UDP, IPPROTO_DCCP]
)//Return a FileDescriptor -1 = error
if socketFD == -1 {
print("Error creating BSD Socket")
return
}

var hints = addrinfo(
ai_flags: AI_PASSIVE, // Assign the address of the local host to the socket structures
ai_family: AF_UNSPEC, // Either IPv4 or IPv6
ai_socktype: SOCK_STREAM, // TCP
ai_protocol: 0,
ai_addrlen: 0,
ai_canonname: nil,
ai_addr: nil,
ai_next: nil)

var servinfo: UnsafeMutablePointer<addrinfo>? = nil
let addrInfoResult = getaddrinfo(
nil, // Any interface
servicePort, // The port on which will be listenend
&hints, // Protocol configuration as per above
&servinfo)

if addrInfoResult != 0 {
print("Error getting address info: \(errno)")
return
}

let bindResult = bind(socketFD, servinfo!.pointee.ai_addr, socklen_t(servinfo!.pointee.ai_addrlen))

if bindResult == -1 {
print("Error binding socket to Address: \(errno)")
return
}

let listenResult = listen(socketFD, //Socket File descriptor
128 // The backlog argument defines the maximum length the queue of pending connections may grow to
)
/**
let flags = fcntl(socketFD,F_GETFL)
let _ = fcntl(socketFD,F_SETFL,flags | O_NONBLOCK)
*/

if listenResult == -1 {
print("Error setting our socket to listen")
return
}
while (!self.ende) {
var addr = sockaddr()
var addr_len :socklen_t = 0
while (true) {
while(semaphore > 4){}
print("About to accept")
let accFD = accept(socketFD, &addr, &addr_len)
semaphore -= 1
if (accFD > 0){
/** let flags = fcntl(accFD,F_GETFL)
let _ = fcntl(accFD,F_SETFL,flags & ~O_NONBLOCK)
*/
print("Accepted new client with file descriptor: \(accFD)")
let handle = Worker(accFD);
handle.start()
} else {
print("Error accepting connection")
}
}
}
}

}

--

7-77-777
Evil Sinner!
to weak you should be meek, and you should brainfuck stronger
https://github.com/rofl0r/chaos-pp

Re: Sum server,improved slightly [Swift]

<Prv6J.32274$dI3.27972@fx10.iad>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=106&group=comp.programming.threads#106

  copy link   Newsgroups: comp.programming.threads
Path: i2pn2.org!i2pn.org!weretis.net!feeder8.news.weretis.net!feeder1.feed.usenet.farm!feed.usenet.farm!peer03.ams4!peer.am4.highwinds-media.com!peer01.iad!feed-me.highwinds-media.com!news.highwinds-media.com!fx10.iad.POSTED!not-for-mail
Newsgroups: comp.programming.threads
From: branimir.maksimovic@icloud.com (Branimir Maksimovic)
Subject: Re: Sum server,improved slightly [Swift]
References: <icn6J.5878$2m1.2082@fx26.iad>
User-Agent: slrn/1.0.3 (Darwin)
Lines: 153
Message-ID: <Prv6J.32274$dI3.27972@fx10.iad>
X-Complaints-To: abuse@usenet-news.net
NNTP-Posting-Date: Mon, 04 Oct 2021 04:30:39 UTC
Organization: usenet-news.net
Date: Mon, 04 Oct 2021 04:30:39 GMT
X-Received-Bytes: 5346
 by: Branimir Maksimovic - Mon, 4 Oct 2021 04:30 UTC

On 2021-10-03, Branimir Maksimovic <branimir.maksimovic@icloud.com> wrote:

import Foundation
signal(SIGPIPE,SIG_IGN)
let s = Server();
s.start()
var semacnt:Int? = nil
class Server {
init() {
if (CommandLine.argc > 1) {
tmpSvcPort = Int(CommandLine.arguments[1]) ?? 0
if (tmpSvcPort > 0){ servicePort = String(tmpSvcPort) }
}
semacnt! = 0
}
var ende = false
var tmpSvcPort: Int = 0
var servicePort = "1234"
class Worker:Thread{
weak var parent: Server! = nil
init(_ fd:Int32){
self.fd = fd
semacnt! += 1
}
deinit {
close(fd)
semacnt! -= 1
}
override func main(){
let MTU = 65536
let buffer = UnsafeMutablePointer<CChar>.allocate(capacity:MTU)
defer {
buffer.deallocate()
}
var count = 1
while (count > 0) {
count -= 1
let readResult = read(fd, buffer, MTU)

if (readResult == 0) {
break; // end of file
} else if (readResult == -1) {
print("Error reading form client\(fd) - \(errno)")
break; // error
} else {
let strResult =
String(cString: buffer)
let numbers = strResult.components(separatedBy: " ")
var sum = 0
if numbers.count > 1 {
if numbers[0].lowercased() == "quit" {
parent.ende = true
continue
} else {
let num1 = Int(numbers[0]) ?? 0
let num2 = Int(numbers[1]) ?? 0
sum = num1 + num2
}
}
print("Received form client(\(fd)): \(strResult)")
let out = String(format:"suma %d\n",sum)
let _ = out.withCString {
/**let flags = fcntl(fd,F_GETFL)
let _ = fcntl(fd,F_SETFL,flags | O_NONBLOCK)
*/
while(semacnt! > 128){usleep(100)} // we don't want to attack too many
write(fd, $0, out.count)

}
}
}
}
var fd: Int32
}
func start() {
print("Server starting...")

let socketFD = socket(AF_INET6, //Domain [AF_INET,AF_INET6, AF_UNIX]
SOCK_STREAM, //Type [SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET, SOCK_RAW]
IPPROTO_TCP //Protocol [IPPROTO_TCP, IPPROTO_SCTP, IPPROTO_UDP, IPPROTO_DCCP]
)//Return a FileDescriptor -1 = error
if socketFD == -1 {
print("Error creating BSD Socket")
return
}

var hints = addrinfo(
ai_flags: AI_PASSIVE, // Assign the address of the local host to the socket structures
ai_family: AF_UNSPEC, // Either IPv4 or IPv6
ai_socktype: SOCK_STREAM, // TCP
ai_protocol: 0,
ai_addrlen: 0,
ai_canonname: nil,
ai_addr: nil,
ai_next: nil)

var servinfo: UnsafeMutablePointer<addrinfo>? = nil
let addrInfoResult = getaddrinfo(
nil, // Any interface
servicePort, // The port on which will be listenend
&hints, // Protocol configuration as per above
&servinfo)

if addrInfoResult != 0 {
print("Error getting address info: \(errno)")
return
}
setsockopt(socketFD,SOL_SOCKET,SO_REUSEADDR,servinfo!.pointee.ai_addr, socklen_t(servinfo!.pointee.ai_addrlen))
let bindResult = bind(socketFD, servinfo!.pointee.ai_addr, socklen_t(servinfo!.pointee.ai_addrlen))

if bindResult == -1 {
print("Error binding socket to Address: \(errno)")
return
}

let listenResult = listen(socketFD, //Socket File descriptor
128 // The backlog argument defines the maximum length the queue of pending connections may grow to
)

/** let flags = fcntl(socketFD,F_GETFL)
let _ = fcntl(socketFD,F_SETFL,flags | O_NONBLOCK)
*/

if listenResult == -1 {
print("Error setting our socket to listen")
return
}
while (!self.ende) {
var addr = sockaddr()
var addr_len :socklen_t = 0
while (true) {
print("About to accept")
let accFD = accept(socketFD, &addr, &addr_len)
if (accFD > 0){
print("Accepted new client with file descriptor: \(accFD)")
let handle = Worker(accFD);
handle.start()
} else {
print("Error accepting connection")
usleep(100)
}
}
}
}

}

--

7-77-777
Evil Sinner!
to weak you should be meek, and you should brainfuck stronger
https://github.com/rofl0r/chaos-pp

Re: Sum server, mutch improved [Swift]

<RAO6J.64731$jm6.37037@fx07.iad>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=107&group=comp.programming.threads#107

  copy link   Newsgroups: comp.programming.threads
Path: i2pn2.org!i2pn.org!weretis.net!feeder8.news.weretis.net!ecngs!feeder2.ecngs.de!178.20.174.213.MISMATCH!feeder1.feed.usenet.farm!feed.usenet.farm!peer01.ams4!peer.am4.highwinds-media.com!peer02.iad!feed-me.highwinds-media.com!news.highwinds-media.com!fx07.iad.POSTED!not-for-mail
Newsgroups: comp.programming.threads
From: branimir.maksimovic@icloud.com (Branimir Maksimovic)
Subject: Re: Sum server, mutch improved [Swift]
References: <icn6J.5878$2m1.2082@fx26.iad> <Prv6J.32274$dI3.27972@fx10.iad>
User-Agent: slrn/1.0.3 (Darwin)
Lines: 177
Message-ID: <RAO6J.64731$jm6.37037@fx07.iad>
X-Complaints-To: abuse@usenet-news.net
NNTP-Posting-Date: Tue, 05 Oct 2021 02:17:21 UTC
Organization: usenet-news.net
Date: Tue, 05 Oct 2021 02:17:21 GMT
X-Received-Bytes: 6239
 by: Branimir Maksimovic - Tue, 5 Oct 2021 02:17 UTC

On 2021-10-04, Branimir Maksimovic <branimir.maksimovic@icloud.com> wrote:
import Foundation
signal(SIGPIPE,SIG_IGN)
let s = Server();
s.start()
var ende:Bool? = nil
var semacnt:Int? = nil
var mutex:Bool? = nil
var accarrFD:[Int32]? = nil
class Server {
init() {
if (CommandLine.argc > 1) {
tmpSvcPort = Int(CommandLine.arguments[1]) ?? 0
if (tmpSvcPort > 0){ servicePort = String(tmpSvcPort) }
}
semacnt! = 0
mutex! = false
ende! = false
accarrFD! = Array(repeating:Int32(0),count:0)
}
var tmpSvcPort: Int = 0
var servicePort = "1234"
class Worker:Thread{
init(_ fd:Int32){
self.fd = fd
semacnt! += 1
}
deinit {
semacnt! -= 1
}
override func main(){
let MTU = 65536
let buffer = UnsafeMutablePointer<CChar>.allocate(capacity:MTU)
defer {
buffer.deallocate()
}
while (mutex! == true){usleep(100)}
mutex! = true
print("acquired")
var oneFD = Array(repeating:Int32(0),count:0)
while (!accarrFD!.isEmpty){
/// collect rest of fds
oneFD.append(accarrFD![accarrFD!.count-1])
accarrFD!.remove(at:accarrFD!.count-1)
}
mutex! = false /// seems we do not need barrier
print("releazed\n")
var toproc = [fd]
toproc += oneFD
for fd in toproc{
defer {close(fd)}
let readResult = read(fd, buffer, MTU)

if (readResult == 0) {
break; // end of file
} else if (readResult == -1) {
print("Error reading form client(\(fd)) - \(errno)")
break; // error
} else {
let strResult =
String(cString: buffer)
let cset = CharacterSet(charactersIn: " \r\n")
let numbers = strResult.components(separatedBy: cset)
var sum = 0
if numbers.count > 1 {
if numbers[0].lowercased() == "quit" {
ende! = true
continue
} else {
let num1 = Int(numbers[0]) ?? 0
let num2 = Int(numbers[1]) ?? 0
sum = num1 + num2
}
}
print("Received form client(\(fd)): \(strResult)")
let out = String(format:"suma %d\n",sum)
let _ = out.withCString {
/**let flags = fcntl(fd,F_GETFL)
let _ = fcntl(fd,F_SETFL,flags | O_NONBLOCK)
*/
while(semacnt! > 128){usleep(100)}
write(fd, $0, out.count)

}
}
}
}
var fd: Int32
}
func start() {
print("Server starting...")

let socketFD = socket(AF_INET6, //Domain [AF_INET,AF_INET6, AF_UNIX]
SOCK_STREAM, //Type [SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET, SOCK_RAW]
IPPROTO_TCP //Protocol [IPPROTO_TCP, IPPROTO_SCTP, IPPROTO_UDP, IPPROTO_DCCP]
)//Return a FileDescriptor -1 = error
if socketFD == -1 {
print("Error creating BSD Socket")
return
}

var hints = addrinfo(
ai_flags: AI_PASSIVE, // Assign the address of the local host to the socket structures
ai_family: AF_UNSPEC, // Either IPv4 or IPv6
ai_socktype: SOCK_STREAM, // TCP
ai_protocol: 0,
ai_addrlen: 0,
ai_canonname: nil,
ai_addr: nil,
ai_next: nil)

var servinfo: UnsafeMutablePointer<addrinfo>? = nil
let addrInfoResult = getaddrinfo(
nil, // Any interface
servicePort, // The port on which will be listenend
&hints, // Protocol configuration as per above
&servinfo)

if addrInfoResult != 0 {
print("Error getting address info: \(errno)")
return
}
setsockopt(socketFD,SOL_SOCKET,SO_REUSEADDR,servinfo!.pointee.ai_addr, socklen_t(servinfo!.pointee.ai_addrlen))
let bindResult = bind(socketFD, servinfo!.pointee.ai_addr, socklen_t(servinfo!.pointee.ai_addrlen))

if bindResult == -1 {
print("Error binding socket to Address: \(errno)")
return
}

let listenResult = listen(socketFD, //Socket File descriptor
128 // The backlog argument defines the maximum length the queue of pending connections may grow to
)

/** let flags = fcntl(socketFD,F_GETFL)
let _ = fcntl(socketFD,F_SETFL,flags | O_NONBLOCK)
*/

if listenResult == -1 {
print("Error setting our socket to listen")
return
}
while (!ende!) {
var addr = sockaddr()
var addr_len :socklen_t = 0
while (!ende!) {
print("About to accept")
let accFD = accept(socketFD, &addr, &addr_len)
if (accFD > 0){
print("Accepted new client with file descriptor: \(accFD)")
if (semacnt! < 5) {
let handle = Worker(accFD);
handle.start()
} else {
while (mutex! == true){usleep(100)}
mutex! = true /// works fine without barrier
accarrFD!.append(accFD)
mutex! = false
}
} else {
print("Error accepting connection")
usleep(100)
}
OSMemoryBarrier() /// barrier needed here
}
}
}

}

--

7-77-777
Evil Sinner!
to weak you should be meek, and you should brainfuck stronger
https://github.com/rofl0r/chaos-pp

Re: Sum server, finished [Swift]

<9C17J.56040$md6.7378@fx36.iad>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=108&group=comp.programming.threads#108

  copy link   Newsgroups: comp.programming.threads
Path: i2pn2.org!rocksolid2!news.neodome.net!feeder1.feed.usenet.farm!feed.usenet.farm!peer02.ams4!peer.am4.highwinds-media.com!peer02.iad!feed-me.highwinds-media.com!news.highwinds-media.com!fx36.iad.POSTED!not-for-mail
Newsgroups: comp.programming.threads
From: branimir.maksimovic@icloud.com (Branimir Maksimovic)
Subject: Re: Sum server, finished [Swift]
References: <icn6J.5878$2m1.2082@fx26.iad> <Prv6J.32274$dI3.27972@fx10.iad>
<RAO6J.64731$jm6.37037@fx07.iad>
User-Agent: slrn/1.0.3 (Darwin)
Lines: 263
Message-ID: <9C17J.56040$md6.7378@fx36.iad>
X-Complaints-To: abuse@usenet-news.net
NNTP-Posting-Date: Tue, 05 Oct 2021 19:22:45 UTC
Organization: usenet-news.net
Date: Tue, 05 Oct 2021 19:22:45 GMT
X-Received-Bytes: 9238
 by: Branimir Maksimovic - Tue, 5 Oct 2021 19:22 UTC

import Foundation
signal(SIGPIPE,SIG_IGN)
let s = Server();
s.start()
var bval:UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil
var ende:Bool? = nil
var semacnt:Int? = nil
var accarrFD:[Int32]? = nil
class Server {
init() {
if (CommandLine.argc > 1) {
tmpSvcPort = Int(CommandLine.arguments[1]) ?? 0
if (tmpSvcPort > 0){ servicePort = String(tmpSvcPort) }
}
semacnt! = 0
ende! = false
accarrFD! = Array(repeating:Int32(0),count:0)
bval = UnsafeMutablePointer.allocate(capacity:1)
bval!.pointee = UnsafeMutableRawPointer.allocate(byteCount:1,alignment:1)
print("assigning")
bval!.pointee!.storeBytes(of:0,as: UInt8.self)
print("assigned")
}
deinit {
bval!.pointee!.deallocate()
bval!.deallocate()
}
var tmpSvcPort: Int = 0
var servicePort = "1234"
class Worker:Thread{
override init(){
super.init()
semacnt! += 1
}
deinit {
semacnt! -= 1
}
override func main(){
let MTU = 65536
let buffer = UnsafeMutablePointer<CChar>.allocate(capacity:MTU)
let True = UnsafeMutablePointer<UInt8>.allocate(capacity:1)
let False = UnsafeMutablePointer<UInt8>.allocate(capacity:1)
True.pointee = 1
False.pointee = 0
defer {
True.deallocate()
False.deallocate()
buffer.deallocate()
}
while(true){
repeat {
usleep(100);
OSMemoryBarrier()
}
/***
* interrestingky CAS doesn't work because of
* some weird Apple memory scheme
*/
while (bval!.pointee!.load(as:UInt8.self) == 1)
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:1,as: UInt8.self)
print("acquired")
var oneFD = Array(repeating:Int32(0),count:0)
if (!accarrFD!.isEmpty){
/// collect rest of fds
oneFD.append(accarrFD![accarrFD!.count-1])
accarrFD!.remove(at:accarrFD!.count-1)
}
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:0,as: UInt8.self)
print("releazed\n")
let toproc = oneFD
for fd in toproc{
let sockKqueue = kqueue()
if sockKqueue == -1 {
print("Error creating kqueue")
}

defer {close(fd);close(sockKqueue)}
var sockKevent = kevent(
ident: UInt(fd),
filter: Int16(EVFILT_READ),
flags: UInt16(EV_ADD | EV_ENABLE),
fflags: 0,
data: 0,
udata: nil)
kevent(sockKqueue, &sockKevent, 1, nil, 0, nil)
var event = kevent()
let status = kevent(sockKqueue, nil, 0, &event, 1, nil)
if status == 0 {
print("Timeout")
continue
} else if status > 0 {
if (event.flags & UInt16(EV_EOF)) == EV_EOF {
print("The socket (\(fd)) has been closed.")
continue
}
print("File descriptor: \(fd) - has \(event.data) characters for reading")
}
else {
print("Error reading kevent")
continue
}
let readResult = read(fd, buffer, MTU)

if (readResult == 0) {
continue; // end of file
} else if (readResult == -1) {
print("Error reading form client(\(fd)) - \(errno)")
continue; // error
} else {
let strResult =
String(cString: buffer)
let cset = CharacterSet(charactersIn: " \r\n")
let numbers = strResult.components(separatedBy: cset)
var sum = 0
if numbers.count > 1 {
if numbers[0].lowercased() == "quit" {
ende! = true
continue
} else {
let num1 = Int(numbers[0]) ?? 0
let num2 = Int(numbers[1]) ?? 0
sum = num1 + num2
}
}
print("Received form client(\(fd)): \(strResult)")
let out = String(format:"suma %d\n",sum)
let _ = out.withCString {
/**let flags = fcntl(fd,F_GETFL)
let _ = fcntl(fd,F_SETFL,flags | O_NONBLOCK)
*/
var sockKevent = kevent(
ident: UInt(fd),
filter: Int16(EVFILT_WRITE),
flags: UInt16(EV_ADD | EV_ENABLE),
fflags: 0,
data: 0,
udata: nil)
kevent(sockKqueue, &sockKevent, 1, nil, 0, nil)
var event = kevent()
let status = kevent(sockKqueue, nil, 0, &event, 1, nil)
if status == 0 {
print("Timeout")
} else if status > 0 {
if (event.flags & UInt16(EV_EOF)) == EV_EOF {
print("The socket (\(fd)) has been closed.")
}
print("File descriptor: \(fd) - can write")
write(fd, $0, out.count)
}
else {
print("Error reading kevent")
}
}
}
}
usleep(100)
}
}
}
func start() {
print("Server starting...")

let socketFD = socket(AF_INET6, //Domain [AF_INET,AF_INET6, AF_UNIX]
SOCK_STREAM, //Type [SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET, SOCK_RAW]
IPPROTO_TCP //Protocol [IPPROTO_TCP, IPPROTO_SCTP, IPPROTO_UDP, IPPROTO_DCCP]
)//Return a FileDescriptor -1 = error
if socketFD == -1 {
print("Error creating BSD Socket")
return
}

var hints = addrinfo(
ai_flags: AI_PASSIVE, // Assign the address of the local host to the socket structures
ai_family: AF_UNSPEC, // Either IPv4 or IPv6
ai_socktype: SOCK_STREAM, // TCP
ai_protocol: 0,
ai_addrlen: 0,
ai_canonname: nil,
ai_addr: nil,
ai_next: nil)

var servinfo: UnsafeMutablePointer<addrinfo>? = nil
let addrInfoResult = getaddrinfo(
nil, // Any interface
servicePort, // The port on which will be listenend
&hints, // Protocol configuration as per above
&servinfo)

if addrInfoResult != 0 {
print("Error getting address info: \(errno)")
return
}
setsockopt(socketFD,SOL_SOCKET,SO_REUSEADDR,servinfo!.pointee.ai_addr, socklen_t(servinfo!.pointee.ai_addrlen))
let bindResult = bind(socketFD, servinfo!.pointee.ai_addr, socklen_t(servinfo!.pointee.ai_addrlen))

if bindResult == -1 {
print("Error binding socket to Address: \(errno)")
return
}

let listenResult = listen(socketFD, //Socket File descriptor
128 // The backlog argument defines the maximum length the queue of pending connections may grow to
)

/** let flags = fcntl(socketFD,F_GETFL)
let _ = fcntl(socketFD,F_SETFL,flags | O_NONBLOCK)
*/

if listenResult == -1 {
print("Error setting our socket to listen")
return
}
let True = UnsafeMutablePointer<UInt8>.allocate(capacity:1)
let False = UnsafeMutablePointer<UInt8>.allocate(capacity:1)
True.pointee = 1
False.pointee = 0
defer {
True.deallocate()
False.deallocate()
}
while (!ende!) {
var addr = sockaddr()
var addr_len :socklen_t = 0
while (!ende!) {
print("About to accept")
let accFD = accept(socketFD, &addr, &addr_len)
if (accFD > 0){
print("Accepted new client with file descriptor: \(accFD)")
repeat {
usleep(100);
OSMemoryBarrier()
}
while (bval!.pointee!.load(as:UInt8.self) == 1)
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:1,as:UInt8.self)
accarrFD!.append(accFD)
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:0,as:UInt8.self)
if (semacnt! < 5) {
let handle = Worker();
handle.start()
}
} else {
print("Error accepting connection")
usleep(100)
}
OSMemoryBarrier() /// barrier needed here
}
}
exit(EXIT_SUCCESS)
}

}

--

7-77-777
Evil Sinner!
to weak you should be meek, and you should brainfuck stronger
https://github.com/rofl0r/chaos-pp

Re: Sum server, finished, bugs corrected, accept now nonblocking as well [Swift]

<TF47J.12145$fZ.741@fx06.iad>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=109&group=comp.programming.threads#109

  copy link   Newsgroups: comp.programming.threads
Path: i2pn2.org!i2pn.org!weretis.net!feeder8.news.weretis.net!ecngs!feeder2.ecngs.de!178.20.174.213.MISMATCH!feeder1.feed.usenet.farm!feed.usenet.farm!peer01.ams4!peer.am4.highwinds-media.com!peer01.ams1!peer.ams1.xlned.com!news.xlned.com!peer02.iad!feed-me.highwinds-media.com!news.highwinds-media.com!fx06.iad.POSTED!not-for-mail
Newsgroups: comp.programming.threads
From: branimir.maksimovic@icloud.com (Branimir Maksimovic)
Subject: Re: Sum server, finished, bugs corrected, accept now nonblocking as
well [Swift]
References: <icn6J.5878$2m1.2082@fx26.iad> <Prv6J.32274$dI3.27972@fx10.iad>
<RAO6J.64731$jm6.37037@fx07.iad> <9C17J.56040$md6.7378@fx36.iad>
User-Agent: slrn/1.0.3 (Darwin)
Lines: 281
Message-ID: <TF47J.12145$fZ.741@fx06.iad>
X-Complaints-To: abuse@usenet-news.net
NNTP-Posting-Date: Tue, 05 Oct 2021 22:51:31 UTC
Organization: usenet-news.net
Date: Tue, 05 Oct 2021 22:51:31 GMT
X-Received-Bytes: 10096
 by: Branimir Maksimovic - Tue, 5 Oct 2021 22:51 UTC

On 2021-10-05, Branimir Maksimovic <branimir.maksimovic@icloud.com> wrote:
import Foundation
signal(SIGPIPE,SIG_IGN)
let s = Server();
s.start()
var bval:UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil
var ende:Bool? = nil
var semacnt:Int? = nil
var accarrFD:[Int32]? = nil
class Server {
init() {
if (CommandLine.argc > 1) {
tmpSvcPort = Int(CommandLine.arguments[1]) ?? 0
if (tmpSvcPort > 0){ servicePort = String(tmpSvcPort) }
}
semacnt! = 0
ende! = false
accarrFD! = Array(repeating:Int32(0),count:0)
bval = UnsafeMutablePointer.allocate(capacity:1)
bval!.pointee = UnsafeMutableRawPointer.allocate(byteCount:1,alignment:1)
print("assigning")
bval!.pointee!.storeBytes(of:0,as: UInt8.self)
print("assigned")
}
deinit {
bval!.pointee!.deallocate()
bval!.deallocate()
}
var tmpSvcPort: Int = 0
var servicePort = "1234"
class Worker:Thread{
override init(){
super.init()
semacnt! += 1
}
deinit {
semacnt! -= 1
}
override func main(){
let MTU = 65536
let buffer = UnsafeMutablePointer<CChar>.allocate(capacity:MTU)
defer {
buffer.deallocate()
}
while(true){
repeat {
usleep(1);
OSMemoryBarrier()
}
/***
* interrestingky CAS doesn't work because of
* some weird Apple memory scheme
*/
while (bval!.pointee!.load(as:UInt8.self) == 1)
OSMemoryBarrier()
if(bval!.pointee!.load(as:UInt8.self) == 1){ continue }
bval!.pointee!.storeBytes(of:1,as: UInt8.self)
print("acquired")
var oneFD = Array(repeating:Int32(0),count:0)
var acqCount = 0
while (!accarrFD!.isEmpty && acqCount < 4){
/// collect rest of fds
acqCount += 1
oneFD.append(accarrFD![accarrFD!.count-1])
accarrFD!.remove(at:accarrFD!.count-1)
}
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:0,as: UInt8.self)
print("releazed\n")
let toproc = oneFD
for fd in toproc{
let flags = fcntl(fd,F_GETFL)
let _ = fcntl(fd,F_SETFL,flags | O_NONBLOCK)

let sockKqueue = kqueue()
if sockKqueue == -1 {
print("Error creating kqueue")
}

defer {close(fd);close(sockKqueue)}
var sockKevent = kevent(
ident: UInt(fd),
filter: Int16(EVFILT_READ),
flags: UInt16(EV_ADD | EV_ENABLE),
fflags: 0,
data: 0,
udata: nil)
kevent(sockKqueue, &sockKevent, 1, nil, 0, nil)
var event = kevent()
let status = kevent(sockKqueue, nil, 0, &event, 1, nil)
if status == 0 {
print("Timeout")
continue
} else if status > 0 {
if (event.flags & UInt16(EV_EOF)) == EV_EOF {
print("The socket (\(fd)) has been closed.")
continue
}
print("File descriptor: \(fd) - has \(event.data) characters for reading")
}
else {
print("Error reading kevent")
continue
}
let readResult = read(fd, buffer, MTU)

if (readResult == 0) {
continue; // end of file
} else if (readResult == -1) {
print("Error reading form client(\(fd)) - \(errno)")
continue; // error
} else {
let strResult =
String(cString: buffer)
let cset = CharacterSet(charactersIn: " \r\n")
let numbers = strResult.components(separatedBy: cset)
var sum = 0
if numbers.count > 1 {
if numbers[0].lowercased() == "quit" {
ende! = true
continue
} else {
let num1 = Int(numbers[0]) ?? 0
let num2 = Int(numbers[1]) ?? 0
sum = num1 + num2
}
}
print("Received form client(\(fd)): \(strResult)")
let out = String(format:"suma %d\n",sum)
let _ = out.withCString {
var sockKevent = kevent(
ident: UInt(fd),
filter: Int16(EVFILT_WRITE),
flags: UInt16(EV_ADD | EV_ENABLE),
fflags: 0,
data: 0,
udata: nil)
kevent(sockKqueue, &sockKevent, 1, nil, 0, nil)
var event = kevent()
let status = kevent(sockKqueue, nil, 0, &event, 1, nil)
if status == 0 {
print("Timeout")
} else if status > 0 {
if (event.flags & UInt16(EV_EOF)) == EV_EOF {
print("The socket (\(fd)) has been closed.")
}
print("File descriptor: \(fd) - can write")
write(fd, $0, out.count)
}
else {
print("Error reading kevent")
}
}
}
}
usleep(100)
}
}
}
func start() {
print("Server starting...")

let socketFD = socket(AF_INET6, //Domain [AF_INET,AF_INET6, AF_UNIX]
SOCK_STREAM, //Type [SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET, SOCK_RAW]
IPPROTO_TCP //Protocol [IPPROTO_TCP, IPPROTO_SCTP, IPPROTO_UDP, IPPROTO_DCCP]
)//Return a FileDescriptor -1 = error
if socketFD == -1 {
print("Error creating BSD Socket")
return
}

var hints = addrinfo(
ai_flags: AI_PASSIVE, // Assign the address of the local host to the socket structures
ai_family: AF_UNSPEC, // Either IPv4 or IPv6
ai_socktype: SOCK_STREAM, // TCP
ai_protocol: 0,
ai_addrlen: 0,
ai_canonname: nil,
ai_addr: nil,
ai_next: nil)

var servinfo: UnsafeMutablePointer<addrinfo>? = nil
let addrInfoResult = getaddrinfo(
nil, // Any interface
servicePort, // The port on which will be listenend
&hints, // Protocol configuration as per above
&servinfo)

if addrInfoResult != 0 {
print("Error getting address info: \(errno)")
return
}
setsockopt(socketFD,SOL_SOCKET,SO_REUSEADDR,servinfo!.pointee.ai_addr, socklen_t(servinfo!.pointee.ai_addrlen))
let bindResult = bind(socketFD, servinfo!.pointee.ai_addr, socklen_t(servinfo!.pointee.ai_addrlen))

if bindResult == -1 {
print("Error binding socket to Address: \(errno)")
return
}

let listenResult = listen(socketFD, //Socket File descriptor
128 // The backlog argument defines the maximum length the queue of pending connections may grow to
)

let flags = fcntl(socketFD,F_GETFL)
let _ = fcntl(socketFD,F_SETFL,flags | O_NONBLOCK)

let sockKqueue = kqueue()
if sockKqueue == -1 {
print("Error creating kqueue")
}
var sockKevent = kevent(
ident: UInt(socketFD),
filter: Int16(EVFILT_READ),
flags: UInt16(EV_ADD | EV_ENABLE),
fflags: 0,
data: 0,
udata: nil)
kevent(sockKqueue, &sockKevent, 1, nil, 0, nil)
var event = kevent()
if listenResult == -1 {
print("Error setting our socket to listen")
return
}
while (!ende!) {
var addr = sockaddr()
var addr_len :socklen_t = 0
while (!ende!) {
print("About to accept")
let status = kevent(sockKqueue, nil, 0, &event, 1, nil)
if status == 0 {
print("Timeout")
continue
} else if status > 0 {
if (event.flags & UInt16(EV_EOF)) == EV_EOF {
print("The socket (\(socketFD)) has been closed.")
continue
}
print("File descriptor: \(socketFD) - has \(event.data) characters for reading")
}
else {
print("Error reading kevent")
continue
}
let accFD = accept(socketFD, &addr, &addr_len)
if (accFD > 0){
print("Accepted new client with file descriptor: \(accFD)")
repeat {
usleep(1);
OSMemoryBarrier()
}
while (bval!.pointee!.load(as:UInt8.self) == 1)
OSMemoryBarrier()
if(bval!.pointee!.load(as:UInt8.self) == 1){ continue }
bval!.pointee!.storeBytes(of:1,as:UInt8.self)
accarrFD!.append(accFD)
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:0,as:UInt8.self)
if (semacnt! < 5) {
let handle = Worker();
handle.start()
}
} else {
print("Error accepting connection")
usleep(100)
}
OSMemoryBarrier() /// barrier needed here
}
}
exit(EXIT_SUCCESS)
}


Click here to read the complete article
Re: Sum server, finished, bugs corrected, accept now nonblocking as well, tweaked [Swift]

<C887J.146543$rl3.124179@fx45.iad>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=110&group=comp.programming.threads#110

  copy link   Newsgroups: comp.programming.threads
Path: i2pn2.org!i2pn.org!weretis.net!feeder6.news.weretis.net!news.misty.com!border2.nntp.dca1.giganews.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!peer03.iad!feed-me.highwinds-media.com!news.highwinds-media.com!fx45.iad.POSTED!not-for-mail
Newsgroups: comp.programming.threads
From: branimir.maksimovic@icloud.com (Branimir Maksimovic)
Subject: Re: Sum server, finished, bugs corrected, accept now nonblocking as
well, tweaked [Swift]
References: <icn6J.5878$2m1.2082@fx26.iad> <Prv6J.32274$dI3.27972@fx10.iad>
<RAO6J.64731$jm6.37037@fx07.iad> <9C17J.56040$md6.7378@fx36.iad>
<TF47J.12145$fZ.741@fx06.iad>
User-Agent: slrn/1.0.3 (Darwin)
Lines: 317
Message-ID: <C887J.146543$rl3.124179@fx45.iad>
X-Complaints-To: abuse@usenet-news.net
NNTP-Posting-Date: Wed, 06 Oct 2021 02:49:06 UTC
Organization: usenet-news.net
Date: Wed, 06 Oct 2021 02:49:06 GMT
X-Received-Bytes: 11700
X-Original-Bytes: 11648
 by: Branimir Maksimovic - Wed, 6 Oct 2021 02:49 UTC

On 2021-10-05, Branimir Maksimovic <branimir.maksimovic@icloud.com> wrote:
import Foundation
signal(SIGPIPE,SIG_IGN)
let s = Server();
s.start()
var factor = 4
var bval:UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil
var ende:Bool? = nil
var semacnt:Int? = nil
var accarrFD:[Int32]? = nil
class Server {
init() {
let task = Process()
task.executableURL = URL(fileURLWithPath: "/usr/sbin/sysctl")
task.arguments = ["hw.ncpu"]
let out = Pipe()
task.standardOutput = out
let res: ()? = try? task.run()
if let _ = res {
let outputData = out.fileHandleForReading.readDataToEndOfFile()
let s = String(decoding: outputData, as: UTF8.self)
print("got from sysctl ",s)
let sep = CharacterSet(charactersIn: " \n")
let components = s.components(separatedBy: sep)
factor = Int(components[1]) ?? 4
}
if (CommandLine.argc > 1) {
tmpSvcPort = Int(CommandLine.arguments[1]) ?? 0
if (tmpSvcPort > 0){ servicePort = String(tmpSvcPort) }
}
semacnt! = 0
ende! = false
accarrFD! = Array(repeating:Int32(0),count:0)
bval = UnsafeMutablePointer.allocate(capacity:1)
bval!.pointee = UnsafeMutableRawPointer.allocate(byteCount:1,alignment:1)
print("assigning")
bval!.pointee!.storeBytes(of:0,as: UInt8.self)
print("assigned")
}
deinit {
bval!.pointee!.deallocate()
bval!.deallocate()
}
var tmpSvcPort: Int = 0
var servicePort = "1234"
class Worker:Thread{
override init(){
super.init()
semacnt! += 1
}
deinit {
semacnt! -= 1
}
override func main(){
let MTU = 65536
let buffer = UnsafeMutablePointer<CChar>.allocate(capacity:MTU)
defer {
buffer.deallocate()
}
while(true){
/***
* interrestingly CAS doesn't work, because of
* some weird Apple memory scheme.
* OSAtomicCompareAndSwapPtr: doesn't work
*/
usleep(1_000)
OSMemoryBarrier()
var val = bval!.pointee!.load(as:UInt8.self)
if( val == 1 || val == 2 || val == 3){ continue }
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:1,as: UInt8.self)
OSMemoryBarrier()
val = bval!.pointee!.load(as:UInt8.self)
if( val == 2 || val == 3 ){ continue }
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:2,as: UInt8.self)
OSMemoryBarrier()
val = bval!.pointee!.load(as:UInt8.self)
if(val == 3){ continue }
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:3,as: UInt8.self)
print("acquired")
var oneFD = Array(repeating:Int32(0),count:0)
var acqCount = 0
while (!accarrFD!.isEmpty && acqCount < factor*4){
/// collect rest of fds
acqCount += 1
oneFD.append(accarrFD![accarrFD!.count-1])
accarrFD!.remove(at:accarrFD!.count-1)
}
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:0,as: UInt8.self)
print("releazed\n")
let toproc = oneFD
for fd in toproc{
let flags = fcntl(fd,F_GETFL)
let _ = fcntl(fd,F_SETFL,flags | O_NONBLOCK)

let sockKqueue = kqueue()
if sockKqueue == -1 {
print("Error creating kqueue")
}

defer {close(fd);close(sockKqueue)}
var sockKevent = kevent(
ident: UInt(fd),
filter: Int16(EVFILT_READ),
flags: UInt16(EV_ADD | EV_ENABLE),
fflags: 0,
data: 0,
udata: nil)
kevent(sockKqueue, &sockKevent, 1, nil, 0, nil)
var event = kevent()
let status = kevent(sockKqueue, nil, 0, &event, 1, nil)
if status == 0 {
print("Timeout")
continue
} else if status > 0 {
if (event.flags & UInt16(EV_EOF)) == EV_EOF {
print("The socket (\(fd)) has been closed.")
continue
}
print("File descriptor: \(fd) - has \(event.data) characters for reading")
}
else {
print("Error reading kevent")
continue
}
let readResult = read(fd, buffer, MTU)

if (readResult == 0) {
continue; // end of file
} else if (readResult == -1) {
print("Error reading form client(\(fd)) - \(errno)")
continue; // error
} else {
let strResult =
String(cString: buffer)
let cset = CharacterSet(charactersIn: " \r\n")
let numbers = strResult.components(separatedBy: cset)
var sum = 0
if numbers.count > 1 {
if numbers[0].lowercased() == "quit" {
ende! = true
continue
} else {
let num1 = Int(numbers[0]) ?? 0
let num2 = Int(numbers[1]) ?? 0
sum = num1 + num2
}
}
print("Received form client(\(fd)): \(strResult)")
let out = String(format:"suma %d\n",sum)
let _ = out.withCString {
var sockKevent = kevent(
ident: UInt(fd),
filter: Int16(EVFILT_WRITE),
flags: UInt16(EV_ADD | EV_ENABLE),
fflags: 0,
data: 0,
udata: nil)
kevent(sockKqueue, &sockKevent, 1, nil, 0, nil)
var event = kevent()
let status = kevent(sockKqueue, nil, 0, &event, 1, nil)
if status == 0 {
print("Timeout")
} else if status > 0 {
if (event.flags & UInt16(EV_EOF)) == EV_EOF {
print("The socket (\(fd)) has been closed.")
}
print("File descriptor: \(fd) - can write")
write(fd, $0, out.count)
}
else {
print("Error reading kevent")
}
}
}
}
}
}
}
func start() {
print("Server starting...")

let socketFD = socket(AF_INET6, //Domain [AF_INET,AF_INET6, AF_UNIX]
SOCK_STREAM, //Type [SOCK_STREAM, SOCK_DGRAM,
// SOCK_SEQPACKET, SOCK_RAW]
IPPROTO_TCP //Protocol [IPPROTO_TCP, IPPROTO_SCTP,
// IPPROTO_UDP, IPPROTO_DCCP]
) //Return a FileDescriptor -1 = error
if socketFD == -1 {
print("Error creating BSD Socket")
return
}

var hints = addrinfo(
ai_flags: AI_PASSIVE, // Assign the address of the local host to the
// socket structures
ai_family: AF_UNSPEC, // Either IPv4 or IPv6
ai_socktype: SOCK_STREAM,// TCP
ai_protocol: 0,
ai_addrlen: 0,
ai_canonname: nil,
ai_addr: nil,
ai_next: nil)

var servinfo: UnsafeMutablePointer<addrinfo>? = nil
let addrInfoResult = getaddrinfo(
nil, // Any interface
servicePort, // The port on which will be listenend
&hints, // Protocol configuration as per above
&servinfo)

if addrInfoResult != 0 {
print("Error getting address info: \(errno)")
return
}
setsockopt(socketFD,SOL_SOCKET,SO_REUSEADDR,servinfo!.pointee.ai_addr, socklen_t(servinfo!.pointee.ai_addrlen))
let bindResult = bind(socketFD, servinfo!.pointee.ai_addr, socklen_t(servinfo!.pointee.ai_addrlen))

if bindResult == -1 {
print("Error binding socket to Address: \(errno)")
return
}

let listenResult = listen(socketFD, //Socket File descriptor
8 // adequate
// The backlog argument defines the
// maximum length the queue of pending
// connections may grow to
)

let flags = fcntl(socketFD,F_GETFL)
let _ = fcntl(socketFD,F_SETFL,flags | O_NONBLOCK)

let sockKqueue = kqueue()
if sockKqueue == -1 {
print("Error creating kqueue")
}
var sockKevent = kevent(
ident: UInt(socketFD),
filter: Int16(EVFILT_READ),
flags: UInt16(EV_ADD | EV_ENABLE),
fflags: 0,
data: 0,
udata: nil)
kevent(sockKqueue, &sockKevent, 1, nil, 0, nil)
var event = kevent()
if listenResult == -1 {
print("Error setting our socket to listen")
return
}
while (!ende!) {
var addr = sockaddr()
var addr_len :socklen_t = 0
while (!ende!) {
print("About to accept")
let status = kevent(sockKqueue, nil, 0, &event, 1, nil)
if status == 0 {
print("Timeout")
continue
} else if status > 0 {
if (event.flags & UInt16(EV_EOF)) == EV_EOF {
print("The socket (\(socketFD)) has been closed.")
continue
}
print("File descriptor: \(socketFD) - has \(event.data) characters for reading")
}
else {
print("Error reading kevent")
continue
}
let accFD = accept(socketFD, &addr, &addr_len)
if (accFD > 0){
print("Accepted new client with file descriptor: \(accFD)")
OSMemoryBarrier()
var val = bval!.pointee!.load(as:UInt8.self)
if( val == 1 || val == 2 || val == 3){ continue }
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:1,as: UInt8.self)
OSMemoryBarrier()
val = bval!.pointee!.load(as:UInt8.self)
if( val == 3 || val == 2 ){ continue }
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:2,as: UInt8.self)
OSMemoryBarrier()
val = bval!.pointee!.load(as:UInt8.self)
if(val == 3){ continue }
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:3,as: UInt8.self)
accarrFD!.append(accFD)
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:0,as:UInt8.self)
if (semacnt! < factor) {
let handle = Worker();
handle.start()
}
} else {
print("Error accepting connection")
}
usleep(1_000) // macOS tcp stack is not that good as Linux's
OSMemoryBarrier() /// barrier needed here
}
}
exit(EXIT_SUCCESS)
}


Click here to read the complete article
Re: Sum server, finished, better, without usleep [Swift]

<v4e7J.55915$nR3.21458@fx38.iad>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=111&group=comp.programming.threads#111

  copy link   Newsgroups: comp.programming.threads
Path: i2pn2.org!i2pn.org!aioe.org!feeder1.feed.usenet.farm!feed.usenet.farm!peer03.ams4!peer.am4.highwinds-media.com!peer01.iad!feed-me.highwinds-media.com!news.highwinds-media.com!fx38.iad.POSTED!not-for-mail
Newsgroups: comp.programming.threads
From: branimir.maksimovic@icloud.com (Branimir Maksimovic)
Subject: Re: Sum server, finished, better, without usleep [Swift]
References: <icn6J.5878$2m1.2082@fx26.iad> <Prv6J.32274$dI3.27972@fx10.iad>
<RAO6J.64731$jm6.37037@fx07.iad> <9C17J.56040$md6.7378@fx36.iad>
<TF47J.12145$fZ.741@fx06.iad> <C887J.146543$rl3.124179@fx45.iad>
User-Agent: slrn/1.0.3 (Darwin)
Lines: 315
Message-ID: <v4e7J.55915$nR3.21458@fx38.iad>
X-Complaints-To: abuse@usenet-news.net
NNTP-Posting-Date: Wed, 06 Oct 2021 09:34:19 UTC
Organization: usenet-news.net
Date: Wed, 06 Oct 2021 09:34:19 GMT
X-Received-Bytes: 11468
 by: Branimir Maksimovic - Wed, 6 Oct 2021 09:34 UTC

On 2021-10-06, Branimir Maksimovic <branimir.maksimovic@icloud.com> wrote:
import Foundation
signal(SIGPIPE,SIG_IGN)
let s = Server();
s.start()
var factor = 4
var bval:UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil
var ende:Bool? = nil
var semacnt:Int? = nil
var accarrFD:[Int32]? = nil
class Server {
init() {
let task = Process()
task.executableURL = URL(fileURLWithPath: "/usr/sbin/sysctl")
task.arguments = ["hw.ncpu"]
let out = Pipe()
task.standardOutput = out
let res: ()? = try? task.run()
if let _ = res {
let outputData = out.fileHandleForReading.readDataToEndOfFile()
let s = String(decoding: outputData, as: UTF8.self)
print("got from sysctl ",s)
let sep = CharacterSet(charactersIn: " \n")
let components = s.components(separatedBy: sep)
factor = Int(components[1]) ?? 4
}
if (CommandLine.argc > 1) {
tmpSvcPort = Int(CommandLine.arguments[1]) ?? 0
if (tmpSvcPort > 0){ servicePort = String(tmpSvcPort) }
}
semacnt! = 0
ende! = false
accarrFD! = Array(repeating:Int32(0),count:0)
bval = UnsafeMutablePointer.allocate(capacity:1)
bval!.pointee = UnsafeMutableRawPointer.allocate(byteCount:1,alignment:1)
print("assigning")
bval!.pointee!.storeBytes(of:0,as: UInt8.self)
print("assigned")
}
deinit {
bval!.pointee!.deallocate()
bval!.deallocate()
}
var tmpSvcPort: Int = 0
var servicePort = "1234"
class Worker:Thread{
override init(){
super.init()
semacnt! += 1
}
deinit {
semacnt! -= 1
}
override func main(){
let MTU = 65536
let buffer = UnsafeMutablePointer<CChar>.allocate(capacity:MTU)
defer {
buffer.deallocate()
}
while(true){
/***
* interrestingly CAS doesn't work, because of
* some weird Apple memory scheme.
* OSAtomicCompareAndSwapPtr: doesn't work
*/
var val:UInt8 = 0
repeat {
usleep(1)
OSMemoryBarrier()
val = bval!.pointee!.load(as:UInt8.self)
}while ( val == 1 || val == 2)
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:1,as: UInt8.self)
repeat {
usleep(1)
OSMemoryBarrier()
val = bval!.pointee!.load(as:UInt8.self)
}while ( val == 2)
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:2,as: UInt8.self)
print("acquired")
var oneFD = Array(repeating:Int32(0),count:0)
var acqCount = 0
while (!accarrFD!.isEmpty && acqCount < factor*4){
/// collect rest of fds
acqCount += 1
oneFD.append(accarrFD![accarrFD!.count-1])
accarrFD!.remove(at:accarrFD!.count-1)
}
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:0,as: UInt8.self)
print("releazed\n")
let toproc = oneFD
for fd in toproc{
let flags = fcntl(fd,F_GETFL)
let _ = fcntl(fd,F_SETFL,flags | O_NONBLOCK)

let sockKqueue = kqueue()
if sockKqueue == -1 {
print("Error creating kqueue")
}

defer {close(fd);close(sockKqueue)}
var sockKevent = kevent(
ident: UInt(fd),
filter: Int16(EVFILT_READ),
flags: UInt16(EV_ADD | EV_ENABLE),
fflags: 0,
data: 0,
udata: nil)
kevent(sockKqueue, &sockKevent, 1, nil, 0, nil)
var event = kevent()
let status = kevent(sockKqueue, nil, 0, &event, 1, nil)
if status == 0 {
print("Timeout")
continue
} else if status > 0 {
if (event.flags & UInt16(EV_EOF)) == EV_EOF {
print("The socket (\(fd)) has been closed.")
continue
}
print("File descriptor: \(fd) - has \(event.data) characters for reading")
}
else {
print("Error reading kevent")
continue
}
let readResult = read(fd, buffer, MTU)

if (readResult == 0) {
continue; // end of file
} else if (readResult == -1) {
print("Error reading form client(\(fd)) - \(errno)")
continue; // error
} else {
let strResult =
String(cString: buffer)
let cset = CharacterSet(charactersIn: " \r\n")
let numbers = strResult.components(separatedBy: cset)
var sum = 0
if numbers.count > 1 {
if numbers[0].lowercased() == "quit" {
ende! = true
continue
} else {
let num1 = Int(numbers[0]) ?? 0
let num2 = Int(numbers[1]) ?? 0
sum = num1 + num2
}
}
print("Received form client(\(fd)): \(strResult)")
let out = String(format:"suma %d\n",sum)
let _ = out.withCString {
var sockKevent = kevent(
ident: UInt(fd),
filter: Int16(EVFILT_WRITE),
flags: UInt16(EV_ADD | EV_ENABLE),
fflags: 0,
data: 0,
udata: nil)
kevent(sockKqueue, &sockKevent, 1, nil, 0, nil)
var event = kevent()
let status = kevent(sockKqueue, nil, 0, &event, 1, nil)
if status == 0 {
print("Timeout")
} else if status > 0 {
if (event.flags & UInt16(EV_EOF)) == EV_EOF {
print("The socket (\(fd)) has been closed.")
}
print("File descriptor: \(fd) - can write")
write(fd, $0, out.count)
}
else {
print("Error reading kevent")
}
}
}
}
}
}
}
func start() {
print("Server starting...")

let socketFD = socket(AF_INET6, //Domain [AF_INET,AF_INET6, AF_UNIX]
SOCK_STREAM, //Type [SOCK_STREAM, SOCK_DGRAM,
// SOCK_SEQPACKET, SOCK_RAW]
IPPROTO_TCP //Protocol [IPPROTO_TCP, IPPROTO_SCTP,
// IPPROTO_UDP, IPPROTO_DCCP]
) //Return a FileDescriptor -1 = error
if socketFD == -1 {
print("Error creating BSD Socket")
return
}

var hints = addrinfo(
ai_flags: AI_PASSIVE, // Assign the address of the local host to the
// socket structures
ai_family: AF_UNSPEC, // Either IPv4 or IPv6
ai_socktype: SOCK_STREAM,// TCP
ai_protocol: 0,
ai_addrlen: 0,
ai_canonname: nil,
ai_addr: nil,
ai_next: nil)

var servinfo: UnsafeMutablePointer<addrinfo>? = nil
let addrInfoResult = getaddrinfo(
nil, // Any interface
servicePort, // The port on which will be listenend
&hints, // Protocol configuration as per above
&servinfo)

if addrInfoResult != 0 {
print("Error getting address info: \(errno)")
return
}
setsockopt(socketFD,SOL_SOCKET,SO_REUSEADDR,servinfo!.pointee.ai_addr, socklen_t(servinfo!.pointee.ai_addrlen))
let bindResult = bind(socketFD, servinfo!.pointee.ai_addr, socklen_t(servinfo!.pointee.ai_addrlen))

if bindResult == -1 {
print("Error binding socket to Address: \(errno)")
return
}

let listenResult = listen(socketFD, //Socket File descriptor
8 // adequate
// The backlog argument defines the
// maximum length the queue of pending
// connections may grow to
)

let flags = fcntl(socketFD,F_GETFL)
let _ = fcntl(socketFD,F_SETFL,flags | O_NONBLOCK)

let sockKqueue = kqueue()
if sockKqueue == -1 {
print("Error creating kqueue")
}
var sockKevent = kevent(
ident: UInt(socketFD),
filter: Int16(EVFILT_READ),
flags: UInt16(EV_ADD | EV_ENABLE),
fflags: 0,
data: 0,
udata: nil)
kevent(sockKqueue, &sockKevent, 1, nil, 0, nil)
var event = kevent()
if listenResult == -1 {
print("Error setting our socket to listen")
return
}
while (!ende!) {
var addr = sockaddr()
var addr_len :socklen_t = 0
while (!ende!) {
print("About to accept")
let status = kevent(sockKqueue, nil, 0, &event, 1, nil)
if status == 0 {
print("Timeout")
continue
} else if status > 0 {
if (event.flags & UInt16(EV_EOF)) == EV_EOF {
print("The socket (\(socketFD)) has been closed.")
continue
}
print("File descriptor: \(socketFD) - has \(event.data) characters for reading")
}
else {
print("Error reading kevent")
continue
}
let accFD = accept(socketFD, &addr, &addr_len)
if (accFD > 0){
print("Accepted new client with file descriptor: \(accFD)")
var val:UInt8 = 0
repeat {
usleep(1)
OSMemoryBarrier()
val = bval!.pointee!.load(as:UInt8.self)
}while ( val == 1 || val == 2)
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:1,as: UInt8.self)
repeat {
usleep(1)
OSMemoryBarrier()
val = bval!.pointee!.load(as:UInt8.self)
}while ( val == 2)
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:2,as: UInt8.self)
accarrFD!.append(accFD)
OSMemoryBarrier()
bval!.pointee!.storeBytes(of:0,as:UInt8.self)
if (semacnt! < factor) {
let handle = Worker();
handle.start()
}
} else {
print("Error accepting connection")
}
OSMemoryBarrier() /// barrier needed here
}
}
exit(EXIT_SUCCESS)
}


Click here to read the complete article
Re: Sum server, finished, better, without usleep [Swift]

<SFk7J.64982$6U3.4781@fx43.iad>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=114&group=comp.programming.threads#114

  copy link   Newsgroups: comp.programming.threads
Path: i2pn2.org!i2pn.org!weretis.net!feeder6.news.weretis.net!news.misty.com!border2.nntp.dca1.giganews.com!nntp.giganews.com!peer03.iad!feed-me.highwinds-media.com!news.highwinds-media.com!fx43.iad.POSTED!not-for-mail
Newsgroups: comp.programming.threads
From: branimir.maksimovic@icloud.com (Branimir Maksimovic)
Subject: Re: Sum server, finished, better, without usleep [Swift]
References: <icn6J.5878$2m1.2082@fx26.iad> <Prv6J.32274$dI3.27972@fx10.iad>
<RAO6J.64731$jm6.37037@fx07.iad> <9C17J.56040$md6.7378@fx36.iad>
<TF47J.12145$fZ.741@fx06.iad> <C887J.146543$rl3.124179@fx45.iad>
<v4e7J.55915$nR3.21458@fx38.iad>
User-Agent: slrn/1.0.3 (Darwin)
Lines: 39
Message-ID: <SFk7J.64982$6U3.4781@fx43.iad>
X-Complaints-To: abuse@usenet-news.net
NNTP-Posting-Date: Wed, 06 Oct 2021 17:03:46 UTC
Organization: usenet-news.net
Date: Wed, 06 Oct 2021 17:03:46 GMT
X-Received-Bytes: 1855
X-Original-Bytes: 1804
 by: Branimir Maksimovic - Wed, 6 Oct 2021 17:03 UTC

On 2021-10-06, Branimir Maksimovic <branimir.maksimovic@icloud.com> wrote:
> while(true){
usleep(1000) // better not to overheat :P

> /***
> * interrestingly CAS doesn't work, because of
> * some weird Apple memory scheme.
> * OSAtomicCompareAndSwapPtr: doesn't work
> */
> var val:UInt8 = 0
> repeat {
> usleep(1)
> OSMemoryBarrier()
> val = bval!.pointee!.load(as:UInt8.self)
> }while ( val == 1 || val == 2)
> OSMemoryBarrier()
> bval!.pointee!.storeBytes(of:1,as: UInt8.self)
> repeat {
> usleep(1)
> OSMemoryBarrier()
> val = bval!.pointee!.load(as:UInt8.self)
> }while ( val == 2)
> OSMemoryBarrier()
> bval!.pointee!.storeBytes(of:2,as: UInt8.self)
> print("acquired")
/// payloAD HERE
> OSMemoryBarrier()
> bval!.pointee!.storeBytes(of:0,as: UInt8.self)
> print("releazed\n")
>
>

--

7-77-777
Evil Sinner!
to weak you should be meek, and you should brainfuck stronger
https://github.com/rofl0r/chaos-pp


devel / comp.programming.threads / Sum server [Swift]

1
server_pubkey.txt

rocksolid light 0.9.81
clearnet tor