Procházet zdrojové kódy

DebugError: don't use a dead var, use a job to enforce destruction, allowing the destruction to be done from the handler's jobs (rather than just the handler)

ambrop7 před 15 roky
rodič
revize
481b171588

+ 1 - 1
client/PasswordSender.c

@@ -83,7 +83,7 @@ void PasswordSender_Init (PasswordSender *o, uint64_t password, int ssl, BSocket
     SinglePacketSender_Init(&o->sps, (uint8_t *)&o->password, sizeof(o->password), PacketStreamSender_GetInput(&o->pss), (SinglePacketSender_handler)sent_handler, o, BReactor_PendingGroup(reactor));
     
     DebugObject_Init(&o->d_obj);
-    DebugError_Init(&o->d_err);
+    DebugError_Init(&o->d_err, BReactor_PendingGroup(reactor));
 }
 
 void PasswordSender_Free (PasswordSender *o)

+ 1 - 1
flow/SinglePacketSender.c

@@ -55,7 +55,7 @@ void SinglePacketSender_Init (SinglePacketSender *o, uint8_t *packet, int packet
     PacketPassInterface_Sender_Send(o->output, packet, packet_len);
     
     DebugObject_Init(&o->d_obj);
-    DebugError_Init(&o->d_err);
+    DebugError_Init(&o->d_err, pg);
 }
 
 void SinglePacketSender_Free (SinglePacketSender *o)

+ 1 - 1
flow/StreamSocketSink.c

@@ -95,7 +95,7 @@ void StreamSocketSink_Init (StreamSocketSink *s, FlowErrorReporter rep, BSocket
     s->in_len = -1;
     
     DebugObject_Init(&s->d_obj);
-    DebugError_Init(&s->d_err);
+    DebugError_Init(&s->d_err, BReactor_PendingGroup(BSocket_Reactor(s->bsock)));
 }
 
 void StreamSocketSink_Free (StreamSocketSink *s)

+ 1 - 1
flow/StreamSocketSource.c

@@ -100,7 +100,7 @@ void StreamSocketSource_Init (StreamSocketSource *s, FlowErrorReporter rep, BSoc
     s->out_avail = -1;
     
     DebugObject_Init(&s->d_obj);
-    DebugError_Init(&s->d_err);
+    DebugError_Init(&s->d_err, BReactor_PendingGroup(BSocket_Reactor(s->bsock)));
 }
 
 void StreamSocketSource_Free (StreamSocketSource *s)

+ 2 - 2
ipc/BIPC.c

@@ -109,7 +109,7 @@ int BIPC_InitConnect (BIPC *o, const char *path, int send_mtu, PacketPassInterfa
     }
     
     DebugObject_Init(&o->d_obj);
-    DebugError_Init(&o->d_err);
+    DebugError_Init(&o->d_err, BReactor_PendingGroup(reactor));
     
     return 1;
     
@@ -142,7 +142,7 @@ int BIPC_InitAccept (BIPC *o, BIPCServer *server, int send_mtu, PacketPassInterf
     }
     
     DebugObject_Init(&o->d_obj);
-    DebugError_Init(&o->d_err);
+    DebugError_Init(&o->d_err, BReactor_PendingGroup(reactor));
     
     return 1;
     

+ 18 - 15
misc/debugerror.h

@@ -21,24 +21,22 @@
  * 
  * @section DESCRIPTION
  * 
- * Mechanism for ensuring an object is destroyed from inside an error handler.
+ * Mechanism for ensuring an object is destroyed from inside an error handler
+ * or its jobs.
  */
 
 #ifndef BADVPN_MISC_DEBUGERROR_H
 #define BADVPN_MISC_DEBUGERROR_H
 
-#include <misc/dead.h>
 #include <misc/debug.h>
+#include <system/BPending.h>
 
 #ifndef NDEBUG
     #define DEBUGERROR(de, call) \
         { \
-            ASSERT(!(de)->error) \
-            (de)->error = 1; \
-            DEAD_ENTER((de)->dead) \
+            ASSERT(!BPending_IsSet(&(de)->job)) \
+            BPending_Set(&(de)->job); \
             (call); \
-            ASSERT(DEAD_KILLED) \
-            DEAD_LEAVE((de)->dead); \
         }
 #else
     #define DEBUGERROR(de, call) { (call); }
@@ -46,34 +44,39 @@
 
 typedef struct {
     #ifndef NDEBUG
-    dead_t dead;
-    int error;
+    BPending job;
     #endif
 } DebugError;
 
-static void DebugError_Init (DebugError *o);
+static void DebugError_Init (DebugError *o, BPendingGroup *pg);
 static void DebugError_Free (DebugError *o);
 static void DebugError_AssertNoError (DebugError *o);
 
-void DebugError_Init (DebugError *o)
+#ifndef NDEBUG
+static void _DebugError_job_handler (DebugError *o)
+{
+    ASSERT(0);
+}
+#endif
+
+void DebugError_Init (DebugError *o, BPendingGroup *pg)
 {
     #ifndef NDEBUG
-    DEAD_INIT(o->dead);
-    o->error = 0;
+    BPending_Init(&o->job, pg, (BPending_handler)_DebugError_job_handler, o);
     #endif
 }
 
 void DebugError_Free (DebugError *o)
 {
     #ifndef NDEBUG
-    DEAD_KILL(o->dead);
+    BPending_Free(&o->job);
     #endif
 }
 
 void DebugError_AssertNoError (DebugError *o)
 {
     #ifndef NDEBUG
-    ASSERT(!o->error)
+    ASSERT(!BPending_IsSet(&o->job))
     #endif
 }
 

