[Mono-devel-list] TLS: normal versus __thread

Michael Rasmussen mir at miras.org
Thu Mar 24 11:41:23 EST 2005


tor, 24 03 2005 kl. 17:25 +0100, skrev Zoltan Varga:

> No, its just an optimization.
> 
Maybe, but it seems to be the only difference in the runtime
environments between a working solution with fork.

You are welcome to try this small code snippet:

// project created on 21-03-2005 at 15:16
using System;
using System.Net.Sockets;
using System.IO;
using Mono.Posix;

namespace TCPSocketServer
{

	public class Server
	{
		private StreamWriter streamWriter;
		private StreamReader streamReader;
		
		public Server(int port)
		{
			System.Int32 pid, sid;
	
			pid = Syscall.fork();
			if (pid < 0) {
	    		Syscall.exit(1);
			}
			/* If we got a good PID, then
	   		   we can exit the parent process. */
			if (pid > 0) {
				Console.WriteLine("Parent: Signing off!");
				Console.WriteLine("Parent PID: " + pid);
	    		Syscall.exit(0);
			}
			/* Create a new SID for the child process */
			sid = Syscall.setsid();
			if (sid < 0) {
				Console.WriteLine("Could not get a pid for child");
	    		Syscall.exit(1);
			}
			Console.WriteLine("Client running as deamon with pid " + sid);
			CreateSocket(port);
			if (!StartServer()) {
				Console.WriteLine("Unable to start server");
				Syscall.exit(1);
			}
		}
		
		public static void Main(string[] args)
		{
			int port;
			
			if (args.Length > 0)
				port = Convert.ToInt32(args[0]);  
			else
				port = 1234;
			new Server(port);
		}

		private bool CreateSocket(int port)
		{
			TcpListener tcpListener = new TcpListener(port);
			tcpListener.Start();
			Console.WriteLine("Server started");
			Socket socket = tcpListener.AcceptSocket();
			
			try
			{
				if (socket.Connected) {
					Console.WriteLine("Client connected");
					NetworkStream networkStream = new NetworkStream(socket);
					streamWriter = new StreamWriter(networkStream);
					streamReader = new StreamReader(networkStream);
				}
			}
			catch (Exception e)
			{
				Console.WriteLine(e.StackTrace);
				return false;
			}
			return true;
		}
		
		private bool StartServer()
		{
			while (true) {
				string input = streamReader.ReadLine();
				Console.WriteLine("Client: " + input);
				streamWriter.WriteLine("Hi dude. You sent this:\n" + input);
				streamWriter.Flush();
			}
		}		
	}
}

Hilsen/Regards
Michael Rasmussen

Get my public GnuPG keys:
michael  rasmussen  cc
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xD3C9A00E
mir  datanom  net
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE501F51C
mir  miras  org
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917
--------------------------------------------------------------
Debian Hint #25: If you would like to thank a maintainer for handling an
issue, check out reportbug --kudos.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Dette er en digitalt underskrevet brevdel
Url : http://lists.ximian.com/pipermail/mono-devel-list/attachments/20050324/16849ad7/attachment.bin 


More information about the Mono-devel-list mailing list