patches/evolution-data-server-03-mail-rlimit.diff
author dcarbery
Fri, 24 Nov 2006 16:37:59 +0000
branch217update
changeset 19096 d542fc2c823e
parent 8398 b983e1f7b702
permissions -rw-r--r--
Merged trunk changes r9797:9829 into 217update branch.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8398
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
     1
Index: libedataserver/e-msgport.c
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
     2
===================================================================
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
     3
RCS file: /cvs/gnome/evolution-data-server/libedataserver/e-msgport.c,v
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
     4
retrieving revision 1.10
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
     5
diff -u -p -r1.10 e-msgport.c
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
     6
--- libedataserver/e-msgport.c	26 Jul 2006 18:12:08 -0000	1.10
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
     7
+++ libedataserver/e-msgport.c	21 Sep 2006 16:49:41 -0000
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
     8
@@ -486,29 +486,19 @@ em_cache_clear(EMCache *emc)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
     9
 }
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    10
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    11
 struct _EMsgPort {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    12
-	EDList queue;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    13
-	int condwait;		/* how many waiting in condwait */
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    14
-	union {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    15
-		int pipe[2];	/* On Win32 actually a pair of SOCKETs */
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    16
-		struct {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    17
-			int read;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    18
-			int write;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    19
-		} fd;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    20
-	} pipe;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    21
+	GAsyncQueue *queue;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    22
+	EMsg *cache;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    23
+	gint pipe[2];  /* on Win32, actually a pair of SOCKETs */
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    24
 #ifdef HAVE_NSS
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    25
-	union {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    26
-		PRFileDesc *pipe[2];
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    27
-		struct {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    28
-			PRFileDesc *read;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    29
-			PRFileDesc *write;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    30
-		} fd;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    31
-	} prpipe;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    32
-#endif
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    33
-	/* @#@$#$ glib stuff */
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    34
-	GCond *cond;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    35
-	GMutex *lock;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    36
+	PRFileDesc *prpipe[2];
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    37
+#endif
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    38
 };
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    39
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    40
+/* message flags */
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    41
+enum {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    42
+	MSG_FLAG_SYNC_WITH_PIPE    = 1 << 0,
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    43
+	MSG_FLAG_SYNC_WITH_PR_PIPE = 1 << 1
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    44
+};
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    45
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    46
 #ifdef HAVE_NSS
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    47
 static int
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    48
@@ -529,189 +519,237 @@ e_prpipe (PRFileDesc **fds)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    49
 }
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    50
 #endif
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    51
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    52
-EMsgPort *e_msgport_new(void)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    53
+static void
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    54
+msgport_sync_with_pipe (gint fd)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    55
+{
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    56
+	gchar buffer[1];
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    57
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    58
+	while (fd >= 0) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    59
+		if (E_READ (fd, buffer, 1) > 0)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    60
+			break;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    61
+		else if (!E_IS_STATUS_INTR ()) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    62
+			g_warning ("%s: Failed to read from pipe: %s",
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    63
+				G_STRFUNC, g_strerror (errno));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    64
+			break;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    65
+		}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    66
+	}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    67
+}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    68
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    69
+#ifdef HAVE_NSS
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    70
+static void
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    71
+msgport_sync_with_prpipe (PRFileDesc *prfd)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    72
+{
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    73
+	gchar buffer[1];
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    74
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    75
+	while (prfd != NULL) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    76
+		if (PR_Read (prfd, buffer, 1) > 0)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    77
+			break;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    78
+		else if (PR_GetError () != PR_PENDING_INTERRUPT_ERROR) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    79
+			gchar *text = g_alloca (PR_GetErrorTextLength ());
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    80
+			PR_GetErrorText (text);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    81
+			g_warning ("%s: Failed to read from NSPR pipe: %s",
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    82
+				G_STRFUNC, text);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    83
+			break;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    84
+		}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    85
+	}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    86
+}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    87
+#endif
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    88
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    89
+EMsgPort *
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    90
+e_msgport_new (void)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    91
 {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    92
-	EMsgPort *mp;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    93
+	EMsgPort *msgport;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    94
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    95
-	mp = g_malloc(sizeof(*mp));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    96
-	e_dlist_init(&mp->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    97
-	mp->lock = g_mutex_new();
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    98
-	mp->cond = g_cond_new();
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
    99
-	e_pipe (mp->pipe.pipe);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   100
+	msgport = g_slice_new (EMsgPort);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   101
+	msgport->queue = g_async_queue_new ();
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   102
+	msgport->cache = NULL;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   103
+	msgport->pipe[0] = -1;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   104
+	msgport->pipe[1] = -1;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   105
 #ifdef HAVE_NSS
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   106
-	e_prpipe (mp->prpipe.pipe);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   107
+	msgport->prpipe[0] = NULL;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   108
+	msgport->prpipe[1] = NULL;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   109
 #endif
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   110
-	mp->condwait = 0;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   111
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   112
-	return mp;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   113
+	return msgport;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   114
 }
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   115
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   116
-void e_msgport_destroy(EMsgPort *mp)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   117
+void
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   118
+e_msgport_destroy (EMsgPort *msgport)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   119
 {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   120
-	g_mutex_free(mp->lock);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   121
-	g_cond_free(mp->cond);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   122
-	if (mp->pipe.fd.read != -1) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   123
-		E_CLOSE(mp->pipe.fd.read);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   124
-		E_CLOSE(mp->pipe.fd.write);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   125
+	g_return_if_fail (msgport != NULL);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   126
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   127
+	if (msgport->pipe[0] >= 0) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   128
+		E_CLOSE (msgport->pipe[0]);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   129
+		E_CLOSE (msgport->pipe[1]);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   130
 	}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   131
 #ifdef HAVE_NSS
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   132
-	if (mp->prpipe.fd.read) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   133
-		PR_Close(mp->prpipe.fd.read);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   134
-		PR_Close(mp->prpipe.fd.write);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   135
+	if (msgport->prpipe[0] != NULL) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   136
+		PR_Close (msgport->prpipe[0]);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   137
+		PR_Close (msgport->prpipe[1]);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   138
 	}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   139
 #endif
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   140
-	g_free(mp);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   141
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   142
+	g_async_queue_unref (msgport->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   143
+	g_slice_free (EMsgPort, msgport);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   144
 }
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   145
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   146
-/* get a fd that can be used to wait on the port asynchronously */
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   147
-int e_msgport_fd(EMsgPort *mp)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   148
+int
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   149
+e_msgport_fd (EMsgPort *msgport)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   150
 {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   151
-	return mp->pipe.fd.read;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   152
+	gint fd;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   153
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   154
+	g_return_val_if_fail (msgport != NULL, -1);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   155
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   156
+	g_async_queue_lock (msgport->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   157
+	fd = msgport->pipe[0];
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   158
+	if (fd < 0 && e_pipe (msgport->pipe) == 0)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   159
+		fd = msgport->pipe[0];
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   160
+	g_async_queue_unlock (msgport->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   161
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   162
+	return fd;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   163
 }
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   164
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   165
 #ifdef HAVE_NSS
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   166
-PRFileDesc *e_msgport_prfd(EMsgPort *mp)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   167
+PRFileDesc *
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   168
+e_msgport_prfd (EMsgPort *msgport)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   169
 {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   170
-	return mp->prpipe.fd.read;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   171
+	PRFileDesc *prfd;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   172
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   173
+	g_return_val_if_fail (msgport != NULL, NULL);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   174
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   175
+	g_async_queue_lock (msgport->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   176
+	prfd = msgport->prpipe[0];
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   177
+	if (prfd == NULL && e_prpipe (msgport->prpipe) == 0)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   178
+		prfd = msgport->prpipe[0];
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   179
+	g_async_queue_unlock (msgport->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   180
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   181
+	return prfd;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   182
 }
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   183
 #endif
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   184
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   185
-void e_msgport_put(EMsgPort *mp, EMsg *msg)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   186
+void
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   187
+e_msgport_put (EMsgPort *msgport, EMsg *msg)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   188
 {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   189
+	gint fd;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   190
 #ifdef HAVE_NSS
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   191
 	PRFileDesc *prfd;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   192
 #endif
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   193
-	ssize_t w;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   194
-	int fd;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   195
-	
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   196
-	m(printf("put:\n"));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   197
-	g_mutex_lock(mp->lock);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   198
-	e_dlist_addtail(&mp->queue, &msg->ln);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   199
-	if (mp->condwait > 0) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   200
-		m(printf("put: condwait > 0, waking up\n"));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   201
-		g_cond_signal(mp->cond);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   202
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   203
+	g_return_if_fail (msgport != NULL);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   204
+	g_return_if_fail (msg != NULL);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   205
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   206
+	g_async_queue_lock (msgport->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   207
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   208
+	msg->flags = 0;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   209
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   210
+	fd = msgport->pipe[1];
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   211
+	while (fd >= 0) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   212
+		if (E_WRITE (fd, "E", 1) > 0) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   213
+			msg->flags |= MSG_FLAG_SYNC_WITH_PIPE;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   214
+			break;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   215
+		} else if (!E_IS_STATUS_INTR ()) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   216
+			g_warning ("%s: Failed to write to pipe: %s",
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   217
+				G_STRFUNC, g_strerror (errno));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   218
+			break;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   219
+		}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   220
 	}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   221
-	
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   222
-	fd = mp->pipe.fd.write;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   223
-#ifdef HAVE_NSS
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   224
-	prfd = mp->prpipe.fd.write;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   225
-#endif
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   226
-	g_mutex_unlock(mp->lock);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   227
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   228
 #ifdef HAVE_NSS
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   229
-	if (prfd != NULL) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   230
-		m(printf("put: have pr pipe, writing notification to it\n"));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   231
-		do {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   232
-			w = PR_Write (prfd, "E", 1);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   233
-		} while (w == -1 && PR_GetError () == PR_PENDING_INTERRUPT_ERROR);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   234
+	prfd = msgport->prpipe[1];
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   235
+	while (prfd != NULL) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   236
+		if (PR_Write (prfd, "E", 1) > 0) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   237
+			msg->flags |= MSG_FLAG_SYNC_WITH_PR_PIPE;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   238
+			break;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   239
+		} else if (PR_GetError () != PR_PENDING_INTERRUPT_ERROR) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   240
+			gchar *text = g_alloca (PR_GetErrorTextLength ());
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   241
+			PR_GetErrorText (text);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   242
+			g_warning ("%s: Failed to write to NSPR pipe: %s",
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   243
+				G_STRFUNC, text);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   244
+			break;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   245
+		}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   246
 	}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   247
 #endif
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   248
-	if (fd != -1) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   249
-		m(printf("put: have pipe, writing notification to it\n"));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   250
-		do {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   251
-			w = E_WRITE (fd, "E", 1);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   252
-		} while (w == -1 && E_IS_STATUS_INTR ());
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   253
-	}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   254
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   255
-	m(printf("put: done\n"));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   256
+	g_async_queue_push_unlocked (msgport->queue, msg);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   257
+	g_async_queue_unlock (msgport->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   258
 }
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   259
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   260
-static void
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   261
-msgport_cleanlock(void *data)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   262
+EMsg *
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   263
+e_msgport_wait (EMsgPort *msgport)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   264
 {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   265
-	EMsgPort *mp = data;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   266
+	EMsg *msg;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   267
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   268
-	g_mutex_unlock(mp->lock);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   269
-}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   270
+	g_return_val_if_fail (msgport != NULL, NULL);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   271
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   272
-EMsg *e_msgport_wait(EMsgPort *mp)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   273
-{
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   274
-	EMsg *msg;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   275
+	g_async_queue_lock (msgport->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   276
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   277
-	m(printf("wait:\n"));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   278
-	g_mutex_lock(mp->lock);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   279
-	while (e_dlist_empty(&mp->queue)) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   280
-		if (mp->pipe.fd.read != -1) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   281
-			fd_set rfds;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   282
-			int retry;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   283
-
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   284
-			m(printf("wait: waiting on pipe\n"));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   285
-			g_mutex_unlock(mp->lock);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   286
-			do {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   287
-				FD_ZERO(&rfds);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   288
-				FD_SET(mp->pipe.fd.read, &rfds);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   289
-				retry = E_IS_SOCKET_ERROR(select(mp->pipe.fd.read+1, &rfds, NULL, NULL, NULL)) && E_IS_STATUS_INTR();
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   290
-				pthread_testcancel();
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   291
-			} while (retry);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   292
-			g_mutex_lock(mp->lock);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   293
-			m(printf("wait: got pipe\n"));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   294
-#ifdef HAVE_NSS
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   295
-		} else if (mp->prpipe.fd.read != NULL) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   296
-			PRPollDesc rfds[1];
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   297
-			int retry;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   298
-
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   299
-			m(printf("wait: waitng on pr pipe\n"));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   300
-			g_mutex_unlock(mp->lock);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   301
-			do {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   302
-				rfds[0].fd = mp->prpipe.fd.read;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   303
-				rfds[0].in_flags = PR_POLL_READ|PR_POLL_ERR;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   304
-				retry = PR_Poll(rfds, 1, PR_INTERVAL_NO_TIMEOUT) == -1 && PR_GetError() == PR_PENDING_INTERRUPT_ERROR;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   305
-				pthread_testcancel();
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   306
-			} while (retry);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   307
-			g_mutex_lock(mp->lock);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   308
-			m(printf("wait: got pr pipe\n"));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   309
-#endif /* HAVE_NSS */
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   310
-		} else {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   311
-			m(printf("wait: waiting on condition\n"));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   312
-			mp->condwait++;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   313
-			/* if we are cancelled in the cond-wait, then we need to unlock our lock when we cleanup */
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   314
-			pthread_cleanup_push(msgport_cleanlock, mp);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   315
-			g_cond_wait(mp->cond, mp->lock);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   316
-			pthread_cleanup_pop(0);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   317
-			m(printf("wait: got condition\n"));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   318
-			mp->condwait--;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   319
-		}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   320
+	/* check the cache first */
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   321
+	if (msgport->cache != NULL) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   322
+		msg = msgport->cache;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   323
+		/* don't clear the cache */
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   324
+		g_async_queue_unlock (msgport->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   325
+		return msg;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   326
 	}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   327
