Changeset 218 for trunk/libtransmission/net.c
- Timestamp:
- Apr 8, 2006, 3:10:52 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libtransmission/net.c
r164 r218 67 67 tr_lock_t lock; 68 68 tr_thread_t thread; 69 int orphan; 69 70 }; 71 72 /* Hem, global variable. Initialized from tr_init(). */ 73 tr_lock_t gethostbynameLock; 70 74 71 75 static void resolveFunc( void * _r ) … … 75 79 76 80 tr_lockLock( &r->lock ); 81 77 82 r->addr.s_addr = inet_addr( r->address ); 78 83 if( r->addr.s_addr != 0xFFFFFFFF ) 79 84 { 85 /* This was an IP address, no resolving required */ 80 86 r->status = TR_RESOLVE_OK; 87 goto resolveDone; 88 } 89 90 tr_lockLock( &gethostbynameLock ); 91 tr_lockUnlock( &r->lock ); 92 host = gethostbyname( r->address ); 93 tr_lockLock( &r->lock ); 94 if( host ) 95 { 96 memcpy( &r->addr, host->h_addr, host->h_length ); 97 r->status = TR_RESOLVE_OK; 98 } 99 else 100 { 101 r->status = TR_RESOLVE_ERROR; 102 } 103 tr_lockUnlock( &gethostbynameLock ); 104 105 resolveDone: 106 if( r->orphan ) 107 { 108 /* tr_netResolveClose was closed already. Free memory */ 81 109 tr_lockUnlock( &r->lock ); 82 return; 83 } 84 tr_lockUnlock( &r->lock ); 85 86 if( !( host = gethostbyname( r->address ) ) ) 87 { 88 tr_lockLock( &r->lock ); 89 r->status = TR_RESOLVE_ERROR; 110 tr_lockClose( &r->lock ); 111 free( r ); 112 } 113 else 114 { 90 115 tr_lockUnlock( &r->lock ); 91 return; 92 } 93 tr_lockLock( &r->lock ); 94 memcpy( &r->addr, host->h_addr, host->h_length ); 95 r->status = TR_RESOLVE_OK; 96 tr_lockUnlock( &r->lock ); 116 } 97 117 } 98 118 … … 106 126 tr_lockInit( &r->lock ); 107 127 tr_threadCreate( &r->thread, resolveFunc, r ); 128 r->orphan = 0; 108 129 109 130 return r; … … 127 148 void tr_netResolveClose( tr_resolve_t * r ) 128 149 { 150 tr_lockLock( &r->lock ); 151 if( r->status == TR_RESOLVE_WAIT ) 152 { 153 /* Let the thread die */ 154 r->orphan = 1; 155 tr_lockUnlock( &r->lock ); 156 return; 157 } 158 tr_lockUnlock( &r->lock ); 159 160 /* Clean up */ 129 161 tr_threadJoin( &r->thread ); 130 162 tr_lockClose( &r->lock );
Note: See TracChangeset
for help on using the changeset viewer.