+ 1 - 1
ncd/NCDModule.c

@@ -94,7 +94,7 @@ int NCDModuleInst_Init (NCDModuleInst *n, const char *name, const struct NCDModu
     }
     
     DebugObject_Init(&n->d_obj);
-    DebugError_Init(&n->d_err);
+    DebugError_Init(&n->d_err, BReactor_PendingGroup(n->reactor));
     
     return 1;
     

+ 8 - 1
nspr_support/BPRFileDesc.c

@@ -223,7 +223,7 @@ void BPRFileDesc_Init (BPRFileDesc *obj, PRFileDesc *prfd)
     init_bottom(obj);
     
     // init job
-    BPending_Init(&obj->job, BReactor_PendingGroup(((BSocket *)obj->bottom->secret)->bsys), (BPending_handler)job_handler, obj);
+    BPending_Init(&obj->job, BReactor_PendingGroup(BSocket_Reactor((BSocket *)obj->bottom->secret)), (BPending_handler)job_handler, obj);
     
     DebugObject_Init(&obj->d_obj);
 }
@@ -318,3 +318,10 @@ void BPRFileDesc_DisableEvent (BPRFileDesc *obj, PRInt16 event)
         update_bottom(obj);
     }
 }
+
+BReactor * BPRFileDesc_Reactor (BPRFileDesc *obj)
+{
+    DebugObject_Access(&obj->d_obj);
+    
+    return BSocket_Reactor((BSocket *)obj->bottom->secret);
+}

+ 8 - 0
nspr_support/BPRFileDesc.h

@@ -132,4 +132,12 @@ void BPRFileDesc_EnableEvent (BPRFileDesc *obj, PRInt16 event);
  */
 void BPRFileDesc_DisableEvent (BPRFileDesc *obj, PRInt16 event);
 
+/**
+ * Returns the {@link BReactor} used by this object.
+ * 
+ * @param obj the object
+ * @return {@link BReactor} used by this object
+ */
+BReactor * BPRFileDesc_Reactor (BPRFileDesc *obj);
+
 #endif

+ 1 - 1
nspr_support/PRStreamSink.c

@@ -95,7 +95,7 @@ void PRStreamSink_Init (PRStreamSink *s, FlowErrorReporter rep, BPRFileDesc *bpr
     s->in_len = -1;
     
     DebugObject_Init(&s->d_obj);
-    DebugError_Init(&s->d_err);
+    DebugError_Init(&s->d_err, BReactor_PendingGroup(BPRFileDesc_Reactor(s->bprfd)));
 }
 
 void PRStreamSink_Free (PRStreamSink *s)

+ 1 - 1
nspr_support/PRStreamSource.c

@@ -100,7 +100,7 @@ void PRStreamSource_Init (PRStreamSource *s, FlowErrorReporter rep, BPRFileDesc
     s->out_avail = -1;
     
     DebugObject_Init(&s->d_obj);
-    DebugError_Init(&s->d_err);
+    DebugError_Init(&s->d_err, BReactor_PendingGroup(BPRFileDesc_Reactor(s->bprfd)));
 }
 
 void PRStreamSource_Free (PRStreamSource *s)

+ 1 - 1
server_connection/ServerConnection.c

@@ -530,7 +530,7 @@ int ServerConnection_Init (
     o->state = STATE_CONNECTING;
     
     DebugObject_Init(&o->d_obj);
-    DebugError_Init(&o->d_err);
+    DebugError_Init(&o->d_err, BReactor_PendingGroup(o->reactor));
     
     return 1;
     

+ 1 - 1
socksclient/BSocksClient.c

@@ -358,7 +358,7 @@ int BSocksClient_Init (BSocksClient *o, BAddr server_addr, BAddr dest_addr, BSoc
     o->state = STATE_CONNECTING;
     
     DebugObject_Init(&o->d_obj);
-    DebugError_Init(&o->d_err);
+    DebugError_Init(&o->d_err, BReactor_PendingGroup(o->reactor));
     
     return 1;
     

+ 1 - 1
system/BProcess.c

@@ -231,7 +231,7 @@ int BProcess_Init (BProcess *o, BProcessManager *m, BProcess_handler handler, vo
     LinkedList2_Append(&o->m->processes, &o->list_node);
     
     DebugObject_Init(&o->d_obj);
-    DebugError_Init(&o->d_err);
+    DebugError_Init(&o->d_err, BReactor_PendingGroup(m->reactor));
     
     return 1;
     

+ 7 - 0
system/BSocket.c

@@ -1520,4 +1520,11 @@ int BSocket_ConnectUnix (BSocket *bs, const char *path)
     return 0;
 }
 
+BReactor * BSocket_Reactor (BSocket *bs)
+{
+    DebugObject_Access(&bs->d_obj);
+    
+    return bs->bsys;
+}
+
 #endif

+ 8 - 0
system/BSocket.h

@@ -437,4 +437,12 @@ int BSocket_ConnectUnix (BSocket *bs, const char *path) WARN_UNUSED;
 
 #endif
 
+/**
+ * Returns the {@link BReactor} of this socket.
+ * 
+ * @param bs the object
+ * @return {@link BReactor} of this socket
+ */
+BReactor * BSocket_Reactor (BSocket *bs);
+
 #endif

+ 1 - 1
tuntap/BTap.c

@@ -646,7 +646,7 @@ success:
     o->output_packet = NULL;
     
     DebugObject_Init(&o->d_obj);
-    DebugError_Init(&o->d_err);
+    DebugError_Init(&o->d_err, BReactor_PendingGroup(o->reactor));
     
     return 1;
 }