-	msg = (EMsg *)mp->queue.head;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   328
-	m(printf("wait: message = %p\n", msg));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   329
-	g_mutex_unlock(mp->lock);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   330
-	m(printf("wait: done\n"));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   331
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   332
+	msg = g_async_queue_pop_unlocked (msgport->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   333
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   334
+	g_assert (msg != NULL);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   335
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   336
+	/* The message is not actually "removed" from the EMsgPort until
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   337
+ 	 * e_msgport_get() is called.  So we cache the popped message. */
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   338
+	msgport->cache = msg;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   339
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   340
+	if (msg->flags & MSG_FLAG_SYNC_WITH_PIPE)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   341
+		msgport_sync_with_pipe (msgport->pipe[0]);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   342
+#ifdef HAVE_NSS
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   343
+	if (msg->flags & MSG_FLAG_SYNC_WITH_PR_PIPE)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   344
+		msgport_sync_with_prpipe (msgport->prpipe[0]);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   345
+#endif
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   346
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   347
+	g_async_queue_unlock (msgport->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   348
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   349
 	return msg;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   350
 }
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   351
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   352
-EMsg *e_msgport_get(EMsgPort *mp)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   353
+EMsg *
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   354
+e_msgport_get (EMsgPort *msgport)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   355
 {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   356
 	EMsg *msg;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   357
-	char dummy[1];
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   358
-	ssize_t n;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   359
-	
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   360
-	g_mutex_lock(mp->lock);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   361
-	msg = (EMsg *)e_dlist_remhead(&mp->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   362
-	if (msg) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   363
-		if (mp->pipe.fd.read != -1) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   364
-			do {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   365
-				n = E_READ (mp->pipe.fd.read, dummy, 1);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   366
-			} while (n == -1 && E_IS_STATUS_INTR ());
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   367
-		}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   368
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   369
+	g_return_val_if_fail (msgport != NULL, NULL);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   370
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   371
+	g_async_queue_lock (msgport->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   372
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   373
+	/* check the cache first */
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   374
+	if (msgport->cache != NULL) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   375
+		msg = msgport->cache;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   376
+		msgport->cache = NULL;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   377
+		g_async_queue_unlock (msgport->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   378
+		return msg;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   379
+	}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   380
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   381
+	msg = g_async_queue_try_pop_unlocked (msgport->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   382
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   383
+	if (msg != NULL && msg->flags & MSG_FLAG_SYNC_WITH_PIPE)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   384
+		msgport_sync_with_pipe (msgport->pipe[0]);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   385
 #ifdef HAVE_NSS
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   386
-		if (mp->prpipe.fd.read != NULL) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   387
-			do {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   388
-				n = PR_Read (mp->prpipe.fd.read, dummy, 1);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   389
-			} while (n == -1 && PR_GetError () == PR_PENDING_INTERRUPT_ERROR);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   390
-		}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   391
+	if (msg != NULL && msg->flags & MSG_FLAG_SYNC_WITH_PR_PIPE)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   392
+		msgport_sync_with_prpipe (msgport->prpipe[0]);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   393
 #endif
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   394
-	}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   395
-	m(printf("get: message = %p\n", msg));
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   396
-	g_mutex_unlock(mp->lock);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   397
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   398
+	g_async_queue_unlock (msgport->queue);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   399
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   400
 	return msg;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   401
 }
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   402
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   403
-void e_msgport_reply(EMsg *msg)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   404
+void
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   405
+e_msgport_reply (EMsg *msg)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   406
 {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   407
-	if (msg->reply_port) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   408
-		e_msgport_put(msg->reply_port, msg);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   409
-	}
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   410
+	g_return_if_fail (msg != NULL);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   411
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   412
+	if (msg->reply_port)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   413
+		e_msgport_put (msg->reply_port, msg);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   414
+
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   415
 	/* else lost? */
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   416
 }
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   417
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   418
@@ -1099,7 +1137,7 @@ void e_thread_put(EThread *e, EMsg *msg)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   419
 	switch(e->type) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   420
 	case E_THREAD_QUEUE:
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   421
 		/* if the queue is full, lose this new addition */
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   422
-		if (e_dlist_length(&e->server_port->queue) < e->queue_limit) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   423
+		if (g_async_queue_length(e->server_port->queue) < e->queue_limit) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   424
 			e_msgport_put(e->server_port, msg);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   425
 		} else {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   426
 			printf("queue limit reached, dropping new message\n");
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   427
@@ -1108,7 +1146,7 @@ void e_thread_put(EThread *e, EMsg *msg)
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   428
 		break;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   429
 	case E_THREAD_DROP:
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   430
 		/* if the queue is full, lose the oldest (unprocessed) message */
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   431
-		if (e_dlist_length(&e->server_port->queue) < e->queue_limit) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   432
+		if (g_async_queue_length(e->server_port->queue) < e->queue_limit) {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   433
 			e_msgport_put(e->server_port, msg);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   434
 		} else {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   435
 			printf("queue limit reached, dropping old message\n");
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   436
Index: libedataserver/e-msgport.h
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   437
===================================================================
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   438
RCS file: /cvs/gnome/evolution-data-server/libedataserver/e-msgport.h,v
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   439
retrieving revision 1.3
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   440
diff -u -p -r1.3 e-msgport.h
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   441
--- libedataserver/e-msgport.h	3 Dec 2004 03:33:06 -0000	1.3
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   442
+++ libedataserver/e-msgport.h	21 Sep 2006 16:49:41 -0000
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   443
@@ -56,6 +56,7 @@ typedef struct _EMsgPort EMsgPort;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   444
 typedef struct _EMsg {
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   445
 	EDListNode ln;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   446
 	EMsgPort *reply_port;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   447
+	gint flags;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   448
 } EMsg;
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   449
 
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   450
 EMsgPort *e_msgport_new(void);
b983e1f7b702 2006-10-23 Irene Huang <[email protected]>
sh162551
parents:
diff changeset
   451